Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart |
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
index 89bbabc1d0c553611a3a8f21e5adf1839c99bf85..61289f56551347d76246385dcbbce17d2053c1b1 100644 |
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
@@ -125,7 +125,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
final ClassElement objectClass; |
final ClassElement stringClass; |
- ConstFieldVisitor _constField; |
+ ConstFieldVisitor _constants; |
/// The current function body being compiled. |
FunctionBody _currentFunction; |
@@ -276,7 +276,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
} |
_loader = new ElementLoader(nodes); |
if (compilationUnits.isNotEmpty) { |
- _constField = new ConstFieldVisitor(types, |
+ _constants = new ConstFieldVisitor(context, |
dummySource: compilationUnits.first.element.source); |
} |
@@ -2120,7 +2120,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
for (var declaration in fieldDecls) { |
for (var fieldNode in declaration.fields.variables) { |
var element = fieldNode.element; |
- if (_constField.isFieldInitConstant(fieldNode)) { |
+ if (_constants.isFieldInitConstant(fieldNode)) { |
unsetFields[element as FieldElement] = fieldNode; |
} else { |
fields[element as FieldElement] = _visitInitializer(fieldNode); |
@@ -3767,7 +3767,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
bool isLoaded = _loader.finishCheckingReferences(); |
bool eagerInit = |
- isLoaded && (field.isConst || _constField.isFieldInitConstant(field)); |
+ isLoaded && (field.isConst || _constants.isFieldInitConstant(field)); |
var fieldName = field.name.name; |
if (eagerInit && |
@@ -3796,7 +3796,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
bool eagerInit; |
JS.Expression jsInit; |
- if (field.isConst || _constField.isFieldInitConstant(field)) { |
+ if (field.isConst || _constants.isFieldInitConstant(field)) { |
// If the field is constant, try and generate it at the top level. |
_loader.startTopLevel(element); |
jsInit = _visitInitializer(field); |
@@ -3961,6 +3961,35 @@ class CodeGenerator extends GeneralizingAstVisitor |
var constructor = node.constructorName; |
var name = constructor.name; |
var type = constructor.type.type; |
+ if (node.isConst && |
+ element?.name == 'fromEnvironment' && |
+ element.library.isDartCore) { |
+ var value = node.accept(_constants.constantVisitor); |
+ |
+ if (value == null || value.isNull) { |
+ return new JS.LiteralNull(); |
+ } |
+ if (value.isUnknown) { |
+ return type == types.boolType |
+ ? js.boolean(false) |
vsm
2016/11/16 19:16:22
Can you add a comment explaining this case? When
Jennifer Messerly
2016/11/16 20:11:48
Sure, as best as I can. Unfortunately behavior of
|
+ : new JS.LiteralNull(); |
+ } |
+ if (value.type == types.boolType) { |
+ var boolValue = value.toBoolValue(); |
+ return boolValue != null ? js.boolean(boolValue) : new JS.LiteralNull(); |
+ } |
+ if (value.type == types.intType) { |
+ var intValue = value.toIntValue(); |
+ return intValue != null ? js.number(intValue) : new JS.LiteralNull(); |
+ } |
+ if (value.type == types.stringType) { |
+ var stringValue = value.toStringValue(); |
+ return stringValue != null |
+ ? js.escapedString(stringValue) |
+ : new JS.LiteralNull(); |
+ } |
+ throw new StateError('failed to evaluate $node'); |
+ } |
return _emitInstanceCreationExpression( |
element, type, name, node.argumentList, node.isConst); |
} |