Skip to content

Commit 6941d04

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Add support for testing the context messages for diagnostics
Change-Id: I33d4abc0dcc969f3beecfdc7cbc814e8a486ad1c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107142 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 33df2ed commit 6941d04

5 files changed

Lines changed: 92 additions & 16 deletions

File tree

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:analyzer/dart/analysis/results.dart';
1212
import 'package:analyzer/dart/analysis/session.dart';
1313
import 'package:analyzer/dart/ast/ast.dart';
1414
import 'package:analyzer/dart/element/element.dart' show LibraryElement;
15-
import 'package:analyzer/diagnostic/diagnostic.dart' as diagnostic;
1615
import 'package:analyzer/error/error.dart';
1716
import 'package:analyzer/error/listener.dart';
1817
import 'package:analyzer/exception/exception.dart';
@@ -1737,7 +1736,7 @@ class AnalysisDriver implements AnalysisDriverGeneric {
17371736
errorCode,
17381737
error.message,
17391738
error.correction.isEmpty ? null : error.correction,
1740-
contextMessages: contextMessages));
1739+
contextMessages: contextMessages ?? const []));
17411740
}
17421741
}
17431742
return errors;

pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ class DiagnosticFactory {
4444
identifier.length,
4545
CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
4646
[name],
47-
contextMessages);
47+
contextMessages ?? const []);
4848
}
4949
}

pkg/analyzer/test/generated/compile_time_error_code.dart

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4723,7 +4723,8 @@ main() {
47234723
}
47244724
print(x) {}
47254725
''', [
4726-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 28, 1),
4726+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 28, 1,
4727+
expectedMessages: [message('/test/lib/test.dart', 34, 1)]),
47274728
]);
47284729
}
47294730

@@ -4736,7 +4737,8 @@ main() {
47364737
}
47374738
print(x) {}
47384739
''', [
4739-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 28, 1),
4740+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 28, 1,
4741+
expectedMessages: [message('/test/lib/test.dart', 38, 1)]),
47404742
]);
47414743
}
47424744

@@ -4751,7 +4753,8 @@ main() {
47514753
}
47524754
print(x) {}
47534755
''', [
4754-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 34, 1),
4756+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 34, 1,
4757+
expectedMessages: [message('/test/lib/test.dart', 48, 1)]),
47554758
]);
47564759
}
47574760

@@ -4761,7 +4764,8 @@ main() {
47614764
var v = () => v;
47624765
}
47634766
''', [
4764-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 25, 1),
4767+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 25, 1,
4768+
expectedMessages: [message('/test/lib/test.dart', 15, 1)]),
47654769
]);
47664770
}
47674771

@@ -4771,7 +4775,8 @@ main() {
47714775
var v = v;
47724776
}
47734777
''', [
4774-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 19, 1),
4778+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 19, 1,
4779+
expectedMessages: [message('/test/lib/test.dart', 15, 1)]),
47754780
]);
47764781
}
47774782

@@ -4783,7 +4788,8 @@ void testTypeRef() {
47834788
print(s + String);
47844789
}
47854790
''', [
4786-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 23, 6),
4791+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 23, 6,
4792+
expectedMessages: [message('/test/lib/test.dart', 44, 6)]),
47874793
]);
47884794
}
47894795

