Index: sdk/lib/_internal/compiler/implementation/resolution/members.dart |
=================================================================== |
--- sdk/lib/_internal/compiler/implementation/resolution/members.dart (revision 25147) |
+++ sdk/lib/_internal/compiler/implementation/resolution/members.dart (working copy) |
@@ -339,6 +339,14 @@ |
assert(isConstructor); |
return elements; |
} |
+ if (element.isSynthesized) { |
+ Element target = element.targetConstructor; |
+ if (!target.isErroneous()) { |
+ compiler.enqueuer.resolution.registerStaticUse( |
+ element.targetConstructor); |
+ } |
+ return new TreeElementMapping(element); |
+ } |
if (element.isPatched) { |
checkMatchingPatchSignatures(element, element.patch); |
element = element.patch; |
@@ -2536,7 +2544,9 @@ |
{ // This entire block is temporary code per the above TODO. |
FunctionElement targetImplementation = redirectionTarget.implementation; |
FunctionExpression function = targetImplementation.parseNode(compiler); |
- if (function.body != null && function.body.asReturn() != null |
+ if (function != null |
+ && function.body != null |
+ && function.body.asReturn() != null |
&& function.body.asReturn().isRedirectingFactoryBody) { |
unimplemented(node.expression, 'redirecting to redirecting factory'); |
} |
@@ -3273,7 +3283,21 @@ |
element.interfaces = resolveInterfaces(node.interfaces, node.superclass); |
calculateAllSupertypes(element); |
- element.addDefaultConstructorIfNeeded(compiler); |
+ if (!element.hasConstructor) { |
+ Element superMember = |
+ element.superclass.localLookup(const SourceString('')); |
+ if (superMember == null || !superMember.isGenerativeConstructor()) { |
+ MessageKind kind = MessageKind.CANNOT_FIND_CONSTRUCTOR; |
+ Map arguments = {'constructorName': const SourceString('')}; |
+ compiler.reportErrorCode(node, kind, arguments); |
+ superMember = new ErroneousElementX( |
+ kind, arguments, const SourceString(''), element); |
+ compiler.backend.registerThrowNoSuchMethod(mapping); |
+ } |
+ FunctionElement constructor = |
+ new SynthesizedConstructorElementX.forDefault(superMember, element); |
+ element.setDefaultConstructor(constructor, compiler); |
+ } |
return element.computeType(compiler); |
} |
@@ -3317,11 +3341,11 @@ |
constructor.computeSignature(compiler).parameterCount == 0; |
} |
- FunctionElement createForwardingConstructor(FunctionElement constructor, |
- ClassElement target) { |
- return new SynthesizedConstructorElementX.forwarding(constructor.name, |
- constructor, |
- target); |
+ FunctionElement createForwardingConstructor(FunctionElement target, |
+ ClassElement enclosing) { |
+ return new SynthesizedConstructorElementX(target.name, |
+ target, |
+ enclosing); |
} |
void doApplyMixinTo(MixinApplicationElement mixinApplication, |
@@ -3360,20 +3384,11 @@ |
// because they are now hidden by the mixin application. |
ClassElement superclass = supertype.element; |
superclass.forEachLocalMember((Element member) { |
- if (!member.isConstructor()) return; |
- if (member.isSynthesized && !member.isForwardingConstructor) return; |
- if (isDefaultConstructor(member)) return; |
- assert(invariant(node, !member.isFactoryConstructor(), |
- message: 'mixins cannot have factory constructors')); |
- // Skip forwarding constructors and use their target. |
- FunctionElement constructor = |
- member.isForwardingConstructor ? member.targetConstructor : member; |
- assert(invariant(node, !constructor.isForwardingConstructor)); |
+ if (!member.isGenerativeConstructor()) return; |
FunctionElement forwarder = |
- createForwardingConstructor(constructor, mixinApplication); |
+ createForwardingConstructor(member, mixinApplication); |
mixinApplication.addConstructor(forwarder); |
}); |
- mixinApplication.addDefaultConstructorIfNeeded(compiler); |
calculateAllSupertypes(mixinApplication); |
} |