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.