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 {