Index: pkg/compiler/lib/src/typechecker.dart |
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart |
index 9161102df06aa1d65ca41afbce730446967dd936..fe017effa61383c5b570091cac3de6260f1d02fd 100644 |
--- a/pkg/compiler/lib/src/typechecker.dart |
+++ b/pkg/compiler/lib/src/typechecker.dart |
@@ -17,7 +17,8 @@ import 'constants/values.dart'; |
import 'core_types.dart'; |
import 'dart_types.dart'; |
import 'diagnostics/diagnostic_listener.dart' show |
- DiagnosticMessage; |
+ DiagnosticMessage, |
+ DiagnosticReporter; |
import 'diagnostics/invariant.dart' show |
invariant; |
import 'diagnostics/messages.dart'; |
@@ -68,7 +69,7 @@ class TypeCheckerTask extends CompilerTask { |
if (element.isClass) return; |
if (element.isTypedef) return; |
ResolvedAst resolvedAst = element.resolvedAst; |
- compiler.withCurrentElement(element.implementation, () { |
+ reporter.withCurrentElement(element.implementation, () { |
measure(() { |
TypeCheckerVisitor visitor = new TypeCheckerVisitor( |
compiler, resolvedAst.elements, compiler.types); |
@@ -306,6 +307,9 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
ExecutableElement executableContext; |
CoreTypes get coreTypes => compiler.coreTypes; |
+ |
+ DiagnosticReporter get reporter => compiler.reporter; |
+ |
Resolution get resolution => compiler.resolution; |
InterfaceType get intType => coreTypes.intType; |
@@ -397,16 +401,16 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
reportTypeWarning(Spannable spannable, MessageKind kind, |
[Map arguments = const {}]) { |
- compiler.reportWarningMessage(spannable, kind, arguments); |
+ reporter.reportWarningMessage(spannable, kind, arguments); |
} |
reportMessage(Spannable spannable, MessageKind kind, |
Map arguments, |
{bool isHint: false}) { |
if (isHint) { |
- compiler.reportHintMessage(spannable, kind, arguments); |
+ reporter.reportHintMessage(spannable, kind, arguments); |
} else { |
- compiler.reportWarningMessage(spannable, kind, arguments); |
+ reporter.reportWarningMessage(spannable, kind, arguments); |
} |
} |
@@ -414,7 +418,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
if (!reportedTypePromotions.contains(typePromotion)) { |
reportedTypePromotions.add(typePromotion); |
for (TypePromotionMessage message in typePromotion.messages) { |
- compiler.reportHint(message.hint, message.infos); |
+ reporter.reportHint(message.hint, message.infos); |
} |
} |
} |
@@ -440,9 +444,9 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
if (node == null) { |
final String error = 'Unexpected node: null'; |
if (lastSeenNode != null) { |
- compiler.internalError(lastSeenNode, error); |
+ reporter.internalError(lastSeenNode, error); |
} else { |
- compiler.internalError(executableContext, error); |
+ reporter.internalError(executableContext, error); |
} |
} else { |
lastSeenNode = node; |
@@ -452,7 +456,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
DartType result = node.accept(this); |
analyzingInitializer = previouslyInitializer; |
if (result == null) { |
- compiler.internalError(node, 'Type is null.'); |
+ reporter.internalError(node, 'Type is null.'); |
} |
return _record(node, result); |
} |
@@ -464,13 +468,13 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
List<Node> potentialMutationsIn = |
elements.getPotentialMutationsIn(node, variable); |
if (!potentialMutationsIn.isEmpty) { |
- DiagnosticMessage hint = compiler.createMessage( |
+ DiagnosticMessage hint = reporter.createMessage( |
typePromotion.node, |
MessageKind.POTENTIAL_MUTATION, |
{'variableName': variableName, 'shownType': typePromotion.type}); |
List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
for (Node mutation in potentialMutationsIn) { |
- infos.add(compiler.createMessage(mutation, |
+ infos.add(reporter.createMessage(mutation, |
MessageKind.POTENTIAL_MUTATION_HERE, |
{'variableName': variableName})); |
} |
@@ -479,13 +483,13 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
List<Node> potentialMutationsInClosures = |
elements.getPotentialMutationsInClosure(variable); |
if (!potentialMutationsInClosures.isEmpty) { |
- DiagnosticMessage hint = compiler.createMessage( |
+ DiagnosticMessage hint = reporter.createMessage( |
typePromotion.node, |
MessageKind.POTENTIAL_MUTATION_IN_CLOSURE, |
{'variableName': variableName, 'shownType': typePromotion.type}); |
List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
for (Node mutation in potentialMutationsInClosures) { |
- infos.add(compiler.createMessage( |
+ infos.add(reporter.createMessage( |
mutation, |
MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE, |
{'variableName': variableName})); |
@@ -496,19 +500,19 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
List<Node> accesses = elements.getAccessesByClosureIn(node, variable); |
List<Node> mutations = elements.getPotentialMutations(variable); |
if (!accesses.isEmpty && !mutations.isEmpty) { |
- DiagnosticMessage hint = compiler.createMessage( |
+ DiagnosticMessage hint = reporter.createMessage( |
typePromotion.node, |
MessageKind.ACCESSED_IN_CLOSURE, |
{'variableName': variableName, 'shownType': typePromotion.type}); |
List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
for (Node access in accesses) { |
- infos.add(compiler.createMessage( |
+ infos.add(reporter.createMessage( |
access, |
MessageKind.ACCESSED_IN_CLOSURE_HERE, |
{'variableName': variableName})); |
} |
for (Node mutation in mutations) { |
- infos.add(compiler.createMessage( |
+ infos.add(reporter.createMessage( |
mutation, |
MessageKind.POTENTIAL_MUTATION_HERE, |
{'variableName': variableName})); |
@@ -563,12 +567,12 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
{bool isConst: false}) { |
if (!types.isAssignable(from, to)) { |
if (compiler.enableTypeAssertions && isConst) { |
- compiler.reportErrorMessage( |
+ reporter.reportErrorMessage( |
spannable, |
MessageKind.NOT_ASSIGNABLE, |
{'fromType': from, 'toType': to}); |
} else { |
- compiler.reportWarningMessage( |
+ reporter.reportWarningMessage( |
spannable, |
MessageKind.NOT_ASSIGNABLE, |
{'fromType': from, 'toType': to}); |
@@ -900,17 +904,17 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
if (declaration == null) { |
declaration = type.element; |
} else if (type.isTypedef) { |
- infos.add(compiler.createMessage( |
+ infos.add(reporter.createMessage( |
declaration, |
MessageKind.THIS_IS_THE_DECLARATION, |
{'name': element.name})); |
declaration = type.element; |
} |
if (declaration != null) { |
- infos.add(compiler.createMessage( |
+ infos.add(reporter.createMessage( |
declaration, MessageKind.THIS_IS_THE_METHOD)); |
} |
- compiler.reportWarning(warning, infos); |
+ reporter.reportWarning(warning, infos); |
} |
/// Report a warning on [node] if [argumentType] is not assignable to |
@@ -919,7 +923,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
DartType argumentType, |
DartType parameterType) { |
if (!types.isAssignable(argumentType, parameterType)) { |
- reportWarning(compiler.createMessage( |
+ reportWarning(reporter.createMessage( |
node, |
MessageKind.NOT_ASSIGNABLE, |
{'fromType': argumentType, 'toType': parameterType})); |
@@ -941,7 +945,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
if (namedParameterType == null) { |
// TODO(johnniwinther): Provide better information on the called |
// function. |
- reportWarning(compiler.createMessage( |
+ reportWarning(reporter.createMessage( |
argument, |
MessageKind.NAMED_ARGUMENT_NOT_FOUND, |
{'argumentName': argumentName})); |
@@ -959,7 +963,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
// TODO(johnniwinther): Provide better information on the |
// called function. |
- reportWarning(compiler.createMessage( |
+ reportWarning(reporter.createMessage( |
argument, MessageKind.ADDITIONAL_ARGUMENT)); |
DartType argumentType = analyze(argument); |
@@ -981,7 +985,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
if (parameterTypes.moveNext()) { |
// TODO(johnniwinther): Provide better information on the called |
// function. |
- reportWarning(compiler.createMessage( |
+ reportWarning(reporter.createMessage( |
send, MessageKind.MISSING_ARGUMENT, |
{'argumentType': parameterTypes.current})); |
} |
@@ -1089,7 +1093,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
} else if (element.isGetter || element.isSetter) { |
return createResolvedAccess(node, name, element); |
} else { |
- compiler.internalError(element, |
+ reporter.internalError(element, |
'Unexpected element kind ${element.kind}.'); |
return null; |
} |
@@ -1122,7 +1126,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
computeAccess(node, name, element, memberKind, |
lookupClassMember: lookupClassMember).computeType(resolution); |
if (type == null) { |
- compiler.internalError(node, 'Type is null on access of $name on $node.'); |
+ reporter.internalError(node, 'Type is null on access of $name on $node.'); |
} |
return type; |
} |
@@ -1241,7 +1245,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
if (!types.isMoreSpecific(shownType, knownType)) { |
String variableName = variable.name; |
if (!types.isSubtype(shownType, knownType)) { |
- typePromotion.addHint(compiler.createMessage( |
+ typePromotion.addHint(reporter.createMessage( |
node, |
MessageKind.NOT_MORE_SPECIFIC_SUBTYPE, |
{'variableName': variableName, |
@@ -1251,7 +1255,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
DartType shownTypeSuggestion = |
computeMoreSpecificType(shownType, knownType); |
if (shownTypeSuggestion != null) { |
- typePromotion.addHint(compiler.createMessage( |
+ typePromotion.addHint(reporter.createMessage( |
node, |
MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, |
{'variableName': variableName, |
@@ -1259,7 +1263,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
'shownTypeSuggestion': shownTypeSuggestion, |
'knownType': knownType})); |
} else { |
- typePromotion.addHint(compiler.createMessage( |
+ typePromotion.addHint(reporter.createMessage( |
node, |
MessageKind.NOT_MORE_SPECIFIC, |
{'variableName': variableName, |
@@ -1548,7 +1552,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
case '<<=': operatorName = '<<'; break; |
case '>>=': operatorName = '>>'; break; |
default: |
- compiler.internalError(node, 'Unexpected assignment operator $name.'); |
+ reporter.internalError(node, 'Unexpected assignment operator $name.'); |
} |
if (node.isIndex) { |
// base[key] o= value for some operator o. |
@@ -1967,7 +1971,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
} |
unreferencedFields.addAll(enumValues.values); |
if (!unreferencedFields.isEmpty) { |
- compiler.reportWarningMessage( |
+ reporter.reportWarningMessage( |
node, MessageKind.MISSING_ENUM_CASES, |
{'enumType': expressionType, |
'enumValues': unreferencedFields.map( |
@@ -2004,7 +2008,7 @@ class TypeCheckerVisitor extends Visitor<DartType> { |
} |
visitNode(Node node) { |
- compiler.internalError(node, |
+ reporter.internalError(node, |
'Unexpected node ${node.getObjectDescription()} in the type checker.'); |
} |
} |