Index: pkg/compiler/lib/src/resolution/send_resolver.dart |
diff --git a/pkg/compiler/lib/src/resolution/send_resolver.dart b/pkg/compiler/lib/src/resolution/send_resolver.dart |
index f4bbaa5339cb96e14a9ca85271192efd46cfbc79..22cf9bc04bea2cf172d8ac20c1e78ba1bf97325c 100644 |
--- a/pkg/compiler/lib/src/resolution/send_resolver.dart |
+++ b/pkg/compiler/lib/src/resolution/send_resolver.dart |
@@ -430,7 +430,12 @@ abstract class SendResolverMixin { |
ConstructorAccessSemantics computeConstructorAccessSemantics( |
ConstructorElement constructor, |
- DartType type) { |
+ DartType type, |
+ {bool mustBeConstant: false}) { |
+ if (mustBeConstant && !constructor.isConst) { |
+ return new ConstructorAccessSemantics( |
+ ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR, constructor, type); |
+ } |
if (constructor.isErroneous) { |
if (constructor is ErroneousElement) { |
ErroneousElement error = constructor; |
@@ -444,7 +449,8 @@ abstract class SendResolverMixin { |
} else if (constructor.isRedirectingFactory) { |
ConstructorElement effectiveTarget = constructor.effectiveTarget; |
if (effectiveTarget == constructor || |
- effectiveTarget.isErroneous) { |
+ effectiveTarget.isErroneous || |
+ (mustBeConstant && !effectiveTarget.isConst)) { |
return new ConstructorAccessSemantics( |
ConstructorAccessKind.ERRONEOUS_REDIRECTING_FACTORY, |
constructor, |
@@ -486,26 +492,24 @@ abstract class SendResolverMixin { |
} |
NewStructure computeNewStructure(NewExpression node) { |
- if (node.isConst) { |
- ConstantExpression constant = elements.getConstant(node); |
- if (constant is ConstructedConstantExpression) { |
- return new ConstInvokeStructure(constant); |
- } |
- } |
- |
Element element = elements[node.send]; |
Selector selector = elements.getSelector(node.send); |
DartType type = elements.getType(node); |
- ConstructorAccessSemantics constructorAccessSemantics; |
+ ConstructorAccessSemantics constructorAccessSemantics = |
+ computeConstructorAccessSemantics( |
+ element, type, mustBeConstant: node.isConst); |
if (node.isConst) { |
- // This is a non-constant constant constructor invocation, like |
- // `const Const(method())`. |
- constructorAccessSemantics = new ConstructorAccessSemantics( |
- ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR, element, type); |
- } else { |
- constructorAccessSemantics = |
- computeConstructorAccessSemantics(element, type); |
+ ConstantExpression constant = elements.getConstant(node); |
+ if (constructorAccessSemantics.isErroneous || |
+ constant is! ConstructedConstantExpression) { |
+ // This is a non-constant constant constructor invocation, like |
+ // `const Const(method())`. |
+ constructorAccessSemantics = new ConstructorAccessSemantics( |
+ ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR, element, type); |
+ } else { |
+ return new ConstInvokeStructure(constant); |
+ } |
} |
return new NewInvokeStructure(constructorAccessSemantics, selector); |
} |