@@ -546,13 +546,14 @@ class CodeGenerator extends GeneralizingAstVisitor
546
546
className = _emitTopLevelName (classElem);
547
547
}
548
548
549
+ var allFields = new List .from (fields)..addAll (staticFields);
549
550
var superclasses = getSuperclasses (classElem);
550
551
var virtualFields = < FieldElement , JS .TemporaryId > {};
551
552
var virtualFieldSymbols = < JS .Statement > [];
552
- _registerVirtualFields (classElem, className, superclasses, fields,
553
- virtualFields, virtualFieldSymbols);
553
+ var staticFieldOverrides = new HashSet <FieldElement >();
554
+ _registerPropertyOverrides (classElem, className, superclasses, allFields,
555
+ virtualFields, virtualFieldSymbols, staticFieldOverrides);
554
556
555
- var allFields = new List .from (fields)..addAll (staticFields);
556
557
var classExpr = _emitClassExpression (classElem,
557
558
_emitClassMethods (node, ctors, fields, superclasses, virtualFields),
558
559
fields: allFields);
@@ -579,30 +580,35 @@ class CodeGenerator extends GeneralizingAstVisitor
579
580
}
580
581
581
582
body = < JS .Statement > [classDef];
582
- _emitStaticFields (staticFields, classElem, body);
583
+ _emitStaticFields (staticFields, staticFieldOverrides, classElem, body);
583
584
_registerExtensionType (classElem, body);
584
585
return _statement (body);
585
586
}
586
587
587
- void _registerVirtualFields (
588
+ void _registerPropertyOverrides (
588
589
ClassElement classElem,
589
590
JS .Expression className,
590
591
List <ClassElement > superclasses,
591
592
List <FieldDeclaration > fields,
592
593
Map <FieldElement , JS .TemporaryId > virtualFields,
593
- List <JS .Statement > virtualFieldSymbols) {
594
+ List <JS .Statement > virtualFieldSymbols,
595
+ Set <FieldElement > staticFieldOverrides) {
594
596
for (var field in fields) {
595
597
for (VariableDeclaration field in field.fields.variables) {
596
598
var overrideInfo = checkForPropertyOverride (
597
599
field.element, superclasses, _extensionTypes);
598
600
if (overrideInfo.foundGetter || overrideInfo.foundSetter) {
599
- var fieldName =
600
- _emitMemberName (field.element.name, type: classElem.type);
601
- var virtualField = new JS .TemporaryId (field.element.name);
602
- virtualFields[field.element] = virtualField;
603
- virtualFieldSymbols.add (js.statement (
604
- 'const # = Symbol(#.name + "." + #.toString());' ,
605
- [virtualField, className, fieldName]));
601
+ if (field.element.isStatic) {
602
+ staticFieldOverrides.add (field.element);
603
+ } else {
604
+ var fieldName =
605
+ _emitMemberName (field.element.name, type: classElem.type);
606
+ var virtualField = new JS .TemporaryId (field.element.name);
607
+ virtualFields[field.element] = virtualField;
608
+ virtualFieldSymbols.add (js.statement (
609
+ 'const # = Symbol(#.name + "." + #.toString());' ,
610
+ [virtualField, className, fieldName]));
611
+ }
606
612
}
607
613
}
608
614
}
@@ -1012,12 +1018,16 @@ class CodeGenerator extends GeneralizingAstVisitor
1012
1018
1013
1019
/// Emits static fields for a class, and initialize them eagerly if possible,
1014
1020
/// otherwise define them as lazy properties.
1015
- void _emitStaticFields (List <FieldDeclaration > staticFields,
1016
- ClassElement classElem, List <JS .Statement > body) {
1021
+ void _emitStaticFields (
1022
+ List <FieldDeclaration > staticFields,
1023
+ Set <FieldElement > staticFieldOverrides,
1024
+ ClassElement classElem,
1025
+ List <JS .Statement > body) {
1017
1026
var lazyStatics = < VariableDeclaration > [];
1018
1027
for (FieldDeclaration member in staticFields) {
1019
1028
for (VariableDeclaration field in member.fields.variables) {
1020
- JS .Statement eagerField = _emitConstantStaticField (classElem, field);
1029
+ JS .Statement eagerField =
1030
+ _emitConstantStaticField (classElem, field, staticFieldOverrides);
1021
1031
if (eagerField != null ) {
1022
1032
body.add (eagerField);
1023
1033
} else {
@@ -2573,8 +2583,8 @@ class CodeGenerator extends GeneralizingAstVisitor
2573
2583
/// Otherwise, we'll need to generate a lazy-static field. That ensures
2574
2584
/// correct visible behavior, as well as avoiding referencing something that
2575
2585
/// isn't defined yet (because it is defined later in the module).
2576
- JS .Statement _emitConstantStaticField (
2577
- ClassElement classElem, VariableDeclaration field ) {
2586
+ JS .Statement _emitConstantStaticField (ClassElement classElem,
2587
+ VariableDeclaration field, Set < FieldElement > staticFieldOverrides ) {
2578
2588
PropertyInducingElement element = field.element;
2579
2589
assert (element.isStatic);
2580
2590
@@ -2586,7 +2596,9 @@ class CodeGenerator extends GeneralizingAstVisitor
2586
2596
isLoaded && (field.isConst || _constField.isFieldInitConstant (field));
2587
2597
2588
2598
var fieldName = field.name.name;
2589
- if (eagerInit && ! JS .invalidStaticFieldName (fieldName)) {
2599
+ if (eagerInit &&
2600
+ ! JS .invalidStaticFieldName (fieldName) &&
2601
+ ! staticFieldOverrides.contains (element)) {
2590
2602
return annotate (
2591
2603
js.statement ('#.# = #;' , [
2592
2604
_emitTopLevelName (classElem),
0 commit comments