OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library analyze_helper; | 5 library analyze_helper; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 import 'package:compiler/compiler.dart' as api; | 9 import 'package:compiler/compiler.dart' as api; |
10 import 'package:compiler/src/apiimpl.dart'; | 10 import 'package:compiler/src/apiimpl.dart'; |
11 import 'package:compiler/src/commandline_options.dart'; | 11 import 'package:compiler/src/commandline_options.dart'; |
12 import 'package:compiler/src/diagnostics/messages.dart' show | 12 import 'package:compiler/src/diagnostics/messages.dart' show |
13 Message, | 13 Message, |
14 MessageKind; | 14 MessageKind; |
15 import 'package:compiler/src/filenames.dart'; | 15 import 'package:compiler/src/filenames.dart'; |
16 import 'package:compiler/src/options.dart' show | 16 import 'package:compiler/src/options.dart' show |
17 CompilerOptions; | 17 CompilerOptions; |
18 import 'package:compiler/src/source_file_provider.dart'; | 18 import 'package:compiler/src/source_file_provider.dart'; |
19 import 'package:compiler/src/util/uri_extras.dart'; | 19 import 'package:compiler/src/util/uri_extras.dart'; |
| 20 import 'diagnostic_helper.dart'; |
20 | 21 |
21 /// Option for hiding whitelisted messages. | 22 /// Option for hiding whitelisted messages. |
22 const String HIDE_WHITELISTED = '--hide-whitelisted'; | 23 const String HIDE_WHITELISTED = '--hide-whitelisted'; |
23 | 24 |
24 /** | 25 /** |
25 * Map of whitelisted warnings and errors. | 26 * Map of whitelisted warnings and errors. |
26 * | 27 * |
27 * Only add a whitelisting together with a bug report to dartbug.com and add | 28 * Only add a whitelisting together with a bug report to dartbug.com and add |
28 * the bug issue number as a comment on the whitelisting. | 29 * the bug issue number as a comment on the whitelisting. |
29 * | 30 * |
30 * Use an identifiable suffix of the file uri as key. Use a fixed substring of | 31 * Use an identifiable suffix of the file uri as key. Use a fixed substring of |
31 * the error/warning message in the list of whitelistings for each file. | 32 * the error/warning message in the list of whitelistings for each file. |
32 */ | 33 */ |
33 // TODO(johnniwinther): Support canonical URIs as keys and message kinds as | 34 // TODO(johnniwinther): Support canonical URIs as keys and message kinds as |
34 // values. | 35 // values. |
35 | 36 |
36 class CollectingDiagnosticHandler extends FormattingDiagnosticHandler { | 37 class CollectingDiagnosticHandler extends FormattingDiagnosticHandler { |
37 bool hasWarnings = false; | 38 bool hasWarnings = false; |
38 bool hasHint = false; | 39 bool hasHint = false; |
39 bool hasErrors = false; | 40 bool hasErrors = false; |
40 bool lastWasWhitelisted = false; | 41 bool lastWasWhitelisted = false; |
41 bool showWhitelisted = true; | 42 bool showWhitelisted = true; |
42 | 43 |
43 Map<String, Map<dynamic/*String|MessageKind*/, int>> whiteListMap | 44 Map<String, Map<dynamic/*String|MessageKind*/, int>> whiteListMap |
44 = new Map<String, Map<dynamic/*String|MessageKind*/, int>>(); | 45 = new Map<String, Map<dynamic/*String|MessageKind*/, int>>(); |
45 List<MessageKind> skipList; | 46 List<MessageKind> skipList; |
| 47 List<CollectedMessage> collectedMessages = <CollectedMessage>[]; |
46 | 48 |
47 CollectingDiagnosticHandler( | 49 CollectingDiagnosticHandler( |
48 Map<String, List/*<String|MessageKind>*/> whiteList, | 50 Map<String, List/*<String|MessageKind>*/> whiteList, |
49 this.skipList, | 51 this.skipList, |
50 SourceFileProvider provider) | 52 SourceFileProvider provider) |
51 : super(provider) { | 53 : super(provider) { |
52 whiteList.forEach((String file, List/*<String|MessageKind>*/ messageParts) { | 54 whiteList.forEach((String file, List/*<String|MessageKind>*/ messageParts) { |
53 var useMap = new Map<dynamic/*String|MessageKind*/, int>(); | 55 var useMap = new Map<dynamic/*String|MessageKind*/, int>(); |
54 for (var messagePart in messageParts) { | 56 for (var messagePart in messageParts) { |
55 useMap[messagePart] = 0; | 57 useMap[messagePart] = 0; |
56 } | 58 } |
57 whiteListMap[file] = useMap; | 59 whiteListMap[file] = useMap; |
58 }); | 60 }); |
59 } | 61 } |
60 | 62 |
61 bool checkResults() { | 63 bool checkResults() { |
62 bool validWhiteListUse = checkWhiteListUse(); | 64 bool validWhiteListUse = checkWhiteListUse(); |
63 reportWhiteListUse(); | 65 reportWhiteListUse(); |
| 66 reportCollectedMessages(); |
64 return !hasWarnings && !hasHint && !hasErrors && validWhiteListUse; | 67 return !hasWarnings && !hasHint && !hasErrors && validWhiteListUse; |
65 } | 68 } |
66 | 69 |
67 bool checkWhiteListUse() { | 70 bool checkWhiteListUse() { |
68 bool allUsed = true; | 71 bool allUsed = true; |
69 for (String file in whiteListMap.keys) { | 72 for (String file in whiteListMap.keys) { |
70 for (var messagePart in whiteListMap[file].keys) { | 73 for (var messagePart in whiteListMap[file].keys) { |
71 if (whiteListMap[file][messagePart] == 0) { | 74 if (whiteListMap[file][messagePart] == 0) { |
72 print("Whitelisting '$messagePart' is unused in '$file'. " | 75 print("Whitelisting '$messagePart' is unused in '$file'. " |
73 "Remove the whitelisting from the whitelist map."); | 76 "Remove the whitelisting from the whitelist map."); |
74 allUsed = false; | 77 allUsed = false; |
75 } | 78 } |
76 } | 79 } |
77 } | 80 } |
78 return allUsed; | 81 return allUsed; |
79 } | 82 } |
80 | 83 |
| 84 void reportCollectedMessages() { |
| 85 if (collectedMessages.isNotEmpty) { |
| 86 print('----------------------------------------------------------------'); |
| 87 print('Unexpected messages:'); |
| 88 print('----------------------------------------------------------------'); |
| 89 for (CollectedMessage message in collectedMessages) { |
| 90 super.report(message.message, message.uri, message.begin, |
| 91 message.end, message.text, message.kind); |
| 92 } |
| 93 print('----------------------------------------------------------------'); |
| 94 } |
| 95 } |
| 96 |
81 void reportWhiteListUse() { | 97 void reportWhiteListUse() { |
82 for (String file in whiteListMap.keys) { | 98 for (String file in whiteListMap.keys) { |
83 for (var messagePart in whiteListMap[file].keys) { | 99 for (var messagePart in whiteListMap[file].keys) { |
84 int useCount = whiteListMap[file][messagePart]; | 100 int useCount = whiteListMap[file][messagePart]; |
85 print("Whitelisted message '$messagePart' suppressed $useCount " | 101 print("Whitelisted message '$messagePart' suppressed $useCount " |
86 "time(s) in '$file'."); | 102 "time(s) in '$file'."); |
87 } | 103 } |
88 } | 104 } |
89 } | 105 } |
90 | 106 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 super.report(message, uri, begin, end, text, kind); | 165 super.report(message, uri, begin, end, text, kind); |
150 } | 166 } |
151 return; | 167 return; |
152 } | 168 } |
153 hasErrors = true; | 169 hasErrors = true; |
154 } | 170 } |
155 if (kind == api.Diagnostic.INFO && lastWasWhitelisted) { | 171 if (kind == api.Diagnostic.INFO && lastWasWhitelisted) { |
156 return; | 172 return; |
157 } | 173 } |
158 lastWasWhitelisted = false; | 174 lastWasWhitelisted = false; |
| 175 if (kind != api.Diagnostic.VERBOSE_INFO) { |
| 176 collectedMessages.add(new CollectedMessage( |
| 177 message, uri, begin, end, text, kind)); |
| 178 } |
159 super.report(message, uri, begin, end, text, kind); | 179 super.report(message, uri, begin, end, text, kind); |
160 } | 180 } |
161 } | 181 } |
162 | 182 |
163 typedef bool CheckResults(CompilerImpl compiler, | 183 typedef bool CheckResults(CompilerImpl compiler, |
164 CollectingDiagnosticHandler handler); | 184 CollectingDiagnosticHandler handler); |
165 | 185 |
166 enum AnalysisMode { | 186 enum AnalysisMode { |
167 /// Analyze all declarations in all libraries in one go. | 187 /// Analyze all declarations in all libraries in one go. |
168 ALL, | 188 ALL, |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 if (checkResults != null) { | 280 if (checkResults != null) { |
261 result = checkResults(compiler, handler); | 281 result = checkResults(compiler, handler); |
262 } else { | 282 } else { |
263 result = handler.checkResults(); | 283 result = handler.checkResults(); |
264 } | 284 } |
265 if (!result) { | 285 if (!result) { |
266 print(MESSAGE); | 286 print(MESSAGE); |
267 exit(1); | 287 exit(1); |
268 } | 288 } |
269 } | 289 } |
OLD | NEW |