Display correct line and column offsets for context messages
The line and column offsets for the context messages were being computed
based on line information for the file in which the diagnostic was being
reported, which can be different than the file pointed to by the context
message. This ensures that we use the right line info.
Fixes https://github.com/dart-lang/sdk/issues/60750
Change-Id: I6dbc95bde5aeb1abc70d90767dc59082982a5a96
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/429380
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index ac8db3b..9b5e458 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -215,11 +215,22 @@
var offset = message.offset;
var length = message.length;
- var startLocation = result.lineInfo.getLocation(offset);
+ var lineInfo = result.lineInfo;
+ if (result.path != message.filePath) {
+ var messageResult = result.session.getFile(message.filePath);
+ // If we can't get a result for the file then we will return bogus start and
+ // end positions, but that's probably better than not returning the
+ // diagnostic.
+ if (messageResult is engine.FileResult) {
+ lineInfo = messageResult.lineInfo;
+ }
+ }
+
+ var startLocation = lineInfo.getLocation(offset);
var startLine = startLocation.lineNumber;
var startColumn = startLocation.columnNumber;
- var endLocation = result.lineInfo.getLocation(offset + length);
+ var endLocation = lineInfo.getLocation(offset + length);
var endLine = endLocation.lineNumber;
var endColumn = endLocation.columnNumber;
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 7786096..c4f6991 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -53,6 +53,7 @@
result = _ResolvedUnitResultImplMock(
lineInfo: lineInfo,
errors: [engineError],
+ path: 'foo.dart',
);
}
@@ -70,6 +71,7 @@
_ResolvedUnitResultImplMock(
lineInfo: engine.LineInfo([0, 5, 9, 20]),
errors: [engineError],
+ path: 'bar.dart',
),
engineError,
);
@@ -441,7 +443,14 @@
@override
final List<engine.Diagnostic> errors;
- _ResolvedUnitResultImplMock({required this.lineInfo, required this.errors});
+ @override
+ final String path;
+
+ _ResolvedUnitResultImplMock({
+ required this.lineInfo,
+ required this.errors,
+ required this.path,
+ });
@override
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index 06859c5..76f5ddd 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -380,7 +380,7 @@
// Add any context messages as bullet list items.
for (var message in error.contextMessages) {
- var contextPath = _relativePath(error.file, relativeToDir);
+ var contextPath = _relativePath(message.filePath, relativeToDir);
var messageSentenceFragment = trimEnd(message.message, '.');
log.stdout('$_bodyIndent'
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index def2428..97aa13a 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -319,6 +319,31 @@
expect(result.stdout, contains('return_of_invalid_type'));
expect(result.stdout, contains('1 issue found.'));
});
+
+ test('error with context message', () async {
+ p = project(mainSrc: '''
+part 'a.dart';
+
+class B extends A {
+ @override
+ void m(String p) {}
+}
+''');
+ p.file('lib${path.separator}a.dart', '''
+part of 'main.dart';
+
+class A {
+ void m(int p) {}
+}
+''');
+ var result = await p.runAnalyze([p.mainPath]);
+
+ expect(result.exitCode, 3);
+ expect(result.stderr, isEmpty);
+ expect(result.stdout, contains('a.dart:4:8.'));
+ expect(result.stdout, contains('invalid_override'));
+ expect(result.stdout, contains('1 issue found.'));
+ });
});
test('warning --fatal-warnings', () async {