Skip to content

Commit dd862e7

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Display context messages in command-line analyzer output
Change-Id: I2b2f668ef738cf7801dbfdc77d070a8d8a473fe5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107303 Reviewed-by: Devon Carew <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent ea0e48a commit dd862e7

6 files changed

Lines changed: 72 additions & 38 deletions

File tree

pkg/analyzer_cli/lib/src/analyzer_impl.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class AnalyzerImpl {
4646
final Set<String> files = new Set<String>();
4747

4848
/// All [AnalysisErrorInfo]s in the analyzed library.
49-
final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
49+
final List<ErrorsResult> errorsResults = [];
5050

5151
/// If the file specified on the command line is part of a package, the name
5252
/// of that package. Otherwise `null`. This allows us to analyze the file
@@ -108,8 +108,8 @@ class AnalyzerImpl {
108108
/// Returns the maximal [ErrorSeverity] of the recorded errors.
109109
ErrorSeverity computeMaxErrorSeverity() {
110110
ErrorSeverity status = ErrorSeverity.NONE;
111-
for (AnalysisErrorInfo errorInfo in errorInfos) {
112-
for (AnalysisError error in errorInfo.errors) {
111+
for (ErrorsResult result in errorsResults) {
112+
for (AnalysisError error in result.errors) {
113113
if (_defaultSeverityProcessor(error) == null) {
114114
continue;
115115
}
@@ -119,16 +119,15 @@ class AnalyzerImpl {
119119
return status;
120120
}
121121

122-
/// Fills [errorInfos] using [files].
122+
/// Fills [errorsResults] using [files].
123123
Future<void> prepareErrors() async {
124124
// TODO(brianwilkerson) Determine whether this await is necessary.
125125
await null;
126126
PerformanceTag previous = _prepareErrorsTag.makeCurrent();
127127
try {
128128
for (String path in files) {
129129
ErrorsResult errorsResult = await analysisDriver.getErrors(path);
130-
errorInfos.add(new AnalysisErrorInfoImpl(
131-
errorsResult.errors, errorsResult.lineInfo));
130+
errorsResults.add(errorsResult);
132131
}
133132
} finally {
134133
previous.makeCurrent();
@@ -145,7 +144,7 @@ class AnalyzerImpl {
145144
/// Setup local fields such as the analysis context for analysis.
146145
void setupForAnalysis() {
147146
files.clear();
148-
errorInfos.clear();
147+
errorsResults.clear();
149148
Uri libraryUri = libraryFile.uri;
150149
if (libraryUri.scheme == 'package' && libraryUri.pathSegments.length > 0) {
151150
_selfPackageName = libraryUri.pathSegments[0];
@@ -170,7 +169,7 @@ class AnalyzerImpl {
170169

171170
// Print errors and performance numbers.
172171
if (printMode == 1) {
173-
formatter.formatErrors(errorInfos);
172+
formatter.formatErrors(errorsResults);
174173
} else if (printMode == 2) {
175174
_printColdPerf();
176175
}

pkg/analyzer_cli/lib/src/build_mode.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -633,9 +633,7 @@ class BuildMode with HasContextMixin {
633633
severityProcessor: severityProcessor);
634634
for (Source source in explicitSources) {
635635
var result = await analysisDriver.getErrors(source.fullName);
636-
var errorInfo =
637-
new AnalysisErrorInfoImpl(result.errors, result.lineInfo);
638-
formatter.formatErrors([errorInfo]);
636+
formatter.formatErrors([result]);
639637
}
640638
formatter.flush();
641639
if (!options.machineFormat) {

pkg/analyzer_cli/lib/src/driver.dart

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:analyzer/src/dart/analysis/byte_store.dart';
1414
import 'package:analyzer/src/dart/analysis/driver.dart';
1515
import 'package:analyzer/src/dart/analysis/file_state.dart';
1616
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
17+
import 'package:analyzer/src/dart/analysis/results.dart';
1718
import 'package:analyzer/src/dart/sdk/sdk.dart';
1819
import 'package:analyzer/src/file_system/file_system.dart';
1920
import 'package:analyzer/src/generated/engine.dart';
@@ -23,8 +24,8 @@ import 'package:analyzer/src/generated/sdk.dart';
2324
import 'package:analyzer/src/generated/source.dart';
2425
import 'package:analyzer/src/generated/utilities_general.dart'
2526
show PerformanceTag;
26-
import 'package:analyzer/src/plugin/resolver_provider.dart';
2727
import 'package:analyzer/src/manifest/manifest_validator.dart';
28+
import 'package:analyzer/src/plugin/resolver_provider.dart';
2829
import 'package:analyzer/src/pubspec/pubspec_validator.dart';
2930
import 'package:analyzer/src/source/package_map_resolver.dart';
3031
import 'package:analyzer/src/source/path_filter.dart';
@@ -350,7 +351,10 @@ class Driver with HasContextMixin implements CommandLineStarter {
350351
LineInfo lineInfo = new LineInfo.fromContent(content);
351352
List<AnalysisError> errors = analyzeAnalysisOptions(
352353
file.createSource(), content, analysisDriver.sourceFactory);
353-
formatter.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
354+
formatter.formatErrors([
355+
ErrorsResultImpl(analysisDriver.currentSession, path, null,
356+
lineInfo, false, errors)
357+
]);
354358
for (AnalysisError error in errors) {
355359
ErrorSeverity severity = determineProcessedSeverity(
356360
error, options, analysisDriver.analysisOptions);
@@ -368,8 +372,10 @@ class Driver with HasContextMixin implements CommandLineStarter {
368372
new PubspecValidator(resourceProvider, file.createSource());
369373
LineInfo lineInfo = new LineInfo.fromContent(content);
370374
List<AnalysisError> errors = validator.validate(node.nodes);
371-
formatter
372-
.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
375+
formatter.formatErrors([
376+
ErrorsResultImpl(analysisDriver.currentSession, path, null,
377+
lineInfo, false, errors)
378+
]);
373379
for (AnalysisError error in errors) {
374380
ErrorSeverity severity = determineProcessedSeverity(
375381
error, options, analysisDriver.analysisOptions);
@@ -388,8 +394,10 @@ class Driver with HasContextMixin implements CommandLineStarter {
388394
LineInfo lineInfo = new LineInfo.fromContent(content);
389395
List<AnalysisError> errors = validator.validate(
390396
content, analysisDriver.analysisOptions.chromeOsManifestChecks);
391-
formatter
392-
.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
397+
formatter.formatErrors([
398+
ErrorsResultImpl(analysisDriver.currentSession, path, null,
399+
lineInfo, false, errors)
400+
]);
393401
for (AnalysisError error in errors) {
394402
ErrorSeverity severity = determineProcessedSeverity(
395403
error, options, analysisDriver.analysisOptions);

pkg/analyzer_cli/lib/src/error_formatter.dart

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/analysis/results.dart';
56
import 'package:analyzer/error/error.dart';
67
import 'package:analyzer/source/line_info.dart';
7-
import 'package:analyzer/src/generated/engine.dart';
8+
import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
89
import 'package:analyzer/src/generated/source.dart';
910
import 'package:analyzer_cli/src/ansi.dart';
1011
import 'package:analyzer_cli/src/options.dart';
@@ -109,6 +110,7 @@ class CLIError implements Comparable<CLIError> {
109110
final int line;
110111
final int column;
111112
final String message;
113+
final List<ContextMessage> contextMessages;
112114
final String errorCode;
113115
final String correction;
114116
final String url;
@@ -120,6 +122,7 @@ class CLIError implements Comparable<CLIError> {
120122
this.line,
121123
this.column,
122124
this.message,
125+
this.contextMessages,
123126
this.errorCode,
124127
this.correction,
125128
this.url,
@@ -161,6 +164,14 @@ class CLIError implements Comparable<CLIError> {
161164
}
162165
}
163166

167+
class ContextMessage {
168+
final String filePath;
169+
final String message;
170+
final int line;
171+
final int column;
172+
ContextMessage(this.filePath, this.message, this.line, this.column);
173+
}
174+
164175
/// Helper for formatting [AnalysisError]s.
165176
///
166177
/// The two format options are a user consumable format and a machine consumable
@@ -181,19 +192,18 @@ abstract class ErrorFormatter {
181192
void flush();
182193

183194
void formatError(
184-
Map<AnalysisError, LineInfo> errorToLine, AnalysisError error);
195+
Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error);
185196

186-
void formatErrors(List<AnalysisErrorInfo> errorInfos) {
187-
stats.unfilteredCount += errorInfos.length;
197+
void formatErrors(List<ErrorsResult> results) {
198+
stats.unfilteredCount += results.length;
188199

189200
List<AnalysisError> errors = new List<AnalysisError>();
190-
Map<AnalysisError, LineInfo> errorToLine =
191-
new Map<AnalysisError, LineInfo>();
192-
for (AnalysisErrorInfo errorInfo in errorInfos) {
193-
for (AnalysisError error in errorInfo.errors) {
201+
Map<AnalysisError, ErrorsResult> errorToLine = {};
202+
for (ErrorsResult result in results) {
203+
for (AnalysisError error in result.errors) {
194204
if (_computeSeverity(error) != null) {
195205
errors.add(error);
196-
errorToLine[error] = errorInfo.lineInfo;
206+
errorToLine[error] = result;
197207
}
198208
}
199209
}
@@ -253,6 +263,11 @@ class HumanErrorFormatter extends ErrorFormatter {
253263
// If verbose, also print any associated correction and URL.
254264
if (options.verbose) {
255265
String padding = ' '.padLeft(error.severity.length + 2);
266+
for (var message in error.contextMessages) {
267+
out.write('$padding${message.message} ');
268+
out.write('at ${message.filePath}');
269+
out.writeln(':${message.line}:${message.column}');
270+
}
256271
if (error.correction != null) {
257272
out.writeln('$padding${error.correction}');
258273
}
@@ -267,9 +282,10 @@ class HumanErrorFormatter extends ErrorFormatter {
267282
}
268283

269284
void formatError(
270-
Map<AnalysisError, LineInfo> errorToLine, AnalysisError error) {
285+
Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error) {
271286
Source source = error.source;
272-
var location = errorToLine[error].getLocation(error.offset);
287+
var result = errorToLine[error];
288+
var location = result.lineInfo.getLocation(error.offset);
273289

274290
ErrorSeverity severity = _severityProcessor(error);
275291

@@ -300,6 +316,17 @@ class HumanErrorFormatter extends ErrorFormatter {
300316
} else {
301317
sourcePath = _relative(source.fullName);
302318
}
319+
List<ContextMessage> contextMessages = [];
320+
for (var message in error.contextMessages) {
321+
var session = result.session.analysisContext;
322+
if (session is DriverBasedAnalysisContext) {
323+
LineInfo lineInfo =
324+
session.driver.getFileSync(message.filePath)?.lineInfo;
325+
var location = lineInfo.getLocation(message.offset);
326+
contextMessages.add(ContextMessage(message.filePath, message.message,
327+
location.lineNumber, location.columnNumber));
328+
}
329+
}
303330

304331
batchedErrors.add(new CLIError(
305332
severity: errorType,
@@ -308,6 +335,7 @@ class HumanErrorFormatter extends ErrorFormatter {
308335
line: location.lineNumber,
309336
column: location.columnNumber,
310337
message: message,
338+
contextMessages: contextMessages,
311339
errorCode: error.errorCode.name.toLowerCase(),
312340
correction: error.correction,
313341
url: error.errorCode.url,
@@ -330,13 +358,13 @@ class MachineErrorFormatter extends ErrorFormatter {
330358
void flush() {}
331359

332360
void formatError(
333-
Map<AnalysisError, LineInfo> errorToLine, AnalysisError error) {
361+
Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error) {
334362
// Ensure we don't over-report (#36062).
335363
if (!_seenErrors.add(error)) {
336364
return;
337365
}
338366
Source source = error.source;
339-
var location = errorToLine[error].getLocation(error.offset);
367+
var location = errorToLine[error].lineInfo.getLocation(error.offset);
340368
int length = error.length;
341369

342370
ErrorSeverity severity = _severityProcessor(error);

pkg/analyzer_cli/test/mocks.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class MockAnalysisError implements AnalysisError {
3131
MockAnalysisError(this.source, this.errorCode, this.offset, this.message);
3232

3333
@override
34-
List<DiagnosticMessage> get contextMessages => null;
34+
List<DiagnosticMessage> get contextMessages => const [];
3535

3636
@override
3737
String get correction => null;

pkg/analyzer_cli/test/reporter_test.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import 'package:analyzer/error/error.dart';
66
import 'package:analyzer/source/line_info.dart';
7-
import 'package:analyzer/src/generated/engine.dart';
7+
import 'package:analyzer/src/dart/analysis/results.dart';
88
import 'package:analyzer_cli/src/ansi.dart' as ansi;
99
import 'package:analyzer_cli/src/error_formatter.dart';
1010
import 'package:test/test.dart' hide ErrorFormatter;
@@ -39,8 +39,8 @@ main() {
3939
});
4040

4141
test('error', () {
42-
AnalysisErrorInfo error =
43-
mockError(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
42+
ErrorsResultImpl error =
43+
mockResult(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
4444
reporter.formatErrors([error]);
4545
reporter.flush();
4646

@@ -49,7 +49,7 @@ main() {
4949
});
5050

5151
test('hint', () {
52-
AnalysisErrorInfo error = mockError(ErrorType.HINT, ErrorSeverity.INFO);
52+
ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
5353
reporter.formatErrors([error]);
5454
reporter.flush();
5555

@@ -58,7 +58,7 @@ main() {
5858
});
5959

6060
test('stats', () {
61-
AnalysisErrorInfo error = mockError(ErrorType.HINT, ErrorSeverity.INFO);
61+
ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
6262
reporter.formatErrors([error]);
6363
reporter.flush();
6464
stats.print(out);
@@ -70,7 +70,7 @@ main() {
7070
});
7171
}
7272

73-
MockAnalysisErrorInfo mockError(ErrorType type, ErrorSeverity severity) {
73+
ErrorsResultImpl mockResult(ErrorType type, ErrorSeverity severity) {
7474
// ErrorInfo
7575
var location = new CharacterLocation(3, 3);
7676
var lineInfo = new MockLineInfo(defaultLocation: location);
@@ -80,5 +80,6 @@ MockAnalysisErrorInfo mockError(ErrorType type, ErrorSeverity severity) {
8080
var source = new MockSource('/foo/bar/baz.dart');
8181
var error = new MockAnalysisError(source, code, 20, 'MSG');
8282

83-
return new MockAnalysisErrorInfo(lineInfo, [error]);
83+
return ErrorsResultImpl(
84+
null, source.fullName, null, lineInfo, false, [error]);
8485
}

0 commit comments

Comments
 (0)