Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Side by Side Diff: lib/src/report.dart

Issue 1174643003: expose strong checker API, for use by analyzer_cli (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/options.dart ('k') | lib/src/summary.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// Summarizes the information produced by the checker. 5 /// Summarizes the information produced by the checker.
6 library dev_compiler.src.report; 6 library dev_compiler.src.report;
7 7
8 import 'dart:math' show max; 8 import 'dart:math' show max;
9 9
10 import 'package:analyzer/src/generated/ast.dart' show AstNode, CompilationUnit; 10 import 'package:analyzer/src/generated/ast.dart' show AstNode, CompilationUnit;
(...skipping 24 matching lines...) Expand all
35 final int begin; 35 final int begin;
36 36
37 /// Offset where the error message ends in the tracked source file. 37 /// Offset where the error message ends in the tracked source file.
38 final int end; 38 final int end;
39 39
40 const Message(this.message, this.level, this.begin, this.end); 40 const Message(this.message, this.level, this.begin, this.end);
41 } 41 }
42 42
43 // Interface used to report error messages from the checker. 43 // Interface used to report error messages from the checker.
44 abstract class CheckerReporter { 44 abstract class CheckerReporter {
45 void log(Message message);
46 }
47
48 // Interface used to report error messages from the compiler.
49 abstract class CompilerReporter extends CheckerReporter {
45 final AnalysisContext _context; 50 final AnalysisContext _context;
46 CompilationUnit _unit; 51 CompilationUnit _unit;
47 Source _unitSource; 52 Source _unitSource;
48 53
49 CheckerReporter(this._context); 54 CompilerReporter(this._context);
50 55
51 /// Called when starting to process a library. 56 /// Called when starting to process a library.
52 void enterLibrary(Uri uri); 57 void enterLibrary(Uri uri);
53 void leaveLibrary(); 58 void leaveLibrary();
54 59
55 /// Called when starting to process an HTML source file. 60 /// Called when starting to process an HTML source file.
56 void enterHtml(Uri uri); 61 void enterHtml(Uri uri);
57 void leaveHtml(); 62 void leaveHtml();
58 63
59 /// Called when starting to process a source. All subsequent log entries must 64 /// Called when starting to process a source. All subsequent log entries must
60 /// belong to this source until the next call to enterSource. 65 /// belong to this source until the next call to enterSource.
61 void enterCompilationUnit(CompilationUnit unit, [Source source]) { 66 void enterCompilationUnit(CompilationUnit unit, [Source source]) {
62 _unit = unit; 67 _unit = unit;
63 _unitSource = source; 68 _unitSource = source;
64 } 69 }
65 void leaveCompilationUnit() { 70 void leaveCompilationUnit() {
66 _unit = null; 71 _unit = null;
67 _unitSource = null; 72 _unitSource = null;
68 } 73 }
69 74
70 void log(Message message);
71
72 // Called in server-mode. 75 // Called in server-mode.
73 void clearLibrary(Uri uri); 76 void clearLibrary(Uri uri);
74 void clearHtml(Uri uri); 77 void clearHtml(Uri uri);
75 void clearAll(); 78 void clearAll();
76 79
77 SourceSpanWithContext _createSpan(int start, int end) => 80 SourceSpanWithContext _createSpan(int start, int end) =>
78 createSpan(_context, _unit, start, end, _unitSource); 81 createSpan(_context, _unit, start, end, _unitSource);
79 } 82 }
80 83
81 final _checkerLogger = new Logger('dev_compiler.checker'); 84 final _checkerLogger = new Logger('dev_compiler.checker');
82 85
83 /// Simple reporter that logs checker messages as they are seen. 86 /// Simple reporter that logs checker messages as they are seen.
84 class LogReporter extends CheckerReporter { 87 class LogReporter extends CompilerReporter {
85 final bool useColors; 88 final bool useColors;
86 Source _current; 89 Source _current;
87 90
88 LogReporter(AnalysisContext context, {this.useColors: false}) 91 LogReporter(AnalysisContext context, {this.useColors: false})
89 : super(context); 92 : super(context);
90 93
91 void enterLibrary(Uri uri) {} 94 void enterLibrary(Uri uri) {}
92 void leaveLibrary() {} 95 void leaveLibrary() {}
93 96
94 void enterHtml(Uri uri) {} 97 void enterHtml(Uri uri) {}
(...skipping 10 matching lines...) Expand all
105 final text = '[${message.runtimeType}] ${message.message}'; 108 final text = '[${message.runtimeType}] ${message.message}';
106 _checkerLogger.log(level, span.message(text, color: color)); 109 _checkerLogger.log(level, span.message(text, color: color));
107 } 110 }
108 111
109 void clearLibrary(Uri uri) {} 112 void clearLibrary(Uri uri) {}
110 void clearHtml(Uri uri) {} 113 void clearHtml(Uri uri) {}
111 void clearAll() {} 114 void clearAll() {}
112 } 115 }
113 116
114 /// A reporter that gathers all the information in a [GlobalSummary]. 117 /// A reporter that gathers all the information in a [GlobalSummary].
115 class SummaryReporter extends CheckerReporter { 118 class SummaryReporter extends CompilerReporter {
116 GlobalSummary result = new GlobalSummary(); 119 GlobalSummary result = new GlobalSummary();
117 IndividualSummary _current; 120 IndividualSummary _current;
118 final Level _level; 121 final Level _level;
119 122
120 SummaryReporter(AnalysisContext context, [this._level = Level.ALL]) 123 SummaryReporter(AnalysisContext context, [this._level = Level.ALL])
121 : super(context); 124 : super(context);
122 125
123 void enterLibrary(Uri uri) { 126 void enterLibrary(Uri uri) {
124 var container; 127 var container;
125 if (uri.scheme == 'package') { 128 if (uri.scheme == 'package') {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 185
183 /// Produces a string representation of the summary. 186 /// Produces a string representation of the summary.
184 String summaryToString(GlobalSummary summary) { 187 String summaryToString(GlobalSummary summary) {
185 var counter = new _Counter(); 188 var counter = new _Counter();
186 summary.accept(counter); 189 summary.accept(counter);
187 190
188 var table = new _Table(); 191 var table = new _Table();
189 // Declare columns and add header 192 // Declare columns and add header
190 table.declareColumn('package'); 193 table.declareColumn('package');
191 table.declareColumn('AnalyzerError', abbreviate: true); 194 table.declareColumn('AnalyzerError', abbreviate: true);
192 var activeInfoTypes = 195
193 infoTypes.where((type) => counter.totals['$type'] != null); 196 var activeInfoTypes = counter.totals.keys;
194 activeInfoTypes 197 activeInfoTypes.forEach((t) => table.declareColumn(t, abbreviate: true));
195 .forEach((type) => table.declareColumn('$type', abbreviate: true));
196 table.declareColumn('LinesOfCode', abbreviate: true); 198 table.declareColumn('LinesOfCode', abbreviate: true);
197 table.addHeader(); 199 table.addHeader();
198 200
199 // Add entries for each package 201 // Add entries for each package
200 appendCount(count) => table.addEntry(count == null ? 0 : count); 202 appendCount(count) => table.addEntry(count == null ? 0 : count);
201 for (var package in counter.errorCount.keys) { 203 for (var package in counter.errorCount.keys) {
202 appendCount(package); 204 appendCount(package);
203 appendCount(counter.errorCount[package]['AnalyzerError']); 205 appendCount(counter.errorCount[package]['AnalyzerError']);
204 activeInfoTypes 206 activeInfoTypes.forEach((t) => appendCount(counter.errorCount[package][t]));
205 .forEach((e) => appendCount(counter.errorCount[package]['$e']));
206 appendCount(counter.linesOfCode[package]); 207 appendCount(counter.linesOfCode[package]);
207 } 208 }
208 209
209 // Add totals, percents and a new header for quick reference 210 // Add totals, percents and a new header for quick reference
210 table.addEmptyRow(); 211 table.addEmptyRow();
211 table.addHeader(); 212 table.addHeader();
212 table.addEntry('total'); 213 table.addEntry('total');
213 appendCount(counter.totals['AnalyzerError']); 214 appendCount(counter.totals['AnalyzerError']);
214 activeInfoTypes.forEach((type) => appendCount(counter.totals['$type'])); 215 activeInfoTypes.forEach((t) => appendCount(counter.totals[t]));
215 appendCount(counter.totalLinesOfCode); 216 appendCount(counter.totalLinesOfCode);
216 217
217 appendPercent(count, total) { 218 appendPercent(count, total) {
218 if (count == null) count = 0; 219 if (count == null) count = 0;
219 var value = (count * 100 / total).toStringAsFixed(2); 220 var value = (count * 100 / total).toStringAsFixed(2);
220 table.addEntry(value); 221 table.addEntry(value);
221 } 222 }
222 223
223 var totalLOC = counter.totalLinesOfCode; 224 var totalLOC = counter.totalLinesOfCode;
224 table.addEntry('%'); 225 table.addEntry('%');
225 appendPercent(counter.totals['AnalyzerError'], totalLOC); 226 appendPercent(counter.totals['AnalyzerError'], totalLOC);
226 activeInfoTypes 227 activeInfoTypes.forEach((t) => appendPercent(counter.totals[t], totalLOC));
227 .forEach((type) => appendPercent(counter.totals['$type'], totalLOC));
228 appendCount(100); 228 appendCount(100);
229 229
230 return table.toString(); 230 return table.toString();
231 } 231 }
232 232
233 /// Helper class to combine all the information in table form. 233 /// Helper class to combine all the information in table form.
234 class _Table { 234 class _Table {
235 int _totalColumns = 0; 235 int _totalColumns = 0;
236 int get totalColumns => _totalColumns; 236 int get totalColumns => _totalColumns;
237 237
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 372
373 visitMessage(MessageSummary message) { 373 visitMessage(MessageSummary message) {
374 var kind = message.kind; 374 var kind = message.kind;
375 errorCount.putIfAbsent(currentPackage, () => <String, int>{}); 375 errorCount.putIfAbsent(currentPackage, () => <String, int>{});
376 errorCount[currentPackage].putIfAbsent(kind, () => 0); 376 errorCount[currentPackage].putIfAbsent(kind, () => 0);
377 errorCount[currentPackage][kind]++; 377 errorCount[currentPackage][kind]++;
378 totals.putIfAbsent(kind, () => 0); 378 totals.putIfAbsent(kind, () => 0);
379 totals[kind]++; 379 totals[kind]++;
380 } 380 }
381 } 381 }
OLDNEW
« no previous file with comments | « lib/src/options.dart ('k') | lib/src/summary.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698