@@ -272,6 +272,9 @@ class ElementBuilder {
272272 FragmentImpl ? lastFragment,
273273 ConstructorFragmentImpl fragment,
274274 ) {
275+ var interfaceFragment = fragment.enclosingFragment;
276+ interfaceFragment.addConstructor (fragment);
277+
275278 var element = ConstructorElementImpl (
276279 name: fragment.name,
277280 reference: _addInstanceReference (
@@ -934,9 +937,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
934937 node.declaredFragment = fragment;
935938 _linker.elementNodes[fragment] = node;
936939
937- var parentFragment = _enclosingContext.fragment;
938- _libraryBuilder.addFragmentChild (parentFragment, fragment);
939- (parentFragment as InterfaceFragmentImpl ).addConstructor (fragment);
940+ _addChildFragment (fragment);
940941
941942 _buildExecutableElementChildren (
942943 fragment: fragment,
@@ -963,159 +964,156 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
963964
964965 _libraryBuilder.addTopFragment (_unitElement, fragment);
965966
967+ node.withClause? .accept (this );
968+ node.implementsClause? .accept (this );
969+
966970 var holder = _EnclosingContext (fragment: fragment);
971+ _withEnclosing (holder, () {
972+ // Build fields for all enum constants.
973+ var constants = node.constants;
974+ var valuesElements = < SimpleIdentifierImpl > [];
975+ var valuesNames = < String > {};
976+ for (var i = 0 ; i < constants.length; ++ i) {
977+ var constant = constants[i];
978+ var nameToken = constant.name;
979+ var name = nameToken.lexeme;
980+ var field =
981+ FieldFragmentImpl (
982+ name: _getFragmentName (nameToken),
983+ firstTokenOffset: null ,
984+ )
985+ ..hasImplicitType = true
986+ ..hasInitializer = true
987+ ..isAugmentation = constant.augmentKeyword != null
988+ ..isConst = true
989+ ..isEnumConstant = true
990+ ..isStatic = true ;
991+ field.metadata = _buildMetadata (constant.metadata);
992+
993+ var constantArguments = constant.arguments;
994+ var constructorSelector = constantArguments? .constructorSelector;
995+ var constructorName = constructorSelector? .name.name;
996+
997+ var initializer = InstanceCreationExpressionImpl (
998+ keyword: null ,
999+ constructorName: ConstructorNameImpl (
1000+ type: NamedTypeImpl (
1001+ importPrefix: null ,
1002+ name: StringToken (TokenType .STRING , fragment.name ?? '' , - 1 ),
1003+ typeArguments: constantArguments? .typeArguments,
1004+ question: null ,
1005+ ),
1006+ period: constructorName != null ? Tokens .period () : null ,
1007+ name:
1008+ constructorName != null
1009+ ? SimpleIdentifierImpl (
1010+ token: StringToken (TokenType .STRING , constructorName, - 1 ),
1011+ )
1012+ : null ,
1013+ ),
1014+ argumentList:
1015+ constantArguments != null
1016+ ? constantArguments.argumentList
1017+ : ArgumentListImpl (
1018+ leftParenthesis: Tokens .openParenthesis (),
1019+ arguments: [],
1020+ rightParenthesis: Tokens .closeParenthesis (),
1021+ ),
1022+ typeArguments: null ,
1023+ );
1024+
1025+ var variableDeclaration = VariableDeclarationImpl (
1026+ comment: null ,
1027+ metadata: [],
1028+ name: StringToken (TokenType .STRING , name, - 1 ),
1029+ equals: Tokens .eq (),
1030+ initializer: initializer,
1031+ );
1032+ constant.declaredFragment = field;
1033+ variableDeclaration.declaredFragment = field;
1034+ VariableDeclarationListImpl (
1035+ comment: null ,
1036+ metadata: null ,
1037+ lateKeyword: null ,
1038+ keyword: null ,
1039+ type: null ,
1040+ variables: [variableDeclaration],
1041+ );
1042+ _linker.elementNodes[field] = variableDeclaration;
1043+
1044+ _addChildFragment (field);
1045+
1046+ AstNodeImpl .linkNodeTokens (initializer);
1047+ field.constantInitializer = initializer;
1048+
1049+ valuesElements.add (
1050+ SimpleIdentifierImpl (token: StringToken (TokenType .STRING , name, - 1 )),
1051+ );
1052+ valuesNames.add (name);
1053+ }
9671054
968- // Build fields for all enum constants.
969- var constants = node.constants;
970- var valuesElements = < SimpleIdentifierImpl > [];
971- var valuesNames = < String > {};
972- for (var i = 0 ; i < constants.length; ++ i) {
973- var constant = constants[i];
974- var nameToken = constant.name;
975- var name = nameToken.lexeme;
976- var field =
977- FieldFragmentImpl (
978- name: _getFragmentName (nameToken),
979- firstTokenOffset: null ,
980- )
981- ..hasImplicitType = true
982- ..hasInitializer = true
983- ..isAugmentation = constant.augmentKeyword != null
1055+ // Build the 'values' field.
1056+ var valuesField =
1057+ FieldFragmentImpl (name: 'values' , firstTokenOffset: null )
1058+ ..hasEnclosingTypeParameterReference = false
9841059 ..isConst = true
985- ..isEnumConstant = true
986- ..isStatic = true ;
987- field.metadata = _buildMetadata (constant.metadata);
988-
989- var constantArguments = constant.arguments;
990- var constructorSelector = constantArguments? .constructorSelector;
991- var constructorName = constructorSelector? .name.name;
992-
993- var initializer = InstanceCreationExpressionImpl (
994- keyword: null ,
995- constructorName: ConstructorNameImpl (
996- type: NamedTypeImpl (
997- importPrefix: null ,
998- name: StringToken (TokenType .STRING , fragment.name ?? '' , - 1 ),
999- typeArguments: constantArguments? .typeArguments,
1000- question: null ,
1001- ),
1002- period: constructorName != null ? Tokens .period () : null ,
1003- name:
1004- constructorName != null
1005- ? SimpleIdentifierImpl (
1006- token: StringToken (TokenType .STRING , constructorName, - 1 ),
1007- )
1008- : null ,
1009- ),
1010- argumentList:
1011- constantArguments != null
1012- ? constantArguments.argumentList
1013- : ArgumentListImpl (
1014- leftParenthesis: Tokens .openParenthesis (),
1015- arguments: [],
1016- rightParenthesis: Tokens .closeParenthesis (),
1017- ),
1060+ ..isStatic = true
1061+ ..isSynthetic = true ;
1062+ var initializer = ListLiteralImpl (
1063+ constKeyword: null ,
10181064 typeArguments: null ,
1065+ leftBracket: Tokens .openSquareBracket (),
1066+ elements: valuesElements,
1067+ rightBracket: Tokens .closeSquareBracket (),
10191068 );
1069+ AstNodeImpl .linkNodeTokens (initializer);
1070+ valuesField.constantInitializer = initializer;
10201071
10211072 var variableDeclaration = VariableDeclarationImpl (
10221073 comment: null ,
10231074 metadata: [],
1024- name: StringToken (TokenType .STRING , name , - 1 ),
1075+ name: StringToken (TokenType .STRING , 'values' , - 1 ),
10251076 equals: Tokens .eq (),
10261077 initializer: initializer,
10271078 );
1028- constant.declaredFragment = field;
1029- variableDeclaration.declaredFragment = field;
1079+ var valuesTypeNode = NamedTypeImpl (
1080+ importPrefix: null ,
1081+ name: StringToken (TokenType .STRING , 'List' , - 1 ),
1082+ typeArguments: TypeArgumentListImpl (
1083+ leftBracket: Tokens .lt (),
1084+ arguments: [
1085+ NamedTypeImpl (
1086+ importPrefix: null ,
1087+ name: StringToken (TokenType .STRING , fragment.name ?? '' , - 1 ),
1088+ typeArguments: null ,
1089+ question: null ,
1090+ ),
1091+ ],
1092+ rightBracket: Tokens .gt (),
1093+ ),
1094+ question: null ,
1095+ );
10301096 VariableDeclarationListImpl (
10311097 comment: null ,
10321098 metadata: null ,
10331099 lateKeyword: null ,
1034- keyword: null ,
1035- type: null ,
1100+ keyword: Tokens .const_ (),
10361101 variables: [variableDeclaration],
1102+ type: valuesTypeNode,
10371103 );
1038- _linker.elementNodes[field ] = variableDeclaration;
1104+ _linker.elementNodes[valuesField ] = variableDeclaration;
10391105
1040- field.enclosingFragment = fragment;
1041- _libraryBuilder.addFragmentChild (fragment, field);
1106+ _addChildFragment (valuesField);
10421107
1043- AstNodeImpl .linkNodeTokens (initializer);
1044- field.constantInitializer = initializer;
1045-
1046- valuesElements.add (
1047- SimpleIdentifierImpl (token: StringToken (TokenType .STRING , name, - 1 )),
1108+ _libraryBuilder.implicitEnumNodes[fragment] = ImplicitEnumNodes (
1109+ element: fragment,
1110+ valuesTypeNode: valuesTypeNode,
1111+ valuesNode: variableDeclaration,
1112+ valuesElement: valuesField,
1113+ valuesNames: valuesNames,
1114+ valuesInitializer: initializer,
10481115 );
1049- valuesNames.add (name);
1050- }
1051-
1052- // Build the 'values' field.
1053- var valuesField =
1054- FieldFragmentImpl (name: 'values' , firstTokenOffset: null )
1055- ..hasEnclosingTypeParameterReference = false
1056- ..isConst = true
1057- ..isStatic = true
1058- ..isSynthetic = true ;
1059- var initializer = ListLiteralImpl (
1060- constKeyword: null ,
1061- typeArguments: null ,
1062- leftBracket: Tokens .openSquareBracket (),
1063- elements: valuesElements,
1064- rightBracket: Tokens .closeSquareBracket (),
1065- );
1066- AstNodeImpl .linkNodeTokens (initializer);
1067- valuesField.constantInitializer = initializer;
1068-
1069- var variableDeclaration = VariableDeclarationImpl (
1070- comment: null ,
1071- metadata: [],
1072- name: StringToken (TokenType .STRING , 'values' , - 1 ),
1073- equals: Tokens .eq (),
1074- initializer: initializer,
1075- );
1076- var valuesTypeNode = NamedTypeImpl (
1077- importPrefix: null ,
1078- name: StringToken (TokenType .STRING , 'List' , - 1 ),
1079- typeArguments: TypeArgumentListImpl (
1080- leftBracket: Tokens .lt (),
1081- arguments: [
1082- NamedTypeImpl (
1083- importPrefix: null ,
1084- name: StringToken (TokenType .STRING , fragment.name ?? '' , - 1 ),
1085- typeArguments: null ,
1086- question: null ,
1087- ),
1088- ],
1089- rightBracket: Tokens .gt (),
1090- ),
1091- question: null ,
1092- );
1093- VariableDeclarationListImpl (
1094- comment: null ,
1095- metadata: null ,
1096- lateKeyword: null ,
1097- keyword: Tokens .const_ (),
1098- variables: [variableDeclaration],
1099- type: valuesTypeNode,
1100- );
1101- _linker.elementNodes[valuesField] = variableDeclaration;
1102-
1103- valuesField.enclosingFragment = fragment;
1104- _libraryBuilder.addFragmentChild (fragment, valuesField);
1105-
1106- _libraryBuilder.implicitEnumNodes[fragment] = ImplicitEnumNodes (
1107- element: fragment,
1108- valuesTypeNode: valuesTypeNode,
1109- valuesNode: variableDeclaration,
1110- valuesElement: valuesField,
1111- valuesNames: valuesNames,
1112- valuesInitializer: initializer,
1113- );
1114-
1115- node.withClause? .accept (this );
1116- node.implementsClause? .accept (this );
11171116
1118- _withEnclosing (holder, () {
11191117 node.typeParameters? .accept (this );
11201118 node.members.accept (this );
11211119 });
@@ -1240,9 +1238,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
12401238 variable.declaredFragment = fragment;
12411239 _linker.elementNodes[fragment] = variable;
12421240
1243- var parentFragment = _enclosingContext.fragment;
1244- fragment.enclosingFragment = parentFragment;
1245- _libraryBuilder.addFragmentChild (parentFragment, fragment);
1241+ _addChildFragment (fragment);
12461242 }
12471243 node.fields.type? .accept (this );
12481244 }
@@ -1516,11 +1512,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
15161512 fragment.isAbstract = node.isAbstract;
15171513 fragment.isAugmentation = node.augmentKeyword != null ;
15181514 fragment.isStatic = node.isStatic;
1519-
1520- var parentFragment = _enclosingContext.fragment;
1521- fragment.enclosingFragment = parentFragment;
1522- _libraryBuilder.addFragmentChild (parentFragment, fragment);
1523-
1515+ _addChildFragment (fragment);
15241516 executableFragment = fragment;
15251517 } else if (node.isSetter) {
15261518 var fragment = SetterFragmentImpl (
@@ -1530,11 +1522,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
15301522 fragment.isAbstract = node.isAbstract;
15311523 fragment.isAugmentation = node.augmentKeyword != null ;
15321524 fragment.isStatic = node.isStatic;
1533-
1534- var parentFragment = _enclosingContext.fragment;
1535- fragment.enclosingFragment = parentFragment;
1536- _libraryBuilder.addFragmentChild (parentFragment, fragment);
1537-
1525+ _addChildFragment (fragment);
15381526 executableFragment = fragment;
15391527 } else {
15401528 var fragment = MethodFragmentImpl (
@@ -1544,11 +1532,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
15441532 fragment.isAbstract = node.isAbstract;
15451533 fragment.isAugmentation = node.augmentKeyword != null ;
15461534 fragment.isStatic = node.isStatic;
1547-
1548- var parentFragment = _enclosingContext.fragment;
1549- fragment.enclosingFragment = parentFragment;
1550- _libraryBuilder.addFragmentChild (parentFragment, fragment);
1551-
1535+ _addChildFragment (fragment);
15521536 executableFragment = fragment;
15531537 }
15541538 executableFragment.hasImplicitReturnType = node.returnType == null ;
@@ -1793,6 +1777,11 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
17931777 node.mixinTypes.accept (this );
17941778 }
17951779
1780+ void _addChildFragment (FragmentImpl child) {
1781+ var parent = _enclosingContext.fragment;
1782+ _libraryBuilder.addChildFragment (parent, child);
1783+ }
1784+
17961785 void _buildExecutableElementChildren ({
17971786 required ExecutableFragmentImpl fragment,
17981787 FormalParameterList ? formalParameters,
@@ -1840,8 +1829,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
18401829 representation.fieldFragment = fieldFragment;
18411830 _linker.elementNodes[fieldFragment] = representation;
18421831
1843- fieldFragment.enclosingFragment = extensionFragment;
1844- _libraryBuilder.addFragmentChild (extensionFragment, fieldFragment);
1832+ _addChildFragment (fieldFragment);
18451833
18461834 var formalParameterElement =
18471835 FieldFormalParameterFragmentImpl (
@@ -1867,8 +1855,7 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
18671855 representation.constructorFragment = constructorFragment;
18681856 _linker.elementNodes[constructorFragment] = representation;
18691857
1870- _libraryBuilder.addFragmentChild (extensionFragment, constructorFragment);
1871- extensionFragment.addConstructor (constructorFragment);
1858+ _addChildFragment (constructorFragment);
18721859 }
18731860
18741861 representation.fieldType.accept (this );
0 commit comments