blob: a3c87213bfec9b81529ae0ff7f0e62f36bae3744 [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/lsp_protocol/protocol.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/handlers.dart';
import 'package:analysis_server/src/lsp/registration/feature_registration.dart';
import 'package:analyzer/dart/analysis/results.dart';
typedef StaticOptions = DartTextDocumentContentProviderRegistrationOptions?;
class DartTextDocumentContentProviderHandler extends SharedMessageHandler<
DartTextDocumentContentParams, DartTextDocumentContent> {
DartTextDocumentContentProviderHandler(super.server);
@override
Method get handlesMessage => CustomMethods.dartTextDocumentContent;
@override
LspJsonHandler<DartTextDocumentContentParams> get jsonHandler =>
DartTextDocumentContentParams.jsonHandler;
@override
Future<ErrorOr<DartTextDocumentContent>> handle(
DartTextDocumentContentParams params,
MessageInfo message,
CancellationToken token) async {
var allowedSchemes = server.uriConverter.supportedNonFileSchemes;
var uri = params.uri;
if (!allowedSchemes.contains(uri.scheme)) {
var supportedSchemesString = allowedSchemes.isEmpty
? '(none)'
: allowedSchemes.map((scheme) => "'$scheme'").join(', ');
return error(
ErrorCodes.InvalidParams,
"Fetching content for scheme '${uri.scheme}' is not supported. "
'Supported schemes are $supportedSchemesString.',
);
}
return pathOfUri(uri).mapResult((filePath) async {
var file = server.getAnalysisDriver(filePath)?.getFileSync(filePath);
var content = file is FileResult ? file.content : null;
return success(DartTextDocumentContent(content: content));
});
}
}
class DartTextDocumentContentProviderRegistrations extends FeatureRegistration
with SingleDynamicRegistration, StaticRegistration<StaticOptions> {
@override
final DartTextDocumentContentProviderRegistrationOptions options;
DartTextDocumentContentProviderRegistrations(super.info)
: options = DartTextDocumentContentProviderRegistrationOptions(
schemes: info.customDartSchemes.toList());
@override
Method get registrationMethod => CustomMethods.dartTextDocumentContent;
@override
StaticOptions get staticOptions => options;
@override
bool get supportsDynamic => false;
@override
bool get supportsStatic => true;
}