Index: sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
index f52407efe8984acdb0f1380dae1ac8c7fbc027fb..975d4e510e16b9e3cf508dcee0246a52f3af35ec 100644 |
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
@@ -28,7 +28,6 @@ class ConstantHandler extends CompilerTask { |
/** Caches the statics where the initial value cannot be eagerly compiled. */ |
final Set<VariableElement> lazyStatics; |
- |
ConstantHandler(Compiler compiler, this.constantSystem) |
: initialVariableValues = new Map<VariableElement, dynamic>(), |
compiledConstants = new Set<Constant>(), |
@@ -248,6 +247,7 @@ class CompileTimeConstantEvaluator extends Visitor { |
final ConstantSystem constantSystem; |
final TreeElements elements; |
final Compiler compiler; |
+ bool enabledRuntimeTypeSupport = false; |
CompileTimeConstantEvaluator(this.constantSystem, |
this.elements, |
@@ -400,6 +400,25 @@ class CompileTimeConstantEvaluator extends Visitor { |
return constantSystem.createString(accumulator, node); |
} |
+ Constant makeTypeConstant(Element element) { |
+ // If we use a type literal in a constant, the compile time constant |
+ // emitter will generate a call to the runtime type cache helper, so we |
+ // resolve it and put it into the codegen work list. |
+ if (!enabledRuntimeTypeSupport) { |
+ SourceString helperName = const SourceString('createRuntimeType'); |
+ Element helper = compiler.findHelper(helperName); |
+ compiler.enqueuer.resolution.addToWorkList(helper); |
+ compiler.enqueuer.codegen.addToWorkList(helper); |
+ enabledRuntimeTypeSupport = true; |
+ } |
+ |
+ DartType elementType = element.computeType(compiler).asRaw(); |
+ DartType constantType = compiler.typeClass.computeType(compiler); |
+ Constant constant = new TypeConstant(elementType, constantType); |
+ compiler.constantHandler.registerCompileTimeConstant(constant); |
+ return constant; |
+ } |
+ |
// TODO(floitsch): provide better error-messages. |
Constant visitSend(Send send) { |
Element element = elements[send]; |
@@ -418,6 +437,8 @@ class CompileTimeConstantEvaluator extends Visitor { |
result = compiler.compileVariable(element); |
} |
if (result != null) return result; |
+ } else if (Elements.isClass(element) || Elements.isTypedef(element)) { |
+ return makeTypeConstant(element); |
} |
return signalNotCompileTimeConstant(send); |
} else if (send.isCall) { |
@@ -427,6 +448,8 @@ class CompileTimeConstantEvaluator extends Visitor { |
Constant right = evaluate(send.argumentsNode.nodes.tail.head); |
Constant result = constantSystem.identity.fold(left, right); |
if (result != null) return result; |
+ } else if (Elements.isClass(element) || Elements.isTypedef(element)) { |
+ return makeTypeConstant(element); |
} |
return signalNotCompileTimeConstant(send); |
} else if (send.isPrefix) { |