@@ -4795,7 +4801,8 @@ void testTypeRef() {
47954801
print(s + String);
47964802
}
47974803
''', [
4798-
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 23, 6),
4804+
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 23, 6,
4805+
expectedMessages: [message('/test/lib/test.dart', 44, 6)]),
47994806
]);
48004807
}
48014808

pkg/analyzer/test/generated/test_support.dart

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/dart/ast/ast.dart' show AstNode, SimpleIdentifier;
66
import 'package:analyzer/dart/element/element.dart';
77
import 'package:analyzer/dart/element/type.dart';
8+
import 'package:analyzer/diagnostic/diagnostic.dart';
89
import 'package:analyzer/error/error.dart';
910
import 'package:analyzer/error/listener.dart';
1011
import 'package:analyzer/exception/exception.dart';
@@ -118,15 +119,61 @@ class ExpectedError {
118119
/// The offset of the beginning of the error's region.
119120
final int length;
120121

122+
/// The list of context messages that are expected to be associated with the
123+
/// error.
124+
final List<ExpectedMessage> expectedMessages;
125+
121126
/// Initialize a newly created error description.
122-
ExpectedError(this.code, this.offset, this.length);
127+
ExpectedError(this.code, this.offset, this.length,
128+
{this.expectedMessages = const <ExpectedMessage>[]});
123129

124130
/// Return `true` if the [error] matches this description of what it's
125131
/// expected to be.
126132
bool matches(AnalysisError error) {
127-
return error.offset == offset &&
128-
error.length == length &&
129-
error.errorCode == code;
133+
if (error.offset != offset ||
134+
error.length != length ||
135+
error.errorCode != code) {
136+
return false;
137+
}
138+
List<DiagnosticMessage> contextMessages = error.contextMessages.toList();
139+
contextMessages.sort((first, second) {
140+
int result = first.filePath.compareTo(second.filePath);
141+
if (result != 0) {
142+
return result;
143+
}
144+
return second.offset - first.offset;
145+
});
146+
if (contextMessages.length != expectedMessages.length) {
147+
return false;
148+
}
149+
for (int i = 0; i < expectedMessages.length; i++) {
150+
if (!expectedMessages[i].matches(contextMessages[i])) {
151+
return false;
152+
}
153+
}
154+
return true;
155+
}
156+
}
157+
158+
/// A description of a message that is expected to be reported with an error.
159+
class ExpectedMessage {
160+
/// The path of the file with which the message is associated.
161+
final String filePath;
162+
163+
/// The offset of the beginning of the error's region.
164+
final int offset;
165+
166+
/// The offset of the beginning of the error's region.
167+
final int length;
168+
169+
ExpectedMessage(this.filePath, this.offset, this.length);
170+
171+
/// Return `true` if the [message] matches this description of what it's
172+
/// expected to be.
173+
bool matches(DiagnosticMessage message) {
174+
return message.filePath == filePath &&
175+
message.offset == offset &&
176+
message.length == length;
130177
}
131178
}
132179

@@ -227,12 +274,30 @@ class GatheringErrorListener implements AnalysisErrorListener {
227274
buffer.writeln();
228275
buffer.writeln('To accept the current state, expect:');
229276
for (AnalysisError actual in errors) {
277+
List<DiagnosticMessage> contextMessages = actual.contextMessages;
230278
buffer.write(' error(');
231279
buffer.write(actual.errorCode);
232280
buffer.write(', ');
233281
buffer.write(actual.offset);
234282
buffer.write(', ');
235283
buffer.write(actual.length);
284+
if (contextMessages.isNotEmpty) {
285+
buffer.write(', expectedMessages: [');
286+
for (int i = 0; i < contextMessages.length; i++) {
287+
DiagnosticMessage message = contextMessages[i];
288+
if (i > 0) {
289+
buffer.write(', ');
290+
}
291+
buffer.write('message(resourceProvider.convertPath(\'');
292+
buffer.write(message.filePath);
293+
buffer.write('\'), ');
294+
buffer.write(message.offset);
295+
buffer.write(', ');
296+
buffer.write(message.length);
297+
buffer.write(')');
298+
}
299+
buffer.write(']');
300+
}
236301
buffer.writeln('),');
237302
}
238303
fail(buffer.toString());

pkg/analyzer/test/src/dart/resolution/resolution.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,10 @@ mixin ResolutionTest implements ResourceProviderMixin {
419419
expect(node.staticType, isNull);
420420
}
421421

422-
ExpectedError error(ErrorCode code, int offset, int length) =>
423-
new ExpectedError(code, offset, length);
422+
ExpectedError error(ErrorCode code, int offset, int length,
423+
{List<ExpectedMessage> expectedMessages =
424+
const <ExpectedMessage>[]}) =>
425+
ExpectedError(code, offset, length, expectedMessages: expectedMessages);
424426

425427
Element getNodeElement(AstNode node) {
426428
if (node is Annotation) {
@@ -450,6 +452,9 @@ mixin ResolutionTest implements ResourceProviderMixin {
450452
}
451453
}
452454

455+
ExpectedMessage message(String filePath, int offset, int length) =>
456+
ExpectedMessage(convertPath(filePath), offset, length);
457+
453458
Future<ResolvedUnitResult> resolveFile(String path);
454459

455460
Future<void> resolveTestFile() async {

0 commit comments

Comments
 (0)