| Index: pkg/compiler/lib/src/resolution/resolution.dart
|
| diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
|
| index f628e839981195e2201b8f217f48b3ebd3f300a7..7caced4336d7fe673b798a00271febf588d65621 100644
|
| --- a/pkg/compiler/lib/src/resolution/resolution.dart
|
| +++ b/pkg/compiler/lib/src/resolution/resolution.dart
|
| @@ -7,62 +7,47 @@ library dart2js.resolution;
|
| import 'dart:collection' show Queue;
|
|
|
| import '../common.dart';
|
| -import '../common/names.dart' show
|
| - Identifiers;
|
| -import '../common/resolution.dart' show
|
| - Feature,
|
| - Parsing,
|
| - Resolution,
|
| - ResolutionImpact;
|
| -import '../common/tasks.dart' show
|
| - CompilerTask,
|
| - DeferredAction;
|
| -import '../compiler.dart' show
|
| - Compiler;
|
| -import '../compile_time_constants.dart' show
|
| - ConstantCompiler;
|
| -import '../constants/expressions.dart' show
|
| - ConstantExpression,
|
| - ConstantExpressionKind,
|
| - ConstructedConstantExpression,
|
| - ErroneousConstantExpression;
|
| -import '../constants/values.dart' show
|
| - ConstantValue;
|
| -import '../core_types.dart' show
|
| - CoreClasses,
|
| - CoreTypes;
|
| +import '../common/names.dart' show Identifiers;
|
| +import '../common/resolution.dart'
|
| + show Feature, Parsing, Resolution, ResolutionImpact;
|
| +import '../common/tasks.dart' show CompilerTask, DeferredAction;
|
| +import '../compiler.dart' show Compiler;
|
| +import '../compile_time_constants.dart' show ConstantCompiler;
|
| +import '../constants/expressions.dart'
|
| + show
|
| + ConstantExpression,
|
| + ConstantExpressionKind,
|
| + ConstructedConstantExpression,
|
| + ErroneousConstantExpression;
|
| +import '../constants/values.dart' show ConstantValue;
|
| +import '../core_types.dart' show CoreClasses, CoreTypes;
|
| import '../dart_types.dart';
|
| import '../elements/elements.dart';
|
| -import '../elements/modelx.dart' show
|
| - BaseClassElementX,
|
| - BaseFunctionElementX,
|
| - ConstructorElementX,
|
| - FieldElementX,
|
| - FunctionElementX,
|
| - GetterElementX,
|
| - MetadataAnnotationX,
|
| - MixinApplicationElementX,
|
| - ParameterMetadataAnnotation,
|
| - SetterElementX,
|
| - TypedefElementX;
|
| -import '../tokens/token.dart' show
|
| - isBinaryOperator,
|
| - isMinusOperator,
|
| - isTernaryOperator,
|
| - isUnaryOperator,
|
| - isUserDefinableOperator;
|
| +import '../elements/modelx.dart'
|
| + show
|
| + BaseClassElementX,
|
| + BaseFunctionElementX,
|
| + ConstructorElementX,
|
| + FieldElementX,
|
| + FunctionElementX,
|
| + GetterElementX,
|
| + MetadataAnnotationX,
|
| + MixinApplicationElementX,
|
| + ParameterMetadataAnnotation,
|
| + SetterElementX,
|
| + TypedefElementX;
|
| +import '../tokens/token.dart'
|
| + show
|
| + isBinaryOperator,
|
| + isMinusOperator,
|
| + isTernaryOperator,
|
| + isUnaryOperator,
|
| + isUserDefinableOperator;
|
| import '../tree/tree.dart';
|
| -import '../universe/call_structure.dart' show
|
| - CallStructure;
|
| -import '../universe/use.dart' show
|
| - StaticUse,
|
| - TypeUse;
|
| -import '../universe/world_impact.dart' show
|
| - WorldImpact;
|
| -import '../util/util.dart' show
|
| - Link,
|
| - LinkBuilder,
|
| - Setlet;
|
| +import '../universe/call_structure.dart' show CallStructure;
|
| +import '../universe/use.dart' show StaticUse, TypeUse;
|
| +import '../universe/world_impact.dart' show WorldImpact;
|
| +import '../util/util.dart' show Link, LinkBuilder, Setlet;
|
|
|
| import 'class_hierarchy.dart';
|
| import 'class_members.dart' show MembersCreator;
|
| @@ -128,13 +113,11 @@ class ResolverTask extends CompilerTask {
|
| });
|
| }
|
|
|
| - void resolveRedirectingConstructor(InitializerResolver resolver,
|
| - Node node,
|
| - FunctionElement constructor,
|
| - FunctionElement redirection) {
|
| + void resolveRedirectingConstructor(InitializerResolver resolver, Node node,
|
| + FunctionElement constructor, FunctionElement redirection) {
|
| assert(invariant(node, constructor.isImplementation,
|
| message: 'Redirecting constructors must be resolved on implementation '
|
| - 'elements.'));
|
| + 'elements.'));
|
| Setlet<FunctionElement> seen = new Setlet<FunctionElement>();
|
| seen.add(constructor);
|
| while (redirection != null) {
|
| @@ -154,18 +137,17 @@ class ResolverTask extends CompilerTask {
|
| }
|
|
|
| static void processAsyncMarker(Compiler compiler,
|
| - BaseFunctionElementX element,
|
| - ResolutionRegistry registry) {
|
| + BaseFunctionElementX element, ResolutionRegistry registry) {
|
| DiagnosticReporter reporter = compiler.reporter;
|
| Resolution resolution = compiler.resolution;
|
| CoreClasses coreClasses = compiler.coreClasses;
|
| FunctionExpression functionExpression = element.node;
|
| AsyncModifier asyncModifier = functionExpression.asyncModifier;
|
| if (asyncModifier != null) {
|
| -
|
| if (asyncModifier.isAsynchronous) {
|
| element.asyncMarker = asyncModifier.isYielding
|
| - ? AsyncMarker.ASYNC_STAR : AsyncMarker.ASYNC;
|
| + ? AsyncMarker.ASYNC_STAR
|
| + : AsyncMarker.ASYNC;
|
| } else {
|
| element.asyncMarker = AsyncMarker.SYNC_STAR;
|
| }
|
| @@ -185,7 +167,6 @@ class ResolverTask extends CompilerTask {
|
| asyncModifier,
|
| MessageKind.ASYNC_MODIFIER_ON_SETTER,
|
| {'modifier': element.asyncMarker});
|
| -
|
| }
|
| if (functionExpression.body.asReturn() != null &&
|
| element.asyncMarker.isYielding) {
|
| @@ -196,18 +177,18 @@ class ResolverTask extends CompilerTask {
|
| }
|
| }
|
| switch (element.asyncMarker) {
|
| - case AsyncMarker.ASYNC:
|
| - registry.registerFeature(Feature.ASYNC);
|
| - coreClasses.futureClass.ensureResolved(resolution);
|
| - break;
|
| - case AsyncMarker.ASYNC_STAR:
|
| - registry.registerFeature(Feature.ASYNC_STAR);
|
| - coreClasses.streamClass.ensureResolved(resolution);
|
| - break;
|
| - case AsyncMarker.SYNC_STAR:
|
| - registry.registerFeature(Feature.SYNC_STAR);
|
| - coreClasses.iterableClass.ensureResolved(resolution);
|
| - break;
|
| + case AsyncMarker.ASYNC:
|
| + registry.registerFeature(Feature.ASYNC);
|
| + coreClasses.futureClass.ensureResolved(resolution);
|
| + break;
|
| + case AsyncMarker.ASYNC_STAR:
|
| + registry.registerFeature(Feature.ASYNC_STAR);
|
| + coreClasses.streamClass.ensureResolved(resolution);
|
| + break;
|
| + case AsyncMarker.SYNC_STAR:
|
| + registry.registerFeature(Feature.SYNC_STAR);
|
| + coreClasses.iterableClass.ensureResolved(resolution);
|
| + break;
|
| }
|
| }
|
| }
|
| @@ -225,9 +206,7 @@ class ResolverTask extends CompilerTask {
|
| FunctionElement element, FunctionExpression tree) {
|
| return reporter.withCurrentElement(element, () {
|
| if (element.isExternal && tree.hasBody) {
|
| - reporter.reportErrorMessage(
|
| - element,
|
| - MessageKind.EXTERNAL_WITH_BODY,
|
| + reporter.reportErrorMessage(element, MessageKind.EXTERNAL_WITH_BODY,
|
| {'functionName': element.name});
|
| }
|
| if (element.isConstructor) {
|
| @@ -240,8 +219,7 @@ class ResolverTask extends CompilerTask {
|
| reporter.reportErrorMessage(
|
| tree, MessageKind.CONST_CONSTRUCTOR_WITH_BODY);
|
| } else if (!tree.isRedirectingFactory) {
|
| - reporter.reportErrorMessage(
|
| - tree, MessageKind.CONST_FACTORY);
|
| + reporter.reportErrorMessage(tree, MessageKind.CONST_FACTORY);
|
| }
|
| }
|
| }
|
| @@ -295,13 +273,11 @@ class ResolverTask extends CompilerTask {
|
| element.isInstanceMember &&
|
| element.name == Identifiers.noSuchMethod_ &&
|
| _isNativeClassOrExtendsNativeClass(enclosingClass)) {
|
| - reporter.reportErrorMessage(
|
| - tree, MessageKind.NO_SUCH_METHOD_IN_NATIVE);
|
| + reporter.reportErrorMessage(tree, MessageKind.NO_SUCH_METHOD_IN_NATIVE);
|
| }
|
|
|
| return registry.worldImpact;
|
| });
|
| -
|
| }
|
|
|
| WorldImpact resolveMethodElement(FunctionElementX element) {
|
| @@ -312,7 +288,7 @@ class ResolverTask extends CompilerTask {
|
| // should never be non-null, not even for constructors.
|
| assert(invariant(element, element.isConstructor,
|
| message: 'Non-constructor element $element '
|
| - 'has already been analyzed.'));
|
| + 'has already been analyzed.'));
|
| return const ResolutionImpact();
|
| }
|
| if (element.isSynthesized) {
|
| @@ -326,9 +302,8 @@ class ResolverTask extends CompilerTask {
|
| // seeing this element.
|
| element.computeType(resolution);
|
| if (!target.isMalformed) {
|
| - registry.registerStaticUse(
|
| - new StaticUse.superConstructorInvoke(
|
| - target, CallStructure.NO_ARGS));
|
| + registry.registerStaticUse(new StaticUse.superConstructorInvoke(
|
| + target, CallStructure.NO_ARGS));
|
| }
|
| return registry.worldImpact;
|
| } else {
|
| @@ -363,9 +338,8 @@ class ResolverTask extends CompilerTask {
|
|
|
| WorldImpact resolveField(FieldElementX element) {
|
| VariableDefinitions tree = element.parseNode(parsing);
|
| - if(element.modifiers.isStatic && element.isTopLevel) {
|
| - reporter.reportErrorMessage(
|
| - element.modifiers.getStatic(),
|
| + if (element.modifiers.isStatic && element.isTopLevel) {
|
| + reporter.reportErrorMessage(element.modifiers.getStatic(),
|
| MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
|
| }
|
| ResolverVisitor visitor = visitorFor(element);
|
| @@ -424,8 +398,7 @@ class ResolverTask extends CompilerTask {
|
| DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
|
| DartType type = resolveReturnType(element, annotation);
|
| if (type.isVoid) {
|
| - reporter.reportErrorMessage(
|
| - annotation, MessageKind.VOID_NOT_ALLOWED);
|
| + reporter.reportErrorMessage(annotation, MessageKind.VOID_NOT_ALLOWED);
|
| }
|
| return type;
|
| }
|
| @@ -440,8 +413,8 @@ class ResolverTask extends CompilerTask {
|
| return result;
|
| }
|
|
|
| - void resolveRedirectionChain(ConstructorElementX constructor,
|
| - Spannable node) {
|
| + void resolveRedirectionChain(
|
| + ConstructorElementX constructor, Spannable node) {
|
| ConstructorElementX target = constructor;
|
| InterfaceType targetType;
|
| List<Element> seen = new List<Element>();
|
| @@ -453,7 +426,7 @@ class ResolverTask extends CompilerTask {
|
| targetType = target.effectiveTargetType;
|
| assert(invariant(target, targetType != null,
|
| message: 'Redirection target type has not been computed for '
|
| - '$target'));
|
| + '$target'));
|
| target = target.effectiveTargetInternal;
|
| break;
|
| }
|
| @@ -521,14 +494,11 @@ class ResolverTask extends CompilerTask {
|
| if (cls.supertypeLoadState == STATE_DONE) return;
|
| if (cls.supertypeLoadState == STATE_STARTED) {
|
| reporter.reportErrorMessage(
|
| - from,
|
| - MessageKind.CYCLIC_CLASS_HIERARCHY,
|
| - {'className': cls.name});
|
| + from, MessageKind.CYCLIC_CLASS_HIERARCHY, {'className': cls.name});
|
| cls.supertypeLoadState = STATE_DONE;
|
| cls.hasIncompleteHierarchy = true;
|
| - cls.allSupertypesAndSelf =
|
| - coreClasses.objectClass.allSupertypesAndSelf.extendClass(
|
| - cls.computeType(resolution));
|
| + cls.allSupertypesAndSelf = coreClasses.objectClass.allSupertypesAndSelf
|
| + .extendClass(cls.computeType(resolution));
|
| cls.supertype = cls.allSupertypes.head;
|
| assert(invariant(from, cls.supertype != null,
|
| message: 'Missing supertype on cyclic class $cls.'));
|
| @@ -538,8 +508,9 @@ class ResolverTask extends CompilerTask {
|
| cls.supertypeLoadState = STATE_STARTED;
|
| reporter.withCurrentElement(cls, () {
|
| // TODO(ahe): Cache the node in cls.
|
| - cls.parseNode(parsing).accept(
|
| - new ClassSupertypeResolver(compiler, cls));
|
| + cls
|
| + .parseNode(parsing)
|
| + .accept(new ClassSupertypeResolver(compiler, cls));
|
| if (cls.supertypeLoadState != STATE_DONE) {
|
| cls.supertypeLoadState = STATE_DONE;
|
| }
|
| @@ -561,8 +532,8 @@ class ResolverTask extends CompilerTask {
|
| /// [element] has been resolved.
|
| // TODO(johnniwinther): Encapsulate this functionality in a
|
| // 'TypeDeclarationResolver'.
|
| - _resolveTypeDeclaration(TypeDeclarationElement element,
|
| - resolveTypeDeclaration()) {
|
| + _resolveTypeDeclaration(
|
| + TypeDeclarationElement element, resolveTypeDeclaration()) {
|
| return reporter.withCurrentElement(element, () {
|
| return measure(() {
|
| TypeDeclarationElement previousResolvedTypeDeclaration =
|
| @@ -572,7 +543,8 @@ class ResolverTask extends CompilerTask {
|
| if (previousResolvedTypeDeclaration == null) {
|
| do {
|
| while (!pendingClassesToBeResolved.isEmpty) {
|
| - pendingClassesToBeResolved.removeFirst()
|
| + pendingClassesToBeResolved
|
| + .removeFirst()
|
| .ensureResolved(resolution);
|
| }
|
| while (!pendingClassesToBePostProcessed.isEmpty) {
|
| @@ -618,27 +590,30 @@ class ResolverTask extends CompilerTask {
|
| }
|
| }
|
|
|
| - void resolveClassInternal(BaseClassElementX element,
|
| - ResolutionRegistry registry) {
|
| + void resolveClassInternal(
|
| + BaseClassElementX element, ResolutionRegistry registry) {
|
| if (!element.isPatch) {
|
| - reporter.withCurrentElement(element, () => measure(() {
|
| - assert(element.resolutionState == STATE_NOT_STARTED);
|
| - element.resolutionState = STATE_STARTED;
|
| - Node tree = element.parseNode(parsing);
|
| - loadSupertypes(element, tree);
|
| -
|
| - ClassResolverVisitor visitor =
|
| - new ClassResolverVisitor(compiler, element, registry);
|
| - visitor.visit(tree);
|
| - element.resolutionState = STATE_DONE;
|
| - compiler.onClassResolved(element);
|
| - pendingClassesToBePostProcessed.add(element);
|
| - }));
|
| + reporter.withCurrentElement(
|
| + element,
|
| + () => measure(() {
|
| + assert(element.resolutionState == STATE_NOT_STARTED);
|
| + element.resolutionState = STATE_STARTED;
|
| + Node tree = element.parseNode(parsing);
|
| + loadSupertypes(element, tree);
|
| +
|
| + ClassResolverVisitor visitor =
|
| + new ClassResolverVisitor(compiler, element, registry);
|
| + visitor.visit(tree);
|
| + element.resolutionState = STATE_DONE;
|
| + compiler.onClassResolved(element);
|
| + pendingClassesToBePostProcessed.add(element);
|
| + }));
|
| if (element.isPatched) {
|
| // Ensure handling patch after origin.
|
| element.patch.ensureResolved(resolution);
|
| }
|
| - } else { // Handle patch classes:
|
| + } else {
|
| + // Handle patch classes:
|
| element.resolutionState = STATE_STARTED;
|
| // Ensure handling origin before patch.
|
| element.origin.ensureResolved(resolution);
|
| @@ -722,8 +697,7 @@ class ResolverTask extends CompilerTask {
|
| // Check that we're not trying to use Object as a mixin.
|
| if (mixin.superclass == null) {
|
| reporter.reportErrorMessage(
|
| - mixinApplication,
|
| - MessageKind.ILLEGAL_MIXIN_OBJECT);
|
| + mixinApplication, MessageKind.ILLEGAL_MIXIN_OBJECT);
|
| // Avoid reporting additional errors for the Object class.
|
| return;
|
| }
|
| @@ -735,8 +709,7 @@ class ResolverTask extends CompilerTask {
|
|
|
| // Check that the mixed in class has Object as its superclass.
|
| if (!mixin.superclass.isObject) {
|
| - reporter.reportErrorMessage(
|
| - mixin, MessageKind.ILLEGAL_MIXIN_SUPERCLASS);
|
| + reporter.reportErrorMessage(mixin, MessageKind.ILLEGAL_MIXIN_SUPERCLASS);
|
| }
|
|
|
| // Check that the mixed in class doesn't have any constructors and
|
| @@ -754,31 +727,25 @@ class ResolverTask extends CompilerTask {
|
| // differently.
|
| if (compiler.enqueuer.resolution.hasBeenProcessed(member)) {
|
| checkMixinSuperUses(
|
| - member.resolvedAst.elements,
|
| - mixinApplication,
|
| - mixin);
|
| + member.resolvedAst.elements, mixinApplication, mixin);
|
| }
|
| }
|
| });
|
| }
|
|
|
| void checkMixinSuperUses(TreeElements resolutionTree,
|
| - MixinApplicationElement mixinApplication,
|
| - ClassElement mixin) {
|
| + MixinApplicationElement mixinApplication, ClassElement mixin) {
|
| // TODO(johnniwinther): Avoid the use of [TreeElements] here.
|
| if (resolutionTree == null) return;
|
| Iterable<SourceSpan> superUses = resolutionTree.superUses;
|
| if (superUses.isEmpty) return;
|
| - DiagnosticMessage error = reporter.createMessage(
|
| - mixinApplication,
|
| - MessageKind.ILLEGAL_MIXIN_WITH_SUPER,
|
| - {'className': mixin.name});
|
| + DiagnosticMessage error = reporter.createMessage(mixinApplication,
|
| + MessageKind.ILLEGAL_MIXIN_WITH_SUPER, {'className': mixin.name});
|
| // Show the user the problematic uses of 'super' in the mixin.
|
| List<DiagnosticMessage> infos = <DiagnosticMessage>[];
|
| for (SourceSpan use in superUses) {
|
| - infos.add(reporter.createMessage(
|
| - use,
|
| - MessageKind.ILLEGAL_MIXIN_SUPER_USE));
|
| + infos.add(
|
| + reporter.createMessage(use, MessageKind.ILLEGAL_MIXIN_SUPER_USE));
|
| }
|
| reporter.reportError(error, infos);
|
| }
|
| @@ -801,8 +768,7 @@ class ResolverTask extends CompilerTask {
|
| member, MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER);
|
| }
|
| if (member.isConstructor) {
|
| - final mismatchedFlagsBits =
|
| - member.modifiers.flags &
|
| + final mismatchedFlagsBits = member.modifiers.flags &
|
| (Modifiers.FLAG_STATIC | Modifiers.FLAG_ABSTRACT);
|
| if (mismatchedFlagsBits != 0) {
|
| final mismatchedFlags =
|
| @@ -830,8 +796,8 @@ class ResolverTask extends CompilerTask {
|
| });
|
| });
|
| if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) {
|
| - Spannable span = constConstructors.length > 1
|
| - ? cls : constConstructors[0];
|
| + Spannable span =
|
| + constConstructors.length > 1 ? cls : constConstructors[0];
|
| DiagnosticMessage error = reporter.createMessage(
|
| span,
|
| MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS,
|
| @@ -839,15 +805,13 @@ class ResolverTask extends CompilerTask {
|
| List<DiagnosticMessage> infos = <DiagnosticMessage>[];
|
| if (constConstructors.length > 1) {
|
| for (Element constructor in constConstructors) {
|
| - infos.add(reporter.createMessage(
|
| - constructor,
|
| + infos.add(reporter.createMessage(constructor,
|
| MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR));
|
| }
|
| }
|
| for (Element field in nonFinalInstanceFields) {
|
| infos.add(reporter.createMessage(
|
| - field,
|
| - MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD));
|
| + field, MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD));
|
| }
|
| reporter.reportError(error, infos);
|
| }
|
| @@ -863,12 +827,11 @@ class ResolverTask extends CompilerTask {
|
| ClassElement classElement = member.enclosingClass;
|
| Element lookupElement = classElement.lookupLocalMember(member.name);
|
| if (lookupElement == null) {
|
| - reporter.internalError(member,
|
| - "No abstract field for accessor");
|
| + reporter.internalError(member, "No abstract field for accessor");
|
| } else if (!lookupElement.isAbstractField) {
|
| if (lookupElement.isMalformed || lookupElement.isAmbiguous) return;
|
| - reporter.internalError(member,
|
| - "Inaccessible abstract field for accessor");
|
| + reporter.internalError(
|
| + member, "Inaccessible abstract field for accessor");
|
| }
|
| AbstractFieldElement field = lookupElement;
|
|
|
| @@ -880,14 +843,10 @@ class ResolverTask extends CompilerTask {
|
| int setterFlags = setter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
|
| if (getterFlags != setterFlags) {
|
| final mismatchedFlags =
|
| - new Modifiers.withFlags(null, getterFlags ^ setterFlags);
|
| - reporter.reportWarningMessage(
|
| - field.getter,
|
| - MessageKind.GETTER_MISMATCH,
|
| + new Modifiers.withFlags(null, getterFlags ^ setterFlags);
|
| + reporter.reportWarningMessage(field.getter, MessageKind.GETTER_MISMATCH,
|
| {'modifiers': mismatchedFlags});
|
| - reporter.reportWarningMessage(
|
| - field.setter,
|
| - MessageKind.SETTER_MISMATCH,
|
| + reporter.reportWarningMessage(field.setter, MessageKind.SETTER_MISMATCH,
|
| {'modifiers': mismatchedFlags});
|
| }
|
| }
|
| @@ -921,8 +880,8 @@ class ResolverTask extends CompilerTask {
|
| messageKind = MessageKind.TERNARY_OPERATOR_BAD_ARITY;
|
| requiredParameterCount = 2;
|
| } else {
|
| - reporter.internalError(function,
|
| - 'Unexpected user defined operator $value');
|
| + reporter.internalError(
|
| + function, 'Unexpected user defined operator $value');
|
| }
|
| checkArity(function, requiredParameterCount, messageKind, isMinus);
|
| }
|
| @@ -930,17 +889,14 @@ class ResolverTask extends CompilerTask {
|
| void checkOverrideHashCode(FunctionElement operatorEquals) {
|
| if (operatorEquals.isAbstract) return;
|
| ClassElement cls = operatorEquals.enclosingClass;
|
| - Element hashCodeImplementation =
|
| - cls.lookupLocalMember('hashCode');
|
| + Element hashCodeImplementation = cls.lookupLocalMember('hashCode');
|
| if (hashCodeImplementation != null) return;
|
| - reporter.reportHintMessage(
|
| - operatorEquals, MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE,
|
| - {'class': cls.name});
|
| + reporter.reportHintMessage(operatorEquals,
|
| + MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE, {'class': cls.name});
|
| }
|
|
|
| - void checkArity(FunctionElement function,
|
| - int requiredParameterCount, MessageKind messageKind,
|
| - bool isMinus) {
|
| + void checkArity(FunctionElement function, int requiredParameterCount,
|
| + MessageKind messageKind, bool isMinus) {
|
| FunctionExpression node = function.node;
|
| FunctionSignature signature = function.functionSignature;
|
| if (signature.requiredParameterCount != requiredParameterCount) {
|
| @@ -994,22 +950,18 @@ class ResolverTask extends CompilerTask {
|
| }
|
| }
|
|
|
| - reportErrorWithContext(Element errorneousElement,
|
| - MessageKind errorMessage,
|
| - Element contextElement,
|
| - MessageKind contextMessage) {
|
| + reportErrorWithContext(Element errorneousElement, MessageKind errorMessage,
|
| + Element contextElement, MessageKind contextMessage) {
|
| reporter.reportError(
|
| - reporter.createMessage(
|
| - errorneousElement,
|
| - errorMessage,
|
| - {'memberName': contextElement.name,
|
| - 'className': contextElement.enclosingClass.name}),
|
| + reporter.createMessage(errorneousElement, errorMessage, {
|
| + 'memberName': contextElement.name,
|
| + 'className': contextElement.enclosingClass.name
|
| + }),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(contextElement, contextMessage),
|
| + reporter.createMessage(contextElement, contextMessage),
|
| ]);
|
| }
|
|
|
| -
|
| FunctionSignature resolveSignature(FunctionElementX element) {
|
| MessageKind defaultValuesError = null;
|
| if (element.isFactoryConstructor) {
|
| @@ -1021,7 +973,10 @@ class ResolverTask extends CompilerTask {
|
| return reporter.withCurrentElement(element, () {
|
| FunctionExpression node = element.parseNode(parsing);
|
| return measure(() => SignatureResolver.analyze(
|
| - compiler, node.parameters, node.returnType, element,
|
| + compiler,
|
| + node.parameters,
|
| + node.returnType,
|
| + element,
|
| new ResolutionRegistry(compiler, _ensureTreeElements(element)),
|
| defaultValuesError: defaultValuesError,
|
| createRealParameters: true));
|
| @@ -1032,15 +987,15 @@ class ResolverTask extends CompilerTask {
|
| if (element.isResolved) return const ResolutionImpact();
|
| compiler.world.allTypedefs.add(element);
|
| return _resolveTypeDeclaration(element, () {
|
| - ResolutionRegistry registry = new ResolutionRegistry(
|
| - compiler, _ensureTreeElements(element));
|
| + ResolutionRegistry registry =
|
| + new ResolutionRegistry(compiler, _ensureTreeElements(element));
|
| return reporter.withCurrentElement(element, () {
|
| return measure(() {
|
| assert(element.resolutionState == STATE_NOT_STARTED);
|
| element.resolutionState = STATE_STARTED;
|
| Typedef node = element.parseNode(parsing);
|
| TypedefResolverVisitor visitor =
|
| - new TypedefResolverVisitor(compiler, element, registry);
|
| + new TypedefResolverVisitor(compiler, element, registry);
|
| visitor.visit(node);
|
| element.resolutionState = STATE_DONE;
|
| return registry.worldImpact;
|
| @@ -1050,61 +1005,65 @@ class ResolverTask extends CompilerTask {
|
| }
|
|
|
| void resolveMetadataAnnotation(MetadataAnnotationX annotation) {
|
| - reporter.withCurrentElement(annotation.annotatedElement, () => measure(() {
|
| - assert(annotation.resolutionState == STATE_NOT_STARTED);
|
| - annotation.resolutionState = STATE_STARTED;
|
| -
|
| - Node node = annotation.parseNode(parsing);
|
| - Element annotatedElement = annotation.annotatedElement;
|
| - AnalyzableElement context = annotatedElement.analyzableElement;
|
| - ClassElement classElement = annotatedElement.enclosingClass;
|
| - if (classElement != null) {
|
| - // The annotation is resolved in the scope of [classElement].
|
| - classElement.ensureResolved(resolution);
|
| - }
|
| - assert(invariant(node, context != null,
|
| - message: "No context found for metadata annotation "
|
| - "on $annotatedElement."));
|
| - ResolverVisitor visitor = visitorFor(context, useEnclosingScope: true);
|
| - ResolutionRegistry registry = visitor.registry;
|
| - node.accept(visitor);
|
| - // TODO(johnniwinther): Avoid passing the [TreeElements] to
|
| - // [compileMetadata].
|
| - ConstantExpression constant = constantCompiler.compileMetadata(
|
| - annotation, node, registry.mapping);
|
| - switch (constant.kind) {
|
| - case ConstantExpressionKind.CONSTRUCTED:
|
| - ConstructedConstantExpression constructedConstant = constant;
|
| - if (constructedConstant.type.isGeneric) {
|
| - // Const constructor calls cannot have type arguments.
|
| - // TODO(24312): Remove this.
|
| - reporter.reportErrorMessage(
|
| - node, MessageKind.INVALID_METADATA_GENERIC);
|
| - constant = new ErroneousConstantExpression();
|
| - }
|
| - break;
|
| - case ConstantExpressionKind.VARIABLE:
|
| - case ConstantExpressionKind.ERRONEOUS:
|
| - break;
|
| - default:
|
| - reporter.reportErrorMessage(node, MessageKind.INVALID_METADATA);
|
| - constant = new ErroneousConstantExpression();
|
| - break;
|
| - }
|
| - annotation.constant = constant;
|
| -
|
| - constantCompiler.evaluate(annotation.constant);
|
| - // TODO(johnniwinther): Register the relation between the annotation
|
| - // and the annotated element instead. This will allow the backend to
|
| - // retrieve the backend constant and only register metadata on the
|
| - // elements for which it is needed. (Issue 17732).
|
| - registry.registerMetadataConstant(annotation);
|
| - annotation.resolutionState = STATE_DONE;
|
| - }));
|
| + reporter.withCurrentElement(
|
| + annotation.annotatedElement,
|
| + () => measure(() {
|
| + assert(annotation.resolutionState == STATE_NOT_STARTED);
|
| + annotation.resolutionState = STATE_STARTED;
|
| +
|
| + Node node = annotation.parseNode(parsing);
|
| + Element annotatedElement = annotation.annotatedElement;
|
| + AnalyzableElement context = annotatedElement.analyzableElement;
|
| + ClassElement classElement = annotatedElement.enclosingClass;
|
| + if (classElement != null) {
|
| + // The annotation is resolved in the scope of [classElement].
|
| + classElement.ensureResolved(resolution);
|
| + }
|
| + assert(invariant(node, context != null,
|
| + message: "No context found for metadata annotation "
|
| + "on $annotatedElement."));
|
| + ResolverVisitor visitor =
|
| + visitorFor(context, useEnclosingScope: true);
|
| + ResolutionRegistry registry = visitor.registry;
|
| + node.accept(visitor);
|
| + // TODO(johnniwinther): Avoid passing the [TreeElements] to
|
| + // [compileMetadata].
|
| + ConstantExpression constant = constantCompiler.compileMetadata(
|
| + annotation, node, registry.mapping);
|
| + switch (constant.kind) {
|
| + case ConstantExpressionKind.CONSTRUCTED:
|
| + ConstructedConstantExpression constructedConstant = constant;
|
| + if (constructedConstant.type.isGeneric) {
|
| + // Const constructor calls cannot have type arguments.
|
| + // TODO(24312): Remove this.
|
| + reporter.reportErrorMessage(
|
| + node, MessageKind.INVALID_METADATA_GENERIC);
|
| + constant = new ErroneousConstantExpression();
|
| + }
|
| + break;
|
| + case ConstantExpressionKind.VARIABLE:
|
| + case ConstantExpressionKind.ERRONEOUS:
|
| + break;
|
| + default:
|
| + reporter.reportErrorMessage(
|
| + node, MessageKind.INVALID_METADATA);
|
| + constant = new ErroneousConstantExpression();
|
| + break;
|
| + }
|
| + annotation.constant = constant;
|
| +
|
| + constantCompiler.evaluate(annotation.constant);
|
| + // TODO(johnniwinther): Register the relation between the annotation
|
| + // and the annotated element instead. This will allow the backend to
|
| + // retrieve the backend constant and only register metadata on the
|
| + // elements for which it is needed. (Issue 17732).
|
| + registry.registerMetadataConstant(annotation);
|
| + annotation.resolutionState = STATE_DONE;
|
| + }));
|
| }
|
|
|
| - List<MetadataAnnotation> resolveMetadata(Element element,
|
| - VariableDefinitions node) {
|
| + List<MetadataAnnotation> resolveMetadata(
|
| + Element element, VariableDefinitions node) {
|
| List<MetadataAnnotation> metadata = <MetadataAnnotation>[];
|
| for (Metadata annotation in node.metadata.nodes) {
|
| ParameterMetadataAnnotation metadataAnnotation =
|
| @@ -1129,7 +1088,7 @@ abstract class AnalyzableElementX implements AnalyzableElement {
|
| bool get hasTreeElements => _treeElements != null;
|
|
|
| TreeElements get treeElements {
|
| - assert(invariant(this, _treeElements !=null,
|
| + assert(invariant(this, _treeElements != null,
|
| message: "TreeElements have not been computed for $this."));
|
| return _treeElements;
|
| }
|
|
|