Skip to content

Commit e43e28a

Browse files
fshcheglovCommit Queue
authored andcommitted
Update tests for Enum to work with augment.
Fix bugs that resulted in multiple `values` arrays being displayed for an augmentation chain. This is done by making `ListLiteralImpl.elements` mutable by setting `isNodeListFinal: false` in the AST generator, and adding a new`addElements` method. Made sure Enum's `TypeParameterFragment`s were linked. Rename `LibraryDirective.name2` to `name`. Change-Id: If80668d011cec6df5e22bee37a310de980a4205f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449381 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 3d30d3b commit e43e28a

File tree

10 files changed

+4148
-10933
lines changed

10 files changed

+4148
-10933
lines changed

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6324,7 +6324,7 @@ abstract final class DotShorthandConstructorInvocation
63246324

63256325
@GenerateNodeImpl(
63266326
childEntitiesOrder: [
6327-
GenerateNodeProperty('constKeyword'),
6327+
GenerateNodeProperty('constKeyword', isTokenFinal: false),
63286328
GenerateNodeProperty('period'),
63296329
GenerateNodeProperty('constructorName'),
63306330
GenerateNodeProperty('typeArguments', isSuper: true),
@@ -8514,7 +8514,7 @@ abstract final class ExtensionOverride implements Expression {
85148514
GenerateNodeProperty('name'),
85158515
GenerateNodeProperty('typeArguments'),
85168516
GenerateNodeProperty('argumentList'),
8517-
GenerateNodeProperty('element2', type: ExtensionElementImpl),
8517+
GenerateNodeProperty('element', type: ExtensionElementImpl),
85188518
],
85198519
)
85208520
final class ExtensionOverrideImpl extends ExpressionImpl
@@ -11772,6 +11772,9 @@ class GenerateNodeProperty {
1177211772
/// and no field or getter is generated, unless [superNullAssertOverride].
1177311773
final bool isSuper;
1177411774

11775+
/// Normally [NodeList] properties are final, but sometimes we mutate nodes.
11776+
final bool isNodeListFinal;
11777+
1177511778
/// Normally [Token] properties are final, but sometimes we mutate nodes.
1177611779
final bool isTokenFinal;
1177711780

@@ -11806,6 +11809,7 @@ class GenerateNodeProperty {
1180611809
const GenerateNodeProperty(
1180711810
this.name, {
1180811811
this.isSuper = false,
11812+
this.isNodeListFinal = true,
1180911813
this.isTokenFinal = true,
1181011814
this.withOverride = true,
1181111815
this.superNullAssertOverride = false,
@@ -14574,7 +14578,7 @@ abstract final class LibraryDirective implements Directive {
1457414578
@GenerateNodeImpl(
1457514579
childEntitiesOrder: [
1457614580
GenerateNodeProperty('libraryKeyword'),
14577-
GenerateNodeProperty('name2'),
14581+
GenerateNodeProperty('name'),
1457814582
GenerateNodeProperty('semicolon'),
1457914583
],
1458014584
)
@@ -14599,10 +14603,10 @@ final class LibraryDirectiveImpl extends DirectiveImpl
1459914603
required super.comment,
1460014604
required super.metadata,
1460114605
required this.libraryKeyword,
14602-
required LibraryIdentifierImpl? name2,
14606+
required LibraryIdentifierImpl? name,
1460314607
required this.semicolon,
14604-
}) : _name = name2 {
14605-
_becomeParentOf(name2);
14608+
}) : _name = name {
14609+
_becomeParentOf(name);
1460614610
}
1460714611

1460814612
@Deprecated('Use element instead')
@@ -14626,8 +14630,8 @@ final class LibraryDirectiveImpl extends DirectiveImpl
1462614630
LibraryIdentifierImpl? get name => _name;
1462714631

1462814632
@generated
14629-
set name(LibraryIdentifierImpl? name2) {
14630-
_name = _becomeParentOf(name2);
14633+
set name(LibraryIdentifierImpl? name) {
14634+
_name = _becomeParentOf(name);
1463114635
}
1463214636

1463314637
@Deprecated('Use name instead')
@@ -14638,7 +14642,7 @@ final class LibraryDirectiveImpl extends DirectiveImpl
1463814642
@override
1463914643
ChildEntities get _childEntities => super._childEntities
1464014644
..addToken('libraryKeyword', libraryKeyword)
14641-
..addNode('name2', name)
14645+
..addNode('name', name)
1464214646
..addToken('semicolon', semicolon);
1464314647

1464414648
@generated
@@ -14658,9 +14662,9 @@ final class LibraryDirectiveImpl extends DirectiveImpl
1465814662
if (super._childContainingRange(rangeOffset, rangeEnd) case var result?) {
1465914663
return result;
1466014664
}
14661-
if (name case var name2?) {
14662-
if (name2._containsOffset(rangeOffset, rangeEnd)) {
14663-
return name2;
14665+
if (name case var name?) {
14666+
if (name._containsOffset(rangeOffset, rangeEnd)) {
14667+
return name;
1466414668
}
1466514669
}
1466614670
return null;
@@ -14786,7 +14790,7 @@ abstract final class ListLiteral implements TypedLiteral {
1478614790
GenerateNodeProperty('constKeyword', isSuper: true),
1478714791
GenerateNodeProperty('typeArguments', isSuper: true),
1478814792
GenerateNodeProperty('leftBracket'),
14789-
GenerateNodeProperty('elements'),
14793+
GenerateNodeProperty('elements', isNodeListFinal: false),
1479014794
GenerateNodeProperty('rightBracket'),
1479114795
],
1479214796
)
@@ -14797,7 +14801,7 @@ final class ListLiteralImpl extends TypedLiteralImpl implements ListLiteral {
1479714801

1479814802
@generated
1479914803
@override
14800-
final NodeListImpl<CollectionElementImpl> elements = NodeListImpl._();
14804+
NodeListImpl<CollectionElementImpl> elements = NodeListImpl._();
1480114805

1480214806
@generated
1480314807
@override
@@ -14845,6 +14849,12 @@ final class ListLiteralImpl extends TypedLiteralImpl implements ListLiteral {
1484514849
@override
1484614850
E? accept<E>(AstVisitor<E> visitor) => visitor.visitListLiteral(this);
1484714851

14852+
void addElements(List<CollectionElementImpl> moreElements) {
14853+
elements = NodeListImpl._()
14854+
.._initialize(this, [...elements, ...moreElements]);
14855+
AstNodeImpl.linkNodeTokens(this);
14856+
}
14857+
1484814858
@generated
1484914859
@override
1485014860
void resolveExpression(ResolverVisitor resolver, TypeImpl contextType) {

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,6 +2093,10 @@ class EnumElementImpl extends InterfaceElementImpl implements EnumElement {
20932093
previous.addFragment(current);
20942094
return current;
20952095
});
2096+
TypeParameterFragmentImpl._linkFragments(
2097+
fragments,
2098+
getFragments: (f) => f.typeParameters,
2099+
);
20962100
}
20972101
}
20982102

pkg/analyzer/lib/src/fasta/ast_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2558,7 +2558,7 @@ class AstBuilder extends StackListener {
25582558
comment: comment,
25592559
metadata: metadata,
25602560
libraryKeyword: libraryKeyword,
2561-
name2: name,
2561+
name: name,
25622562
semicolon: semicolon,
25632563
),
25642564
);

pkg/analyzer/lib/src/summary2/element_builder.dart

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,21 @@ class ElementBuilder {
226226

227227
if (fragment.isAugmentation && lastFragment is EnumFragmentImpl) {
228228
lastFragment.addFragment(fragment);
229+
230+
_linkTypeParameters(
231+
lastFragments: lastFragment.typeParameters,
232+
fragments: fragment.typeParameters,
233+
add: fragment.addTypeParameter,
234+
);
235+
229236
return;
230237
}
231238

232239
var element = EnumElementImpl(
233240
_addTopReference('@enum', fragment.name),
234241
fragment,
235242
);
243+
236244
libraryElement.addEnum(element);
237245
libraryBuilder.declare(element, element.reference);
238246
}
@@ -311,6 +319,21 @@ class ElementBuilder {
311319
FieldFragmentImpl fieldFragment,
312320
) {
313321
var instanceFragment = fieldFragment.enclosingFragment;
322+
323+
// Move elements of `values` from augmentation to the first fragment.
324+
if (fieldFragment.name == 'values' &&
325+
instanceFragment is EnumFragmentImpl &&
326+
instanceFragment.previousFragment != null) {
327+
var implicitsMap = libraryBuilder.implicitEnumNodes;
328+
var augmentationImplicit = implicitsMap.remove(instanceFragment)!;
329+
var firstFragment = instanceFragment.element.firstFragment;
330+
var firstImplicit = implicitsMap[firstFragment]!;
331+
firstImplicit.valuesInitializer.addElements(
332+
augmentationImplicit.valuesInitializer.elements,
333+
);
334+
return;
335+
}
336+
314337
instanceFragment.addField(fieldFragment);
315338

316339
var lastFieldElement = _fieldElement(lastFragment);
@@ -1145,10 +1168,10 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
11451168
_addChildFragment(valuesField);
11461169

11471170
_libraryBuilder.implicitEnumNodes[fragment] = ImplicitEnumNodes(
1148-
element: fragment,
1171+
fragment: fragment,
11491172
valuesTypeNode: valuesTypeNode,
11501173
valuesNode: variableDeclaration,
1151-
valuesElement: valuesField,
1174+
valuesFragment: valuesField,
11521175
valuesNames: valuesNames,
11531176
valuesInitializer: initializer,
11541177
);

pkg/analyzer/lib/src/summary2/library_builder.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,18 @@ class DefiningLinkingUnit extends LinkingUnit {
3535
}
3636

3737
class ImplicitEnumNodes {
38-
final EnumFragmentImpl element;
38+
final EnumFragmentImpl fragment;
3939
final ast.NamedTypeImpl valuesTypeNode;
4040
final ast.VariableDeclarationImpl valuesNode;
41-
final FieldFragmentImpl valuesElement;
41+
final FieldFragmentImpl valuesFragment;
4242
final Set<String> valuesNames;
4343
ast.ListLiteralImpl valuesInitializer;
4444

4545
ImplicitEnumNodes({
46-
required this.element,
46+
required this.fragment,
4747
required this.valuesTypeNode,
4848
required this.valuesNode,
49-
required this.valuesElement,
49+
required this.valuesFragment,
5050
required this.valuesNames,
5151
required this.valuesInitializer,
5252
});
@@ -206,16 +206,16 @@ class LibraryBuilder {
206206
void buildEnumChildren() {
207207
var typeProvider = element.typeProvider;
208208
for (var enum_ in implicitEnumNodes.values) {
209-
enum_.element.element.supertype =
209+
enum_.fragment.element.supertype =
210210
typeProvider.enumType ?? typeProvider.objectType;
211211
var valuesType = typeProvider.listType(
212212
element.typeSystem.instantiateInterfaceToBounds(
213-
element: enum_.element.asElement2,
213+
element: enum_.fragment.asElement2,
214214
nullabilitySuffix: typeProvider.objectType.nullabilitySuffix,
215215
),
216216
);
217217
enum_.valuesTypeNode.type = valuesType;
218-
enum_.valuesElement.element.type = valuesType;
218+
enum_.valuesFragment.element.type = valuesType;
219219
}
220220
}
221221

pkg/analyzer/lib/src/summary2/types_builder.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,10 @@ class TypesBuilder {
213213
var fragment = node.declaredFragment!;
214214
var element = fragment.element;
215215

216-
element.interfaces = _toInterfaceTypeList(
217-
node.implementsClause?.interfaces,
218-
);
216+
element.interfaces = [
217+
...element.interfaces,
218+
..._toInterfaceTypeList(node.implementsClause?.interfaces),
219+
];
219220

220221
_addFragmentWithClause(fragment, node.withClause);
221222
}

pkg/analyzer/test/src/dart/resolution/library_directive_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ library foo.bar;
2323
assertResolvedNodeText(node, r'''
2424
LibraryDirective
2525
libraryKeyword: library
26-
name2: LibraryIdentifier
26+
name: LibraryIdentifier
2727
components
2828
SimpleIdentifier
2929
token: foo

pkg/analyzer/test/src/fasta/ast_builder_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1266,7 +1266,7 @@ library name.and.dots;
12661266
assertParsedNodeText(node, r'''
12671267
LibraryDirective
12681268
libraryKeyword: library
1269-
name2: LibraryIdentifier
1269+
name: LibraryIdentifier
12701270
components
12711271
SimpleIdentifier
12721272
token: name

0 commit comments

Comments
 (0)