Index: pkg/compiler/lib/src/compiler.dart |
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart |
index 0ccc51ae8d132fa41d54e278714fc11cb4fcc755..f73f6966dfe3733cb1625c473777b1162f81d0e5 100644 |
--- a/pkg/compiler/lib/src/compiler.dart |
+++ b/pkg/compiler/lib/src/compiler.dart |
@@ -138,7 +138,7 @@ import 'util/util.dart' show |
import 'world.dart' show |
World; |
-abstract class Compiler implements DiagnosticListener { |
+abstract class Compiler extends DiagnosticListener { |
final Stopwatch totalCompileTime = new Stopwatch(); |
int nextFreeClassId = 0; |
@@ -616,10 +616,12 @@ abstract class Compiler implements DiagnosticListener { |
internalError(spannable, "$methodName not implemented."); |
} |
- void internalError(Spannable node, reason) { |
+ internalError(Spannable node, reason) { |
String message = tryToString(reason); |
reportDiagnosticInternal( |
- node, MessageKind.GENERIC, {'text': message}, api.Diagnostic.CRASH); |
+ createMessage(node, MessageKind.GENERIC, {'text': message}), |
+ const <DiagnosticMessage>[], |
+ api.Diagnostic.CRASH); |
throw 'Internal Error: $message'; |
} |
@@ -627,8 +629,8 @@ abstract class Compiler implements DiagnosticListener { |
if (hasCrashed) return; |
hasCrashed = true; |
reportDiagnostic( |
- element, |
- MessageTemplate.TEMPLATES[MessageKind.COMPILER_CRASHED].message(), |
+ createMessage(element, MessageKind.COMPILER_CRASHED), |
+ const <DiagnosticMessage>[], |
api.Diagnostic.CRASH); |
pleaseReportCrash(); |
} |
@@ -691,9 +693,11 @@ abstract class Compiler implements DiagnosticListener { |
} |
void log(message) { |
- reportDiagnostic(null, |
- MessageTemplate.TEMPLATES[MessageKind.GENERIC] |
- .message({'text': '$message'}), |
+ Message msg = MessageTemplate.TEMPLATES[MessageKind.GENERIC] |
+ .message({'text': '$message'}); |
+ reportDiagnostic( |
+ new DiagnosticMessage(null, null, msg), |
+ const <DiagnosticMessage>[], |
api.Diagnostic.VERBOSE_INFO); |
} |
@@ -708,9 +712,10 @@ abstract class Compiler implements DiagnosticListener { |
reportAssertionFailure(error); |
} else { |
reportDiagnostic( |
- new SourceSpan(uri, 0, 0), |
- MessageTemplate.TEMPLATES[MessageKind.COMPILER_CRASHED] |
- .message(), |
+ createMessage( |
+ new SourceSpan(uri, 0, 0), |
+ MessageKind.COMPILER_CRASHED), |
+ const <DiagnosticMessage>[], |
api.Diagnostic.CRASH); |
} |
pleaseReportCrash(); |
@@ -875,11 +880,13 @@ abstract class Compiler implements DiagnosticListener { |
Set<String> importChains = |
computeImportChainsFor(loadedLibraries, Uris.dart_mirrors); |
if (!backend.supportsReflection) { |
- reportError(NO_LOCATION_SPANNABLE, |
- MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND); |
+ reportErrorMessage( |
+ NO_LOCATION_SPANNABLE, |
+ MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND); |
} else { |
- reportWarning(NO_LOCATION_SPANNABLE, |
- MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, |
+ reportWarningMessage( |
+ NO_LOCATION_SPANNABLE, |
+ MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, |
{'importChain': importChains.join( |
MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING)}); |
} |
@@ -1086,7 +1093,7 @@ abstract class Compiler implements DiagnosticListener { |
if (errorElement != null && |
errorElement.isSynthesized && |
!mainApp.isSynthesized) { |
- reportWarning( |
+ reportWarningMessage( |
errorElement, errorElement.messageKind, |
errorElement.messageArguments); |
} |
@@ -1154,12 +1161,14 @@ abstract class Compiler implements DiagnosticListener { |
kind = MessageKind.HIDDEN_WARNINGS; |
} |
MessageTemplate template = MessageTemplate.TEMPLATES[kind]; |
- reportDiagnostic(null, |
- template.message( |
- {'warnings': info.warnings, |
- 'hints': info.hints, |
- 'uri': uri}, |
- terseDiagnostics), |
+ Message message = template.message( |
+ {'warnings': info.warnings, |
+ 'hints': info.hints, |
+ 'uri': uri}, |
+ terseDiagnostics); |
+ reportDiagnostic( |
+ new DiagnosticMessage(null, null, message), |
+ const <DiagnosticMessage>[], |
api.Diagnostic.HINT); |
}); |
} |
@@ -1326,7 +1335,7 @@ abstract class Compiler implements DiagnosticListener { |
} |
log('Excess resolution work: ${resolved.length}.'); |
for (Element e in resolved) { |
- reportWarning(e, |
+ reportWarningMessage(e, |
MessageKind.GENERIC, |
{'text': 'Warning: $e resolved but not compiled.'}); |
} |
@@ -1393,38 +1402,51 @@ abstract class Compiler implements DiagnosticListener { |
return backend.codegen(work); |
} |
- void reportError(Spannable node, |
- MessageKind messageKind, |
- [Map arguments = const {}]) { |
- reportDiagnosticInternal( |
- node, messageKind, arguments, api.Diagnostic.ERROR); |
+ DiagnosticMessage createMessage( |
+ Spannable spannable, |
+ MessageKind messageKind, |
+ [Map arguments = const {}]) { |
+ SourceSpan span = spanFromSpannable(spannable); |
+ MessageTemplate template = MessageTemplate.TEMPLATES[messageKind]; |
+ Message message = template.message(arguments, terseDiagnostics); |
+ return new DiagnosticMessage(span, spannable, message); |
} |
- void reportWarning(Spannable node, MessageKind messageKind, |
- [Map arguments = const {}]) { |
- reportDiagnosticInternal( |
- node, messageKind, arguments, api.Diagnostic.WARNING); |
+ void reportError( |
+ DiagnosticMessage message, |
+ [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) { |
+ reportDiagnosticInternal(message, infos, api.Diagnostic.ERROR); |
} |
- void reportInfo(Spannable node, MessageKind messageKind, |
- [Map arguments = const {}]) { |
- reportDiagnosticInternal(node, messageKind, arguments, api.Diagnostic.INFO); |
+ void reportWarning( |
+ DiagnosticMessage message, |
+ [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) { |
+ reportDiagnosticInternal(message, infos, api.Diagnostic.WARNING); |
} |
- void reportHint(Spannable node, MessageKind messageKind, |
+ void reportHint( |
+ DiagnosticMessage message, |
+ [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) { |
+ reportDiagnosticInternal(message, infos, api.Diagnostic.HINT); |
+ } |
+ |
+ @deprecated |
+ void reportInfo(Spannable node, MessageKind messageKind, |
[Map arguments = const {}]) { |
- reportDiagnosticInternal(node, messageKind, arguments, api.Diagnostic.HINT); |
+ reportDiagnosticInternal( |
+ createMessage(node, messageKind, arguments), |
+ const <DiagnosticMessage>[], |
+ api.Diagnostic.INFO); |
} |
- void reportDiagnosticInternal(Spannable node, |
- MessageKind messageKind, |
- Map arguments, |
+ void reportDiagnosticInternal(DiagnosticMessage message, |
+ List<DiagnosticMessage> infos, |
api.Diagnostic kind) { |
- if (!showPackageWarnings && node != NO_LOCATION_SPANNABLE) { |
+ if (!showPackageWarnings && message.spannable != NO_LOCATION_SPANNABLE) { |
switch (kind) { |
case api.Diagnostic.WARNING: |
case api.Diagnostic.HINT: |
- Element element = elementFromSpannable(node); |
+ Element element = elementFromSpannable(message.spannable); |
if (!inUserCode(element, assumeInUserCode: true)) { |
Uri uri = getCanonicalUri(element); |
SuppressionInfo info = |
@@ -1446,22 +1468,20 @@ abstract class Compiler implements DiagnosticListener { |
} |
} |
lastDiagnosticWasFiltered = false; |
- MessageTemplate template = MessageTemplate.TEMPLATES[messageKind]; |
- reportDiagnostic( |
- node, |
- template.message(arguments, terseDiagnostics), |
- kind); |
+ reportDiagnostic(message, infos, kind); |
} |
- void reportDiagnostic(Spannable span, |
- Message message, |
+ void reportDiagnostic(DiagnosticMessage message, |
+ List<DiagnosticMessage> infos, |
api.Diagnostic kind); |
void reportAssertionFailure(SpannableAssertionFailure ex) { |
String message = (ex.message != null) ? tryToString(ex.message) |
: tryToString(ex); |
reportDiagnosticInternal( |
- ex.node, MessageKind.GENERIC, {'text': message}, api.Diagnostic.CRASH); |
+ createMessage(ex.node, MessageKind.GENERIC, {'text': message}), |
+ const <DiagnosticMessage>[], |
+ api.Diagnostic.CRASH); |
} |
SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) { |
@@ -1598,20 +1618,20 @@ abstract class Compiler implements DiagnosticListener { |
if (member.isErroneous) return; |
if (member.isFunction) { |
if (!enqueuer.resolution.hasBeenResolved(member)) { |
- reportHint(member, MessageKind.UNUSED_METHOD, |
- {'name': member.name}); |
+ reportHintMessage( |
+ member, MessageKind.UNUSED_METHOD, {'name': member.name}); |
} |
} else if (member.isClass) { |
if (!member.isResolved) { |
- reportHint(member, MessageKind.UNUSED_CLASS, |
- {'name': member.name}); |
+ reportHintMessage( |
+ member, MessageKind.UNUSED_CLASS, {'name': member.name}); |
} else { |
member.forEachLocalMember(checkLive); |
} |
} else if (member.isTypedef) { |
if (!member.isResolved) { |
- reportHint(member, MessageKind.UNUSED_TYPEDEF, |
- {'name': member.name}); |
+ reportHintMessage( |
+ member, MessageKind.UNUSED_TYPEDEF, {'name': member.name}); |
} |
} |
} |