Extract LSP initializationOptions into a class
Change-Id: I50402bb75f51a771931d9b5255b7b9207d0f316b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/104761
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Danny Tuppeny <dantup@google.com>
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index 5b104b8..1aa7293 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -21,25 +21,16 @@
ErrorOr<InitializeResult> handle(
InitializeParams params, CancellationToken token) {
- final openWorkspacePaths = <String>[];
+ server.handleClientConnection(
+ params.capabilities,
+ params.initializationOptions,
+ );
+ final openWorkspacePaths = <String>[];
// The onlyAnalyzeProjectsWithOpenFiles flag allows opening huge folders
// without setting them as analysis roots. Instead, analysis roots will be
// based only on the open files.
- final onlyAnalyzeProjectsWithOpenFiles = params.initializationOptions !=
- null
- ? params.initializationOptions['onlyAnalyzeProjectsWithOpenFiles'] ==
- true
- : false;
-
- // The suggestFromUnimportedLibraries flag allows clients to opt-out of
- // behaviour of including suggestions that are not imported. Defaults to true,
- // so must be explicitly passed as false to disable.
- final suggestFromUnimportedLibraries = params.initializationOptions ==
- null ||
- params.initializationOptions['suggestFromUnimportedLibraries'] != false;
-
- if (!onlyAnalyzeProjectsWithOpenFiles) {
+ if (!server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles) {
if (params.workspaceFolders != null) {
params.workspaceFolders.forEach((wf) {
openWorkspacePaths.add(Uri.parse(wf.uri).toFilePath());
@@ -56,12 +47,9 @@
}
}
- server.handleClientConnection(params.capabilities);
server.messageHandler = new InitializingStateMessageHandler(
server,
openWorkspacePaths,
- onlyAnalyzeProjectsWithOpenFiles,
- suggestFromUnimportedLibraries,
);
final codeActionLiteralSupport =
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
index 27cf61a..eeb698c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -11,12 +11,9 @@
class IntializedMessageHandler extends MessageHandler<InitializedParams, void> {
final List<String> openWorkspacePaths;
- final bool onlyAnalyzeProjectsWithOpenFiles, suggestFromUnimportedLibraries;
IntializedMessageHandler(
LspAnalysisServer server,
this.openWorkspacePaths,
- this.onlyAnalyzeProjectsWithOpenFiles,
- this.suggestFromUnimportedLibraries,
) : super(server);
Method get handlesMessage => Method.initialized;
@@ -27,13 +24,11 @@
ErrorOr<void> handle(InitializedParams params, CancellationToken token) {
server.messageHandler = new InitializedStateMessageHandler(
server,
- onlyAnalyzeProjectsWithOpenFiles,
- suggestFromUnimportedLibraries,
);
_performDynamicRegistration();
- if (!onlyAnalyzeProjectsWithOpenFiles) {
+ if (!server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles) {
server.setAnalysisRoots(openWorkspacePaths);
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index 3bcf9fd..a4302ba 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -51,8 +51,6 @@
class InitializedStateMessageHandler extends ServerStateMessageHandler {
InitializedStateMessageHandler(
LspAnalysisServer server,
- bool onlyAnalyzeProjectsWithOpenFiles,
- bool suggestFromUnimportedLibraries,
) : super(server) {
reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
'Server already initialized');
@@ -61,15 +59,23 @@
registerHandler(new ShutdownMessageHandler(server));
registerHandler(new ExitMessageHandler(server));
registerHandler(
- new TextDocumentOpenHandler(server, onlyAnalyzeProjectsWithOpenFiles),
+ new TextDocumentOpenHandler(
+ server,
+ server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles,
+ ),
);
registerHandler(new TextDocumentChangeHandler(server));
registerHandler(
- new TextDocumentCloseHandler(server, onlyAnalyzeProjectsWithOpenFiles),
+ new TextDocumentCloseHandler(
+ server,
+ server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles,
+ ),
);
registerHandler(new HoverHandler(server));
- registerHandler(
- new CompletionHandler(server, suggestFromUnimportedLibraries));
+ registerHandler(new CompletionHandler(
+ server,
+ server.initializationOptions.suggestFromUnimportedLibraries,
+ ));
registerHandler(new CompletionResolveHandler(server));
registerHandler(new SignatureHelpHandler(server));
registerHandler(new DefinitionHandler(server));
@@ -82,7 +88,10 @@
registerHandler(new CodeActionHandler(server));
registerHandler(new ExecuteCommandHandler(server));
registerHandler(
- new WorkspaceFoldersHandler(server, !onlyAnalyzeProjectsWithOpenFiles),
+ new WorkspaceFoldersHandler(
+ server,
+ !server.initializationOptions.onlyAnalyzeProjectsWithOpenFiles,
+ ),
);
registerHandler(new PrepareRenameHandler(server));
registerHandler(new RenameHandler(server));
@@ -96,8 +105,6 @@
InitializingStateMessageHandler(
LspAnalysisServer server,
List<String> openWorkspacePaths,
- bool onlyAnalyzeProjectsWithOpenFiles,
- bool suggestFromUnimportedLibraries,
) : super(server) {
reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
'Server already initialized');
@@ -106,8 +113,6 @@
registerHandler(new IntializedMessageHandler(
server,
openWorkspacePaths,
- onlyAnalyzeProjectsWithOpenFiles,
- suggestFromUnimportedLibraries,
));
}
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 7fff986..58eaf26 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -55,6 +55,10 @@
/// The capabilities of the LSP client. Will be null prior to initialization.
ClientCapabilities _clientCapabilities;
+ /// Initialization options provided by the LSP client. Allows opting in/out of
+ /// specific server functionality. Will be null prior to initialization.
+ LspInitializationOptions _initializationOptions;
+
/**
* The channel from which messages are received and to which responses should
* be sent.
@@ -196,6 +200,10 @@
Future<void> get exited => channel.closed;
+ /// Initialization options provided by the LSP client. Allows opting in/out of
+ /// specific server functionality. Will be null prior to initialization.
+ LspInitializationOptions get initializationOptions => _initializationOptions;
+
RefactoringWorkspace get refactoringWorkspace => _refactoringWorkspace ??=
new RefactoringWorkspace(driverMap.values, searchEngine);
@@ -240,8 +248,10 @@
null, new Uri.file(path).toString());
}
- void handleClientConnection(ClientCapabilities capabilities) {
+ void handleClientConnection(
+ ClientCapabilities capabilities, dynamic initializationOptions) {
_clientCapabilities = capabilities;
+ _initializationOptions = LspInitializationOptions(initializationOptions);
performanceAfterStartup = new ServerPerformance();
performance = performanceAfterStartup;
@@ -518,6 +528,18 @@
}
}
+class LspInitializationOptions {
+ final bool onlyAnalyzeProjectsWithOpenFiles;
+ final bool suggestFromUnimportedLibraries;
+ LspInitializationOptions(dynamic options)
+ : onlyAnalyzeProjectsWithOpenFiles = options != null &&
+ options['onlyAnalyzeProjectsWithOpenFiles'] == true,
+ // suggestFromUnimportedLibraries defaults to true, so must be
+ // explicitly passed as false to disable.
+ suggestFromUnimportedLibraries = options == null ||
+ options['suggestFromUnimportedLibraries'] != false;
+}
+
class LspPerformance {
/// A list of code completion performance measurements for the latest
/// completion operation up to [performanceListMaxLength] measurements.