Index: pkg/compiler/lib/src/resolution/members.dart |
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart |
index 168013c9884591f33439ee3cc0669d9d2d2befd1..85467006d13f4b8126daa2731ec47d13017b6105 100644 |
--- a/pkg/compiler/lib/src/resolution/members.dart |
+++ b/pkg/compiler/lib/src/resolution/members.dart |
@@ -14,6 +14,8 @@ import '../constants/expressions.dart'; |
import '../constants/values.dart'; |
import '../core_types.dart'; |
import '../dart_types.dart'; |
+import '../diagnostics/diagnostic_listener.dart' show |
+ DiagnosticMessage; |
import '../diagnostics/invariant.dart' show |
invariant; |
import '../diagnostics/messages.dart' show |
@@ -208,19 +210,20 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
Element reportLookupErrorIfAny(Element result, Node node, String name) { |
if (!Elements.isUnresolved(result)) { |
if (!inInstanceContext && result.isInstanceMember) { |
- compiler.reportError( |
+ compiler.reportErrorMessage( |
node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': name}); |
return new ErroneousElementX(MessageKind.NO_INSTANCE_AVAILABLE, |
{'name': name}, |
name, enclosingElement); |
} else if (result.isAmbiguous) { |
AmbiguousElement ambiguous = result; |
- compiler.reportError( |
- node, ambiguous.messageKind, ambiguous.messageArguments); |
- ambiguous.diagnose(enclosingElement, compiler); |
- return new ErroneousElementX(ambiguous.messageKind, |
- ambiguous.messageArguments, |
- name, enclosingElement); |
+ return reportAndCreateErroneousElement( |
+ node, |
+ name, |
+ ambiguous.messageKind, |
+ ambiguous.messageArguments, |
+ infos: ambiguous.computeInfos(enclosingElement, compiler), |
+ isError: true); |
} |
} |
return result; |
@@ -301,11 +304,14 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
String name, |
MessageKind kind, |
Map arguments, |
- {bool isError: false}) { |
+ {List<DiagnosticMessage> infos: const <DiagnosticMessage>[], |
+ bool isError: false}) { |
if (isError) { |
- compiler.reportError(node, kind, arguments); |
+ compiler.reportError( |
+ compiler.createMessage(node, kind, arguments), infos); |
} else { |
- compiler.reportWarning(node, kind, arguments); |
+ compiler.reportWarning( |
+ compiler.createMessage(node, kind, arguments), infos); |
} |
// TODO(ahe): Use [allowedCategory] to synthesize a more precise subclass |
// of [ErroneousElementX]. For example, [ErroneousFieldElementX], |
@@ -354,15 +360,18 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
ResolutionResult visitIdentifier(Identifier node) { |
if (node.isThis()) { |
if (!inInstanceContext) { |
- error(node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': node}); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': node}); |
} |
return const NoneResult(); |
} else if (node.isSuper()) { |
if (!inInstanceContext) { |
- error(node, MessageKind.NO_SUPER_IN_STATIC); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.NO_SUPER_IN_STATIC); |
} |
if ((ElementCategory.SUPER & allowedCategory) == 0) { |
- error(node, MessageKind.INVALID_USE_OF_SUPER); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.INVALID_USE_OF_SUPER); |
} |
return const NoneResult(); |
} else { |
@@ -448,7 +457,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
Element enclosingElement = function.enclosingElement; |
if (node.modifiers.isStatic && |
enclosingElement.kind != ElementKind.CLASS) { |
- compiler.reportError(node, MessageKind.ILLEGAL_STATIC); |
+ compiler.reportErrorMessage(node, MessageKind.ILLEGAL_STATIC); |
} |
scope = new MethodScope(scope, function); |
@@ -504,7 +513,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
ResolutionResult visitAssert(Assert node) { |
if (!compiler.enableAssertMessage) { |
if (node.hasMessage) { |
- compiler.reportError(node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE); |
} |
} |
// TODO(sra): We could completely ignore the assert in production mode if we |
@@ -598,7 +608,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
{bool inFunctionDeclaration: false}) { |
bool doAddToScope = inFunctionDeclaration; |
if (!inFunctionDeclaration && node.name != null) { |
- compiler.reportError( |
+ compiler.reportErrorMessage( |
node.name, |
MessageKind.NAMED_FUNCTION_EXPRESSION, |
{'name': node.name}); |
@@ -763,7 +773,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
seenNamedArguments[source] = namedArgument; |
} |
} else if (!seenNamedArguments.isEmpty) { |
- error(argument, MessageKind.INVALID_ARGUMENT_AFTER_NAMED); |
+ compiler.reportErrorMessage( |
+ argument, MessageKind.INVALID_ARGUMENT_AFTER_NAMED); |
isValidAsConstant = false; |
} |
argumentCount++; |
@@ -1248,7 +1259,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
knownExpressionType == coreTypes.doubleType; |
break; |
case UnaryOperatorKind.NOT: |
- internalError(node, |
+ compiler.internalError(node, |
"Unexpected user definable unary operator: $operator"); |
} |
if (isValidConstant) { |
@@ -1466,7 +1477,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
case BinaryOperatorKind.LOGICAL_AND: |
case BinaryOperatorKind.LOGICAL_OR: |
case BinaryOperatorKind.IF_NULL: |
- internalError(node, "Unexpected binary operator '${operator}'."); |
+ compiler.internalError( |
+ node, "Unexpected binary operator '${operator}'."); |
break; |
} |
if (isValidConstant) { |
@@ -1516,7 +1528,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
case BinaryOperatorKind.LOGICAL_AND: |
case BinaryOperatorKind.LOGICAL_OR: |
case BinaryOperatorKind.IF_NULL: |
- internalError(node, "Unexpected binary operator '${operator}'."); |
+ compiler.internalError( |
+ node, "Unexpected binary operator '${operator}'."); |
break; |
} |
registry.registerSendStructure(node, sendStructure); |
@@ -1580,7 +1593,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
return const NoneResult(); |
} else { |
// TODO(johnniwinther): Handle get of `this` when it is a [Send] node. |
- internalError(node, "Unexpected node '$node'."); |
+ compiler.internalError( |
+ node, "Unexpected node '$node'."); |
} |
return const NoneResult(); |
} |
@@ -1634,7 +1648,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
// 'super' is not allowed. |
break; |
default: |
- internalError(node, "Unexpected super property access $semantics."); |
+ compiler.internalError( |
+ node, "Unexpected super property access $semantics."); |
break; |
} |
registry.registerSendStructure(node, |
@@ -1661,7 +1676,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
// 'super' is not allowed. |
break; |
default: |
- internalError(node, "Unexpected super property access $semantics."); |
+ compiler.internalError( |
+ node, "Unexpected super property access $semantics."); |
break; |
} |
registry.registerSendStructure(node, new GetStructure(semantics)); |
@@ -2507,8 +2523,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
node, |
name.text, |
element.messageKind, |
- element.messageArguments); |
- element.diagnose(enclosingElement, compiler); |
+ element.messageArguments, |
+ infos: element.computeInfos(enclosingElement, compiler)); |
registry.registerThrowNoSuchMethod(); |
// TODO(johnniwinther): Support ambiguous access as an [AccessSemantics]. |
@@ -2526,8 +2542,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
node, |
name.text, |
element.messageKind, |
- element.messageArguments); |
- element.diagnose(enclosingElement, compiler); |
+ element.messageArguments, |
+ infos: element.computeInfos(enclosingElement, compiler)); |
registry.registerThrowNoSuchMethod(); |
// TODO(johnniwinther): Support ambiguous access as an [AccessSemantics]. |
@@ -2577,7 +2593,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
new UniverseSelector(selector, null)); |
break; |
default: |
- internalError(node, |
+ compiler.internalError(node, |
"Unexpected local access $semantics."); |
break; |
} |
@@ -2623,7 +2639,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} |
break; |
default: |
- internalError(node, |
+ compiler.internalError(node, |
"Unexpected local access $semantics."); |
break; |
} |
@@ -2713,7 +2729,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (member == compiler.mirrorSystemGetNameFunction && |
!compiler.mirrorUsageAnalyzerTask.hasMirrorUsage(enclosingElement)) { |
- compiler.reportHint( |
+ compiler.reportHintMessage( |
node.selector, MessageKind.STATIC_FUNCTION_BLOAT, |
{'class': compiler.mirrorSystemClass.name, |
'name': compiler.mirrorSystemGetNameFunction.name}); |
@@ -2771,7 +2787,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
break; |
default: |
- internalError(node, |
+ compiler.internalError(node, |
"Unexpected statically resolved access $semantics."); |
break; |
} |
@@ -2806,7 +2822,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
break; |
default: |
- internalError(node, |
+ compiler.internalError(node, |
"Unexpected statically resolved access $semantics."); |
break; |
} |
@@ -2969,7 +2985,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} else if (element.isStatic || element.isTopLevel) { |
return handleStaticOrTopLevelAccess(node, name, element); |
} |
- return internalError(node, "Unexpected resolved send: $element"); |
+ return compiler.internalError(node, "Unexpected resolved send: $element"); |
} |
/// Handle update to resolved [element]. |
@@ -3007,7 +3023,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} else if (element.isStatic || element.isTopLevel) { |
return handleStaticOrTopLevelUpdate(node, name, element); |
} |
- return internalError(node, "Unexpected resolved send: $element"); |
+ return compiler.internalError(node, "Unexpected resolved send: $element"); |
} |
/// Handle an unqualified [Send], that is where the `node.receiver` is null, |
@@ -3338,7 +3354,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
registry.registerStaticInvocation(semantics.setter); |
switch (semantics.kind) { |
case AccessKind.SUPER_FINAL_FIELD: |
- compiler.reportWarning( |
+ compiler.reportWarningMessage( |
node, |
MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, |
{'name': name, |
@@ -3349,7 +3365,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
registry.registerSuperNoSuchMethod(); |
break; |
case AccessKind.SUPER_METHOD: |
- compiler.reportWarning( |
+ compiler.reportWarningMessage( |
node, MessageKind.ASSIGNING_METHOD_IN_SUPER, |
{'name': name, |
'superclassName': semantics.setter.enclosingClass.name}); |
@@ -3551,7 +3567,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
String name = node.slowNameString; |
registry.registerConstSymbol(name); |
if (!validateSymbol(node, name, reportError: false)) { |
- compiler.reportError(node, |
+ compiler.reportErrorMessage( |
+ node, |
MessageKind.UNSUPPORTED_LITERAL_SYMBOL, |
{'value': name}); |
} |
@@ -3583,7 +3600,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
ResolutionResult visitRethrow(Rethrow node) { |
if (!inCatchBlock) { |
- error(node, MessageKind.THROW_WITHOUT_EXPRESSION); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.THROW_WITHOUT_EXPRESSION); |
} |
return const NoneResult(); |
} |
@@ -3595,10 +3613,11 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
// It is a compile-time error if a return statement of the form |
// `return e;` appears in a generative constructor. (Dart Language |
// Specification 13.12.) |
- compiler.reportError(expression, |
- MessageKind.CANNOT_RETURN_FROM_CONSTRUCTOR); |
+ compiler.reportErrorMessage( |
+ expression, |
+ MessageKind.CANNOT_RETURN_FROM_CONSTRUCTOR); |
} else if (!node.isArrowBody && currentAsyncMarker.isYielding) { |
- compiler.reportError( |
+ compiler.reportErrorMessage( |
node, |
MessageKind.RETURN_IN_GENERATOR, |
{'modifier': currentAsyncMarker}); |
@@ -3618,9 +3637,9 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
ResolutionResult visitRedirectingFactoryBody(RedirectingFactoryBody node) { |
final isSymbolConstructor = enclosingElement == compiler.symbolConstructor; |
if (!enclosingElement.isFactoryConstructor) { |
- compiler.reportError( |
+ compiler.reportErrorMessage( |
node, MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY); |
- compiler.reportHint( |
+ compiler.reportHintMessage( |
enclosingElement, MessageKind.MISSING_FACTORY_KEYWORD); |
} |
ConstructorElementX constructor = enclosingElement; |
@@ -3644,11 +3663,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} else { |
if (isConstConstructor && |
!redirectionTarget.isConst) { |
- compiler.reportError(node, MessageKind.CONSTRUCTOR_IS_NOT_CONST); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.CONSTRUCTOR_IS_NOT_CONST); |
isValidAsConstant = false; |
} |
if (redirectionTarget == constructor) { |
- compiler.reportError(node, MessageKind.CYCLIC_REDIRECTING_FACTORY); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.CYCLIC_REDIRECTING_FACTORY); |
// TODO(johnniwinther): Create constant constructor for this case and |
// let evaluation detect the cyclicity. |
isValidAsConstant = false; |
@@ -3664,8 +3685,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
FunctionType constructorType = constructor.computeType(compiler); |
bool isSubtype = compiler.types.isSubtype(targetType, constructorType); |
if (!isSubtype) { |
- warning(node, MessageKind.NOT_ASSIGNABLE, |
- {'fromType': targetType, 'toType': constructorType}); |
+ compiler.reportWarningMessage( |
+ node, |
+ MessageKind.NOT_ASSIGNABLE, |
+ {'fromType': targetType, 'toType': constructorType}); |
// TODO(johnniwinther): Handle this (potentially) erroneous case. |
isValidAsConstant = false; |
} |
@@ -3755,7 +3778,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} |
} |
assert(modifierNode != null); |
- compiler.reportError(modifierNode, MessageKind.EXTRANEOUS_MODIFIER, |
+ compiler.reportErrorMessage( |
+ modifierNode, MessageKind.EXTRANEOUS_MODIFIER, |
{'modifier': modifier}); |
} |
if (modifiers.isFinal && (modifiers.isConst || modifiers.isVar)) { |
@@ -3831,16 +3855,18 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
registry.registerStaticUse(constructor.declaration); |
ClassElement cls = constructor.enclosingClass; |
if (cls.isEnumClass && currentClass != cls) { |
- compiler.reportError(node, |
- MessageKind.CANNOT_INSTANTIATE_ENUM, |
- {'enumName': cls.name}); |
+ compiler.reportErrorMessage( |
+ node, |
+ MessageKind.CANNOT_INSTANTIATE_ENUM, |
+ {'enumName': cls.name}); |
isValidAsConstant = false; |
} |
InterfaceType type = registry.getType(node); |
if (node.isConst && type.containsTypeVariables) { |
- compiler.reportError(node.send.selector, |
- MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
+ compiler.reportErrorMessage( |
+ node.send.selector, |
+ MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
isValidAsConstant = false; |
} |
// TODO(johniwinther): Avoid registration of `type` in face of redirecting |
@@ -3859,8 +3885,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
ConstantValue name = compiler.constants.getConstantValue(constant); |
if (!name.isString) { |
DartType type = name.getType(coreTypes); |
- compiler.reportError(argumentNode, MessageKind.STRING_EXPECTED, |
- {'type': type}); |
+ compiler.reportErrorMessage( |
+ argumentNode, |
+ MessageKind.STRING_EXPECTED, |
+ {'type': type}); |
} else { |
StringConstantValue stringConstant = name; |
String nameString = stringConstant.toDartString().slowToString(); |
@@ -3871,7 +3899,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} else { |
if (!compiler.mirrorUsageAnalyzerTask.hasMirrorUsage( |
enclosingElement)) { |
- compiler.reportHint( |
+ compiler.reportHintMessage( |
node.newToken, MessageKind.NON_CONST_BLOAT, |
{'name': compiler.symbolClass.name}); |
} |
@@ -3925,9 +3953,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (cls == compiler.stringClass) continue; |
Element equals = cls.lookupMember('=='); |
if (equals.enclosingClass != compiler.objectClass) { |
- compiler.reportError(spannable, |
- MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS, |
- {'type': keyType}); |
+ compiler.reportErrorMessage( |
+ spannable, |
+ MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS, |
+ {'type': keyType}); |
} |
} |
} |
@@ -3957,11 +3986,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (typeConstant.representedType is InterfaceType) { |
registry.registerInstantiatedType(typeConstant.representedType); |
} else { |
- compiler.reportError(node, |
+ compiler.reportErrorMessage( |
+ node, |
MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); |
} |
} else { |
- compiler.reportError(node, |
+ compiler.reportErrorMessage( |
+ node, |
MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); |
} |
} |
@@ -3977,15 +4008,15 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (name.isEmpty) return true; |
if (name.startsWith('_')) { |
if (reportError) { |
- compiler.reportError(node, MessageKind.PRIVATE_IDENTIFIER, |
- {'value': name}); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.PRIVATE_IDENTIFIER, {'value': name}); |
} |
return false; |
} |
if (!symbolValidationPattern.hasMatch(name)) { |
if (reportError) { |
- compiler.reportError(node, MessageKind.INVALID_SYMBOL, |
- {'value': name}); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.INVALID_SYMBOL, {'value': name}); |
} |
return false; |
} |
@@ -4031,12 +4062,14 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
Link<Node> nodes = arguments.nodes; |
if (nodes.isEmpty) { |
// The syntax [: <>[] :] is not allowed. |
- error(arguments, MessageKind.MISSING_TYPE_ARGUMENT); |
+ compiler.reportErrorMessage( |
+ arguments, MessageKind.MISSING_TYPE_ARGUMENT); |
isValidAsConstant = false; |
} else { |
typeArgument = resolveTypeAnnotation(nodes.head); |
for (nodes = nodes.tail; !nodes.isEmpty; nodes = nodes.tail) { |
- warning(nodes.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
+ compiler.reportWarningMessage( |
+ nodes.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
resolveTypeAnnotation(nodes.head); |
} |
} |
@@ -4044,7 +4077,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
DartType listType; |
if (typeArgument != null) { |
if (node.isConst && typeArgument.containsTypeVariables) { |
- compiler.reportError(arguments.nodes.head, |
+ compiler.reportErrorMessage( |
+ arguments.nodes.head, |
MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
isValidAsConstant = false; |
} |
@@ -4138,7 +4172,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (node.target == null) { |
target = statementScope.currentBreakTarget(); |
if (target == null) { |
- error(node, MessageKind.NO_BREAK_TARGET); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.NO_BREAK_TARGET); |
return const NoneResult(); |
} |
target.isBreakTarget = true; |
@@ -4146,12 +4181,14 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
String labelName = node.target.source; |
LabelDefinition label = statementScope.lookupLabel(labelName); |
if (label == null) { |
- error(node.target, MessageKind.UNBOUND_LABEL, {'labelName': labelName}); |
+ compiler.reportErrorMessage( |
+ node.target, MessageKind.UNBOUND_LABEL, {'labelName': labelName}); |
return const NoneResult(); |
} |
target = label.target; |
if (!target.statement.isValidBreakTarget()) { |
- error(node.target, MessageKind.INVALID_BREAK); |
+ compiler.reportErrorMessage( |
+ node.target, MessageKind.INVALID_BREAK); |
return const NoneResult(); |
} |
label.setBreakTarget(); |
@@ -4166,7 +4203,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (node.target == null) { |
target = statementScope.currentContinueTarget(); |
if (target == null) { |
- error(node, MessageKind.NO_CONTINUE_TARGET); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.NO_CONTINUE_TARGET); |
return const NoneResult(); |
} |
target.isContinueTarget = true; |
@@ -4174,12 +4212,14 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
String labelName = node.target.source; |
LabelDefinition label = statementScope.lookupLabel(labelName); |
if (label == null) { |
- error(node.target, MessageKind.UNBOUND_LABEL, {'labelName': labelName}); |
+ compiler.reportErrorMessage( |
+ node.target, MessageKind.UNBOUND_LABEL, {'labelName': labelName}); |
return const NoneResult(); |
} |
target = label.target; |
if (!target.statement.isValidContinueTarget()) { |
- error(node.target, MessageKind.INVALID_CONTINUE); |
+ compiler.reportErrorMessage( |
+ node.target, MessageKind.INVALID_CONTINUE); |
} |
label.setContinueTarget(); |
registry.useLabel(node, label); |
@@ -4249,30 +4289,35 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
loopVariable = registry.getDefinition(send); |
Identifier identifier = send.selector.asIdentifier(); |
if (identifier == null) { |
- compiler.reportError(send.selector, MessageKind.INVALID_FOR_IN); |
+ compiler.reportErrorMessage( |
+ send.selector, MessageKind.INVALID_FOR_IN); |
} else { |
loopVariableSelector = new Selector.setter( |
new Name(identifier.source, library)); |
} |
if (send.receiver != null) { |
- compiler.reportError(send.receiver, MessageKind.INVALID_FOR_IN); |
+ compiler.reportErrorMessage( |
+ send.receiver, MessageKind.INVALID_FOR_IN); |
} |
} else if (variableDefinitions != null) { |
Link<Node> nodes = variableDefinitions.definitions.nodes; |
if (!nodes.tail.isEmpty) { |
- compiler.reportError(nodes.tail.head, MessageKind.INVALID_FOR_IN); |
+ compiler.reportErrorMessage( |
+ nodes.tail.head, MessageKind.INVALID_FOR_IN); |
} |
Node first = nodes.head; |
Identifier identifier = first.asIdentifier(); |
if (identifier == null) { |
- compiler.reportError(first, MessageKind.INVALID_FOR_IN); |
+ compiler.reportErrorMessage( |
+ first, MessageKind.INVALID_FOR_IN); |
} else { |
loopVariableSelector = new Selector.setter( |
new Name(identifier.source, library)); |
loopVariable = registry.getDefinition(identifier); |
} |
} else { |
- compiler.reportError(declaration, MessageKind.INVALID_FOR_IN); |
+ compiler.reportErrorMessage( |
+ declaration, MessageKind.INVALID_FOR_IN); |
} |
if (loopVariableSelector != null) { |
registry.setSelector(declaration, loopVariableSelector); |
@@ -4308,8 +4353,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (element.isTarget) { |
registry.defineLabel(element.label, element); |
} else { |
- warning(element.label, MessageKind.UNUSED_LABEL, |
- {'labelName': labelName}); |
+ compiler.reportWarningMessage( |
+ element.label, |
+ MessageKind.UNUSED_LABEL, |
+ {'labelName': labelName}); |
} |
}); |
if (!targetElement.isTarget) { |
@@ -4329,17 +4376,20 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
Link<Node> nodes = arguments.nodes; |
if (nodes.isEmpty) { |
// The syntax [: <>{} :] is not allowed. |
- error(arguments, MessageKind.MISSING_TYPE_ARGUMENT); |
+ compiler.reportErrorMessage( |
+ arguments, MessageKind.MISSING_TYPE_ARGUMENT); |
isValidAsConstant = false; |
} else { |
keyTypeArgument = resolveTypeAnnotation(nodes.head); |
nodes = nodes.tail; |
if (nodes.isEmpty) { |
- warning(arguments, MessageKind.MISSING_TYPE_ARGUMENT); |
+ compiler.reportWarningMessage( |
+ arguments, MessageKind.MISSING_TYPE_ARGUMENT); |
} else { |
valueTypeArgument = resolveTypeAnnotation(nodes.head); |
for (nodes = nodes.tail; !nodes.isEmpty; nodes = nodes.tail) { |
- warning(nodes.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
+ compiler.reportWarningMessage( |
+ nodes.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
resolveTypeAnnotation(nodes.head); |
} |
} |
@@ -4352,7 +4402,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
mapType = coreTypes.mapType(); |
} |
if (node.isConst && mapType.containsTypeVariables) { |
- compiler.reportError(arguments, |
+ compiler.reportErrorMessage( |
+ arguments, |
MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
isValidAsConstant = false; |
} |
@@ -4421,7 +4472,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
void checkCaseExpressions(SwitchStatement node) { |
CaseMatch firstCase = null; |
DartType firstCaseType = null; |
- bool hasReportedProblem = false; |
+ DiagnosticMessage error; |
+ List<DiagnosticMessage> infos = <DiagnosticMessage>[]; |
for (Link<Node> cases = node.cases.nodes; |
!cases.isEmpty; |
@@ -4448,38 +4500,43 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
// We only report the bad type on the first class element. All others |
// get a "type differs" error. |
if (caseType.element == compiler.doubleClass) { |
- compiler.reportError(node, |
- MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS, |
- {'type': "double"}); |
+ compiler.reportErrorMessage( |
+ node, |
+ MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS, |
+ {'type': "double"}); |
} else if (caseType.element == compiler.functionClass) { |
- compiler.reportError(node, MessageKind.SWITCH_CASE_FORBIDDEN, |
- {'type': "Function"}); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.SWITCH_CASE_FORBIDDEN, |
+ {'type': "Function"}); |
} else if (value.isObject && overridesEquals(caseType)) { |
- compiler.reportError(firstCase.expression, |
+ compiler.reportErrorMessage( |
+ firstCase.expression, |
MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS, |
{'type': caseType}); |
} |
} else { |
if (caseType != firstCaseType) { |
- if (!hasReportedProblem) { |
- compiler.reportError( |
+ if (error == null) { |
+ error = compiler.createMessage( |
node, |
MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL, |
{'type': firstCaseType}); |
- compiler.reportInfo( |
+ infos.add(compiler.createMessage( |
firstCase.expression, |
MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE, |
- {'type': firstCaseType}); |
- hasReportedProblem = true; |
+ {'type': firstCaseType})); |
} |
- compiler.reportInfo( |
+ infos.add(compiler.createMessage( |
caseMatch.expression, |
MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE, |
- {'type': caseType}); |
+ {'type': caseType})); |
} |
} |
} |
} |
+ if (error != null) { |
+ compiler.reportError(error, infos); |
+ } |
} |
ResolutionResult visitSwitchStatement(SwitchStatement node) { |
@@ -4503,21 +4560,31 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (existingElement != null) { |
// It's an error if the same label occurs twice in the same switch. |
compiler.reportError( |
- label, |
- MessageKind.DUPLICATE_LABEL, {'labelName': labelName}); |
- compiler.reportInfo( |
- existingElement.label, |
- MessageKind.EXISTING_LABEL, {'labelName': labelName}); |
+ compiler.createMessage( |
+ label, |
+ MessageKind.DUPLICATE_LABEL, |
+ {'labelName': labelName}), |
+ <DiagnosticMessage>[ |
+ compiler.createMessage( |
+ existingElement.label, |
+ MessageKind.EXISTING_LABEL, |
+ {'labelName': labelName}), |
+ ]); |
} else { |
// It's only a warning if it shadows another label. |
existingElement = statementScope.lookupLabel(labelName); |
if (existingElement != null) { |
compiler.reportWarning( |
- label, |
- MessageKind.DUPLICATE_LABEL, {'labelName': labelName}); |
- compiler.reportInfo( |
- existingElement.label, |
- MessageKind.EXISTING_LABEL, {'labelName': labelName}); |
+ compiler.createMessage( |
+ label, |
+ MessageKind.DUPLICATE_LABEL, |
+ {'labelName': labelName}), |
+ <DiagnosticMessage>[ |
+ compiler.createMessage( |
+ existingElement.label, |
+ MessageKind.EXISTING_LABEL, |
+ {'labelName': labelName}), |
+ ]); |
} |
} |
@@ -4529,7 +4596,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
cases = cases.tail; |
// Test that only the last case, if any, is a default case. |
if (switchCase.defaultKeyword != null && !cases.isEmpty) { |
- error(switchCase, MessageKind.INVALID_CASE_DEFAULT); |
+ compiler.reportErrorMessage( |
+ switchCase, MessageKind.INVALID_CASE_DEFAULT); |
} |
} |
@@ -4574,7 +4642,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
visit(node.tryBlock); |
if (node.catchBlocks.isEmpty && node.finallyBlock == null) { |
- error(node.getEndToken().next, MessageKind.NO_CATCH_NOR_FINALLY); |
+ compiler.reportErrorMessage( |
+ node.getEndToken().next, MessageKind.NO_CATCH_NOR_FINALLY); |
} |
visit(node.catchBlocks); |
visit(node.finallyBlock); |
@@ -4590,7 +4659,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
if (node.formals != null) { |
Link<Node> formalsToProcess = node.formals.nodes; |
if (formalsToProcess.isEmpty) { |
- error(node, MessageKind.EMPTY_CATCH_DECLARATION); |
+ compiler.reportErrorMessage( |
+ node, MessageKind.EMPTY_CATCH_DECLARATION); |
} else { |
exceptionDefinition = formalsToProcess.head.asVariableDefinitions(); |
formalsToProcess = formalsToProcess.tail; |
@@ -4599,7 +4669,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
formalsToProcess = formalsToProcess.tail; |
if (!formalsToProcess.isEmpty) { |
for (Node extra in formalsToProcess) { |
- error(extra, MessageKind.EXTRA_CATCH_DECLARATION); |
+ compiler.reportErrorMessage( |
+ extra, MessageKind.EXTRA_CATCH_DECLARATION); |
} |
} |
registry.registerStackTraceInCatch(); |
@@ -4615,15 +4686,18 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
// sequence of optional parameters. |
NodeList nodeList = link.head.asNodeList(); |
if (nodeList != null) { |
- error(nodeList, MessageKind.OPTIONAL_PARAMETER_IN_CATCH); |
+ compiler.reportErrorMessage( |
+ nodeList, MessageKind.OPTIONAL_PARAMETER_IN_CATCH); |
} else { |
VariableDefinitions declaration = link.head; |
for (Node modifier in declaration.modifiers.nodes) { |
- error(modifier, MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH); |
+ compiler.reportErrorMessage( |
+ modifier, MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH); |
} |
TypeAnnotation type = declaration.type; |
if (type != null) { |
- error(type, MessageKind.PARAMETER_WITH_TYPE_IN_CATCH); |
+ compiler.reportErrorMessage( |
+ type, MessageKind.PARAMETER_WITH_TYPE_IN_CATCH); |
} |
} |
} |