Fix lints not appearing when using LSP Server

Change-Id: Ib3b4396a611be32b91b08d68c962302899a1ad88
Bug: https://github.com/dart-lang/sdk/issues/36931
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/102340
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Danny Tuppeny <dantup@google.com>
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 70f98dc..2937dee 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -532,6 +532,8 @@
   ) {
     final serve_http = diagnosticServerPort != null;
 
+    linter.registerLintRules();
+
     _DiagnosticServerImpl diagnosticServer = new _DiagnosticServerImpl();
 
     final socketServer = new LspSocketServer(
diff --git a/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart b/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart
new file mode 100644
index 0000000..40e2ff6
--- /dev/null
+++ b/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart
@@ -0,0 +1,52 @@
+// 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 'integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DiagnosticTest);
+  });
+}
+
+@reflectiveTest
+class DiagnosticTest extends AbstractLspAnalysisServerIntegrationTest {
+  test_initialAnalysis() async {
+    newFile(mainFilePath, content: 'String a = 1;');
+
+    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final diagnostics = await diagnosticsUpdate;
+    expect(diagnostics, hasLength(1));
+    final diagnostic = diagnostics.first;
+    expect(diagnostic.code, equals('invalid_assignment'));
+    expect(diagnostic.range.start.line, equals(0));
+    expect(diagnostic.range.start.character, equals(11));
+    expect(diagnostic.range.end.line, equals(0));
+    expect(diagnostic.range.end.character, equals(12));
+  }
+
+  test_lints() async {
+    newFile(mainFilePath, content: '''main() async => await 1;''');
+    newFile(analysisOptionsPath, content: '''
+linter:
+  rules:
+    - await_only_futures
+    ''');
+
+    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final diagnostics = await diagnosticsUpdate;
+    expect(diagnostics, hasLength(1));
+    final diagnostic = diagnostics.first;
+    expect(diagnostic.code, equals('await_only_futures'));
+    expect(diagnostic.range.start.line, equals(0));
+    expect(diagnostic.range.start.character, equals(16));
+    expect(diagnostic.range.end.line, equals(0));
+    expect(diagnostic.range.end.character, equals(21));
+  }
+}
diff --git a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
index f8a1713..aac6231 100644
--- a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
@@ -9,16 +9,12 @@
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_byte_stream_channel.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:path/path.dart';
 
 import '../../lsp/server_abstract.dart';
 
 class AbstractLspAnalysisServerIntegrationTest
-    with
-        ResourceProviderMixin,
-        ClientCapabilitiesHelperMixin,
-        LspAnalysisServerTestMixin {
+    with ClientCapabilitiesHelperMixin, LspAnalysisServerTestMixin {
   LspServerClient client;
 
   final Map<int, Completer<ResponseMessage>> _completers = {};
@@ -49,6 +45,11 @@
     }
   }
 
+  newFile(String path, {String content}) =>
+      File(path).writeAsStringSync(content ?? '');
+
+  newFolder(String path) => Directory(path).createSync(recursive: true);
+
   @override
   void sendNotificationToServer(NotificationMessage notification) =>
       client.channel.sendNotification(notification);
@@ -74,7 +75,13 @@
     projectFolderPath = Directory.systemTemp
         .createTempSync('analysisServer')
         .resolveSymbolicLinksSync();
+    newFolder(projectFolderPath);
+    newFolder(join(projectFolderPath, 'lib'));
     projectFolderUri = Uri.file(projectFolderPath);
+    mainFilePath = join(projectFolderPath, 'lib', 'main.dart');
+    mainFileUri = Uri.file(mainFilePath);
+    analysisOptionsPath = join(projectFolderPath, 'analysis_options.yaml');
+    analysisOptionsUri = Uri.file(analysisOptionsPath);
 
     client = new LspServerClient();
     await client.start();
diff --git a/pkg/analysis_server/test/integration/lsp_server/test_all.dart b/pkg/analysis_server/test/integration/lsp_server/test_all.dart
index 7f67613..1297cf4 100644
--- a/pkg/analysis_server/test/integration/lsp_server/test_all.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/test_all.dart
@@ -4,11 +4,13 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'diagnostic_test.dart' as diagnostic_test;
 import 'initialization_test.dart' as initialization_test;
 import 'server_test.dart' as server_test;
 
 main() {
   defineReflectiveSuite(() {
+    diagnostic_test.main();
     initialization_test.main();
     server_test.main();
   }, name: 'lsp integration');
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 3b3c826..ba85297 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -30,8 +30,7 @@
 
 final beginningOfDocument = new Range(new Position(0, 0), new Position(0, 0));
 
-mixin LspAnalysisServerTestMixin
-    implements ResourceProviderMixin, ClientCapabilitiesHelperMixin {
+mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
   static const positionMarker = '^';
   static const rangeMarkerStart = '[[';
   static const rangeMarkerEnd = ']]';
@@ -40,8 +39,8 @@
       new RegExp(allMarkers.map(RegExp.escape).join('|'));
 
   int _id = 0;
-  String projectFolderPath, mainFilePath, pubspecFilePath;
-  Uri projectFolderUri, mainFileUri, pubspecFileUri;
+  String projectFolderPath, mainFilePath, pubspecFilePath, analysisOptionsPath;
+  Uri projectFolderUri, mainFileUri, pubspecFileUri, analysisOptionsUri;
   final String simplePubspecContent = 'name: my_project';
   final startOfDocPos = new Position(0, 0);
   final startOfDocRange = new Range(new Position(0, 0), new Position(0, 0));
@@ -716,7 +715,13 @@
     await serverToClient.firstWhere((message) {
       if (message is NotificationMessage &&
           message.method == Method.textDocument_publishDiagnostics) {
-        diagnosticParams = message.params;
+        // This helper method is used both in in-process tests where we'll get
+        // the real type back, and out-of-process integration tests where
+        // params is `Map<String, dynamic>` so for convenience just
+        // handle either here.
+        diagnosticParams = message.params is PublishDiagnosticsParams
+            ? message.params
+            : PublishDiagnosticsParams.fromJson(message.params);
 
         return diagnosticParams.uri == uri.toString();
       }
@@ -791,6 +796,8 @@
     mainFileUri = Uri.file(mainFilePath);
     pubspecFilePath = join(projectFolderPath, 'pubspec.yaml');
     pubspecFileUri = Uri.file(pubspecFilePath);
+    analysisOptionsPath = join(projectFolderPath, 'analysis_options.yaml');
+    analysisOptionsUri = Uri.file(analysisOptionsPath);
   }
 
   Future tearDown() async {