Add open files to LSP server/drivers priorityFiles

Change-Id: Ida44f8edb23b5c4080cfd6ba44ee6b4764d9b131
Reviewed-on: https://dart-review.googlesource.com/c/88325
Commit-Queue: Danny Tuppeny <dantup@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
index c500164..ea42bec 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
@@ -60,6 +60,7 @@
   ErrorOr<void> handle(DidCloseTextDocumentParams params) {
     final path = pathOfDoc(params.textDocument);
     return path.mapResult((path) {
+      server.removePriorityFile(path);
       server.documentVersions[path] = null;
       server.updateOverlay(path, null);
       return success();
@@ -80,6 +81,7 @@
     final doc = params.textDocument;
     final path = pathOfDocItem(doc);
     return path.mapResult((path) {
+      server.addPriorityFile(path);
       // We don't get a VersionedTextDocumentIdentifier with a didOpen but we
       // do get the necessary info to create one.
       server.documentVersions[path] = new VersionedTextDocumentIdentifier(
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 da14966..245c116a 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -165,6 +165,14 @@
 
   Future<void> get exited => channel.closed;
 
+  addPriorityFile(String path) {
+    final didAdd = priorityFiles.add(path);
+    assert(didAdd);
+    if (didAdd) {
+      _updateDriversPriorityFiles();
+    }
+  }
+
   /**
    * The socket from which messages are being read has been closed.
    */
@@ -282,6 +290,14 @@
     ));
   }
 
+  removePriorityFile(String path) {
+    final didRemove = priorityFiles.remove(path);
+    assert(didRemove);
+    if (didRemove) {
+      _updateDriversPriorityFiles();
+    }
+  }
+
   void sendErrorResponse(Message message, ResponseError error) {
     if (message is RequestMessage) {
       channel.sendResponse(
@@ -405,6 +421,12 @@
     }
     driverMap.values.forEach((driver) => driver.changeFile(path));
   }
+
+  _updateDriversPriorityFiles() {
+    driverMap.values.forEach((driver) {
+      driver.priorityFiles = priorityFiles.toList();
+    });
+  }
 }
 
 class LspServerContextManagerCallbacks extends ContextManagerCallbacks {
diff --git a/pkg/analysis_server/test/lsp/priority_files_test.dart b/pkg/analysis_server/test/lsp/priority_files_test.dart
new file mode 100644
index 0000000..7a7b330
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/priority_files_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2019, 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:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PriorityFilesTest);
+  });
+}
+
+@reflectiveTest
+class PriorityFilesTest extends AbstractLspAnalysisServerTest {
+  test_close() async {
+    await initialize();
+    await openFile(mainFileUri, '');
+    await closeFile(mainFileUri);
+
+    expect(server.priorityFiles, isNot(contains(mainFilePath)));
+    server.driverMap.values.forEach((driver) {
+      expect(driver.priorityFiles, isNot(contains(mainFilePath)));
+    });
+  }
+
+  test_open() async {
+    await initialize();
+    await openFile(mainFileUri, '');
+
+    expect(server.priorityFiles, contains(mainFilePath));
+    server.driverMap.values.forEach((driver) {
+      expect(driver.priorityFiles, contains(mainFilePath));
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
index 7e2b8b6..c9942f1 100644
--- a/pkg/analysis_server/test/lsp/test_all.dart
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -4,6 +4,11 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../src/lsp/lsp_packet_transformer_test.dart'
+    as packet_transformer_tests;
+import 'code_actions_assists_test.dart' as assists_code_action_tests;
+import 'code_actions_fixes_test.dart' as fixes_code_action_tests;
+import 'code_actions_source_test.dart' as source_code_action_tests;
 import 'completion_test.dart' as completion_test;
 import 'definition_test.dart' as definition_test;
 import 'diagnostic_test.dart' as diagnostic_test;
@@ -12,14 +17,10 @@
 import 'format_test.dart' as format_test;
 import 'hover_test.dart' as hover_test;
 import 'initialization_test.dart' as initialization_test;
+import 'priority_files_test.dart' as priority_files_test;
 import 'references_test.dart' as references_test;
 import 'server_test.dart' as server_test;
 import 'signature_help_test.dart' as signature_help_test;
-import 'code_actions_source_test.dart' as source_code_action_tests;
-import 'code_actions_fixes_test.dart' as fixes_code_action_tests;
-import 'code_actions_assists_test.dart' as assists_code_action_tests;
-import '../src/lsp/lsp_packet_transformer_test.dart'
-    as packet_transformer_tests;
 
 main() {
   defineReflectiveSuite(() {
@@ -28,6 +29,7 @@
     diagnostic_test.main();
     document_symbols_test.main();
     file_modification_test.main();
+    priority_files_test.main();
     format_test.main();
     hover_test.main();
     initialization_test.main();