Index: lib/src/compiler/code_generator.dart |
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart |
index afc215888c7717e1d980700366cea3921e415cff..bfc7dc95e960e65c47c14f4b018e088ee168da51 100644 |
--- a/lib/src/compiler/code_generator.dart |
+++ b/lib/src/compiler/code_generator.dart |
@@ -546,13 +546,14 @@ class CodeGenerator extends GeneralizingAstVisitor |
className = _emitTopLevelName(classElem); |
} |
+ var allFields = new List.from(fields)..addAll(staticFields); |
var superclasses = getSuperclasses(classElem); |
var virtualFields = <FieldElement, JS.TemporaryId>{}; |
var virtualFieldSymbols = <JS.Statement>[]; |
- _registerVirtualFields(classElem, className, superclasses, fields, |
- virtualFields, virtualFieldSymbols); |
+ var staticFieldOverrides = new HashSet<FieldElement>(); |
+ _registerPropertyOverrides(classElem, className, superclasses, allFields, |
+ virtualFields, virtualFieldSymbols, staticFieldOverrides); |
- var allFields = new List.from(fields)..addAll(staticFields); |
var classExpr = _emitClassExpression(classElem, |
_emitClassMethods(node, ctors, fields, superclasses, virtualFields), |
fields: allFields); |
@@ -579,30 +580,35 @@ class CodeGenerator extends GeneralizingAstVisitor |
} |
body = <JS.Statement>[classDef]; |
- _emitStaticFields(staticFields, classElem, body); |
+ _emitStaticFields(staticFields, staticFieldOverrides, classElem, body); |
_registerExtensionType(classElem, body); |
return _statement(body); |
} |
- void _registerVirtualFields( |
+ void _registerPropertyOverrides( |
ClassElement classElem, |
JS.Expression className, |
List<ClassElement> superclasses, |
List<FieldDeclaration> fields, |
Map<FieldElement, JS.TemporaryId> virtualFields, |
- List<JS.Statement> virtualFieldSymbols) { |
+ List<JS.Statement> virtualFieldSymbols, |
+ Set<FieldElement> staticFieldOverrides) { |
for (var field in fields) { |
for (VariableDeclaration field in field.fields.variables) { |
var overrideInfo = checkForPropertyOverride( |
field.element, superclasses, _extensionTypes); |
if (overrideInfo.foundGetter || overrideInfo.foundSetter) { |
- var fieldName = |
- _emitMemberName(field.element.name, type: classElem.type); |
- var virtualField = new JS.TemporaryId(field.element.name); |
- virtualFields[field.element] = virtualField; |
- virtualFieldSymbols.add(js.statement( |
- 'const # = Symbol(#.name + "." + #.toString());', |
- [virtualField, className, fieldName])); |
+ if (field.element.isStatic) { |
+ staticFieldOverrides.add(field.element); |
+ } else { |
+ var fieldName = |
+ _emitMemberName(field.element.name, type: classElem.type); |
+ var virtualField = new JS.TemporaryId(field.element.name); |
+ virtualFields[field.element] = virtualField; |
+ virtualFieldSymbols.add(js.statement( |
+ 'const # = Symbol(#.name + "." + #.toString());', |
+ [virtualField, className, fieldName])); |
+ } |
} |
} |
} |
@@ -1012,12 +1018,16 @@ class CodeGenerator extends GeneralizingAstVisitor |
/// Emits static fields for a class, and initialize them eagerly if possible, |
/// otherwise define them as lazy properties. |
- void _emitStaticFields(List<FieldDeclaration> staticFields, |
- ClassElement classElem, List<JS.Statement> body) { |
+ void _emitStaticFields( |
+ List<FieldDeclaration> staticFields, |
+ Set<FieldElement> staticFieldOverrides, |
+ ClassElement classElem, |
+ List<JS.Statement> body) { |
var lazyStatics = <VariableDeclaration>[]; |
for (FieldDeclaration member in staticFields) { |
for (VariableDeclaration field in member.fields.variables) { |
- JS.Statement eagerField = _emitConstantStaticField(classElem, field); |
+ JS.Statement eagerField = |
+ _emitConstantStaticField(classElem, field, staticFieldOverrides); |
if (eagerField != null) { |
body.add(eagerField); |
} else { |
@@ -2573,8 +2583,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
/// Otherwise, we'll need to generate a lazy-static field. That ensures |
/// correct visible behavior, as well as avoiding referencing something that |
/// isn't defined yet (because it is defined later in the module). |
- JS.Statement _emitConstantStaticField( |
- ClassElement classElem, VariableDeclaration field) { |
+ JS.Statement _emitConstantStaticField(ClassElement classElem, |
+ VariableDeclaration field, Set<FieldElement> staticFieldOverrides) { |
PropertyInducingElement element = field.element; |
assert(element.isStatic); |
@@ -2586,7 +2596,9 @@ class CodeGenerator extends GeneralizingAstVisitor |
isLoaded && (field.isConst || _constField.isFieldInitConstant(field)); |
var fieldName = field.name.name; |
- if (eagerInit && !JS.invalidStaticFieldName(fieldName)) { |
+ if (eagerInit && |
+ !JS.invalidStaticFieldName(fieldName) && |
+ !staticFieldOverrides.contains(element)) { |
return annotate( |
js.statement('#.# = #;', [ |
_emitTopLevelName(classElem), |