Skip to content

Commit cb407e5

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Link fragments after reading.
Change-Id: I094ee531a6e00bcdd44a00cb6a818c55dc4c4d99 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/442340 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 17826a8 commit cb407e5

File tree

3 files changed

+150
-105
lines changed

3 files changed

+150
-105
lines changed

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

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,14 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
478478
return isMixableIn(library);
479479
}
480480

481+
void linkFragments(List<ClassFragmentImpl> fragments) {
482+
assert(identical(fragments[0], firstFragment));
483+
fragments.reduce((previous, current) {
484+
previous.addFragment(current);
485+
return current;
486+
});
487+
}
488+
481489
@override
482490
void _buildMixinAppConstructors() {
483491
// Do nothing if not a mixin application.
@@ -907,6 +915,14 @@ class ConstructorElementImpl extends ExecutableElementImpl
907915
}
908916
}
909917

918+
void linkFragments(List<ConstructorFragmentImpl> fragments) {
919+
assert(identical(fragments[0], firstFragment));
920+
fragments.reduce((previous, current) {
921+
previous.addFragment(current);
922+
return current;
923+
});
924+
}
925+
910926
@override
911927
void visitChildren<T>(ElementVisitor2<T> visitor) {
912928
for (var child in children) {
@@ -1074,6 +1090,12 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
10741090
typeNameOffset ??
10751091
firstTokenOffset ??
10761092
enclosingFragment.offset;
1093+
1094+
void addFragment(ConstructorFragmentImpl fragment) {
1095+
fragment.element = element;
1096+
fragment.previousFragment = this;
1097+
nextFragment = fragment;
1098+
}
10771099
}
10781100

10791101
/// This mixin is used to set up loading class members from summaries only when
@@ -2121,6 +2143,14 @@ class EnumElementImpl extends InterfaceElementImpl implements EnumElement {
21212143
void appendTo(ElementDisplayStringBuilder builder) {
21222144
builder.writeEnumElement(this);
21232145
}
2146+
2147+
void linkFragments(List<EnumFragmentImpl> fragments) {
2148+
assert(identical(fragments[0], firstFragment));
2149+
fragments.reduce((previous, current) {
2150+
previous.addFragment(current);
2151+
return current;
2152+
});
2153+
}
21242154
}
21252155

21262156
/// An [InterfaceFragmentImpl] which is an enum.
@@ -2564,6 +2594,14 @@ class ExtensionElementImpl extends InstanceElementImpl
25642594
void appendTo(ElementDisplayStringBuilder builder) {
25652595
builder.writeExtensionElement(this);
25662596
}
2597+
2598+
void linkFragments(List<ExtensionFragmentImpl> fragments) {
2599+
assert(identical(fragments[0], firstFragment));
2600+
fragments.reduce((previous, current) {
2601+
previous.addFragment(current);
2602+
return current;
2603+
});
2604+
}
25672605
}
25682606

25692607
class ExtensionFragmentImpl extends InstanceFragmentImpl
@@ -2716,6 +2754,14 @@ class ExtensionTypeElementImpl extends InterfaceElementImpl
27162754
void appendTo(ElementDisplayStringBuilder builder) {
27172755
builder.writeExtensionTypeElement(this);
27182756
}
2757+
2758+
void linkFragments(List<ExtensionTypeFragmentImpl> fragments) {
2759+
assert(identical(fragments[0], firstFragment));
2760+
fragments.reduce((previous, current) {
2761+
previous.addFragment(current);
2762+
return current;
2763+
});
2764+
}
27192765
}
27202766

27212767
class ExtensionTypeFragmentImpl extends InterfaceFragmentImpl
@@ -2908,6 +2954,14 @@ class FieldElementImpl extends PropertyInducingElementImpl
29082954
@Deprecated('Use accept instead')
29092955
@override
29102956
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
2957+
2958+
void linkFragments(List<FieldFragmentImpl> fragments) {
2959+
assert(identical(fragments[0], firstFragment));
2960+
fragments.reduce((previous, current) {
2961+
previous.addFragment(current);
2962+
return current;
2963+
});
2964+
}
29112965
}
29122966

29132967
class FieldFormalParameterElementImpl extends FormalParameterElementImpl
@@ -4087,6 +4141,14 @@ class GetterElementImpl extends PropertyAccessorElementImpl
40874141
void appendTo(ElementDisplayStringBuilder builder) {
40884142
builder.writeGetterElement(this);
40894143
}
4144+
4145+
void linkFragments(List<GetterFragmentImpl> fragments) {
4146+
assert(identical(fragments[0], firstFragment));
4147+
fragments.reduce((previous, current) {
4148+
previous.addFragment(current);
4149+
return current;
4150+
});
4151+
}
40904152
}
40914153

40924154
class GetterFragmentImpl extends PropertyAccessorFragmentImpl
@@ -7506,6 +7568,14 @@ class MethodElementImpl extends ExecutableElementImpl
75067568
void appendTo(ElementDisplayStringBuilder builder) {
75077569
builder.writeMethodElement(this);
75087570
}
7571+
7572+
void linkFragments(List<MethodFragmentImpl> fragments) {
7573+
assert(identical(fragments[0], firstFragment));
7574+
fragments.reduce((previous, current) {
7575+
previous.addFragment(current);
7576+
return current;
7577+
});
7578+
}
75097579
}
75107580

75117581
class MethodFragmentImpl extends ExecutableFragmentImpl
@@ -7653,6 +7723,14 @@ class MixinElementImpl extends InterfaceElementImpl implements MixinElement {
76537723
bool isImplementableIn2(LibraryElement library) {
76547724
return isImplementableIn(library);
76557725
}
7726+
7727+
void linkFragments(List<MixinFragmentImpl> fragments) {
7728+
assert(identical(fragments[0], firstFragment));
7729+
fragments.reduce((previous, current) {
7730+
previous.addFragment(current);
7731+
return current;
7732+
});
7733+
}
76567734
}
76577735

76587736
/// A [ClassFragmentImpl] representing a mixin declaration.
@@ -8960,6 +9038,14 @@ class SetterElementImpl extends PropertyAccessorElementImpl
89609038
void appendTo(ElementDisplayStringBuilder builder) {
89619039
builder.writeSetterElement(this);
89629040
}
9041+
9042+
void linkFragments(List<SetterFragmentImpl> fragments) {
9043+
assert(identical(fragments[0], firstFragment));
9044+
fragments.reduce((previous, current) {
9045+
previous.addFragment(current);
9046+
return current;
9047+
});
9048+
}
89639049
}
89649050

89659051
class SetterFragmentImpl extends PropertyAccessorFragmentImpl
@@ -9269,6 +9355,14 @@ class TopLevelFunctionElementImpl extends ExecutableElementImpl
92699355
void appendTo(ElementDisplayStringBuilder builder) {
92709356
builder.writeTopLevelFunctionElement(this);
92719357
}
9358+
9359+
void linkFragments(List<TopLevelFunctionFragmentImpl> fragments) {
9360+
assert(identical(fragments[0], firstFragment));
9361+
fragments.reduce((previous, current) {
9362+
previous.addFragment(current);
9363+
return current;
9364+
});
9365+
}
92729366
}
92739367

92749368
/// A concrete implementation of a [TopLevelFunctionFragment].
@@ -9407,6 +9501,14 @@ class TopLevelVariableElementImpl extends PropertyInducingElementImpl
94079501
@Deprecated('Use accept instead')
94089502
@override
94099503
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
9504+
9505+
void linkFragments(List<TopLevelVariableFragmentImpl> fragments) {
9506+
assert(identical(fragments[0], firstFragment));
9507+
fragments.reduce((previous, current) {
9508+
previous.addFragment(current);
9509+
return current;
9510+
});
9511+
}
94109512
}
94119513

94129514
class TopLevelVariableFragmentImpl extends PropertyInducingFragmentImpl

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

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,9 @@ class LibraryReader {
264264
void _readClassElements() {
265265
_libraryElement.classes = _reader.readTypedList(() {
266266
var reference = _readReference();
267-
var fragments = _readFragments<ClassFragmentImpl>();
268-
// TODO(scheglov): link fragments.
267+
var fragments = _readFragmentsById<ClassFragmentImpl>();
269268
var element = ClassElementImpl(reference, fragments.first);
269+
element.linkFragments(fragments);
270270
element.readModifiers(_reader);
271271

272272
// Configure for reading members lazily.
@@ -340,13 +340,13 @@ class LibraryReader {
340340
List<ConstructorElementImpl> _readConstructorElements() {
341341
return _reader.readTypedList(() {
342342
var reference = _readReference();
343-
var fragments = _readFragments<ConstructorFragmentImpl>();
344-
// TODO(scheglov): link fragments.
343+
var fragments = _readFragmentsById<ConstructorFragmentImpl>();
345344
var element = ConstructorElementImpl(
346345
name: fragments.first.name,
347346
reference: reference,
348347
firstFragment: fragments.first,
349348
);
349+
element.linkFragments(fragments);
350350
element.readModifiers(_reader);
351351

352352
// TODO(scheglov): type parameters
@@ -478,9 +478,9 @@ class LibraryReader {
478478
void _readEnumElements() {
479479
_libraryElement.enums = _reader.readTypedList(() {
480480
var reference = _readReference();
481-
var fragments = _readFragments<EnumFragmentImpl>();
482-
// TODO(scheglov): link fragments.
481+
var fragments = _readFragmentsById<EnumFragmentImpl>();
483482
var element = EnumElementImpl(reference, fragments.first);
483+
element.linkFragments(fragments);
484484

485485
// TODO(scheglov): consider reading lazily
486486
for (var fragment in element.fragments) {
@@ -563,9 +563,9 @@ class LibraryReader {
563563
void _readExtensionElements() {
564564
_libraryElement.extensions = _reader.readTypedList(() {
565565
var reference = _readReference();
566-
var fragments = _readFragments<ExtensionFragmentImpl>();
567-
// TODO(scheglov): link fragments.
566+
var fragments = _readFragmentsById<ExtensionFragmentImpl>();
568567
var element = ExtensionElementImpl(reference, fragments.first);
568+
element.linkFragments(fragments);
569569

570570
for (var fragment in element.fragments) {
571571
fragment.ensureReadMembers();
@@ -621,9 +621,9 @@ class LibraryReader {
621621
void _readExtensionTypeElements() {
622622
_libraryElement.extensionTypes = _reader.readTypedList(() {
623623
var reference = _readReference();
624-
var fragments = _readFragments<ExtensionTypeFragmentImpl>();
625-
// TODO(scheglov): link fragments.
624+
var fragments = _readFragmentsById<ExtensionTypeFragmentImpl>();
626625
var element = ExtensionTypeElementImpl(reference, fragments.first);
626+
element.linkFragments(fragments);
627627

628628
// TODO(scheglov): consider reading lazily
629629
for (var fragment in element.fragments) {
@@ -690,12 +690,12 @@ class LibraryReader {
690690
List<FieldElementImpl> _readFieldElements() {
691691
return _reader.readTypedList(() {
692692
var reference = _readReference();
693-
var fragments = _readFragments<FieldFragmentImpl>();
694-
// TODO(scheglov): link fragments.
693+
var fragments = _readFragmentsById<FieldFragmentImpl>();
695694
var element = FieldElementImpl(
696695
reference: reference,
697696
firstFragment: fragments.first,
698697
);
698+
element.linkFragments(fragments);
699699

700700
element.deferReadResolution(
701701
_createDeferredReadResolutionCallback((reader) {
@@ -776,16 +776,16 @@ class LibraryReader {
776776
return _reader.readOptionalStringReference();
777777
}
778778

779-
List<T> _readFragments<T extends FragmentImpl>() {
779+
List<T> _readFragmentsById<T extends FragmentImpl>() {
780780
return _reader.readTypedList(_readFragmentById);
781781
}
782782

783783
List<GetterElementImpl> _readGetterElements() {
784784
return _reader.readTypedList(() {
785785
var reference = _readReference();
786-
var fragments = _readFragments<GetterFragmentImpl>();
787-
// TODO(scheglov): link fragments.
786+
var fragments = _readFragmentsById<GetterFragmentImpl>();
788787
var element = GetterElementImpl(reference, fragments.first);
788+
element.linkFragments(fragments);
789789
element.readModifiers(_reader);
790790

791791
element.deferReadResolution(
@@ -907,13 +907,13 @@ class LibraryReader {
907907
List<MethodElementImpl> _readMethodElements() {
908908
return _reader.readTypedList(() {
909909
var reference = _readReference();
910-
var fragments = _readFragments<MethodFragmentImpl>();
911-
// TODO(scheglov): link fragments.
910+
var fragments = _readFragmentsById<MethodFragmentImpl>();
912911
var element = MethodElementImpl(
913912
name: fragments.first.name,
914913
reference: reference,
915914
firstFragment: fragments.first,
916915
);
916+
element.linkFragments(fragments);
917917
element.readModifiers(_reader);
918918
element.typeInferenceError = _readTopLevelInferenceError();
919919

@@ -970,9 +970,9 @@ class LibraryReader {
970970
void _readMixinElements() {
971971
_libraryElement.mixins = _reader.readTypedList(() {
972972
var reference = _readReference();
973-
var fragments = _readFragments<MixinFragmentImpl>();
974-
// TODO(scheglov): link fragments.
973+
var fragments = _readFragmentsById<MixinFragmentImpl>();
975974
var element = MixinElementImpl(reference, fragments.first);
975+
element.linkFragments(fragments);
976976
element.readModifiers(_reader);
977977

978978
// TODO(scheglov): consider reading lazily
@@ -1108,9 +1108,9 @@ class LibraryReader {
11081108
List<SetterElementImpl> _readSetterElements() {
11091109
return _reader.readTypedList(() {
11101110
var reference = _readReference();
1111-
var fragments = _readFragments<SetterFragmentImpl>();
1112-
// TODO(scheglov): link fragments.
1111+
var fragments = _readFragmentsById<SetterFragmentImpl>();
11131112
var element = SetterElementImpl(reference, fragments.first);
1113+
element.linkFragments(fragments);
11141114
element.readModifiers(_reader);
11151115

11161116
element.deferReadResolution(
@@ -1191,9 +1191,9 @@ class LibraryReader {
11911191
void _readTopLevelFunctionElements() {
11921192
_libraryElement.topLevelFunctions = _reader.readTypedList(() {
11931193
var reference = _readReference();
1194-
var fragments = _readFragments<TopLevelFunctionFragmentImpl>();
1195-
// TODO(scheglov): link fragments.
1194+
var fragments = _readFragmentsById<TopLevelFunctionFragmentImpl>();
11961195
var element = TopLevelFunctionElementImpl(reference, fragments.first);
1196+
element.linkFragments(fragments);
11971197

11981198
element.deferReadResolution(
11991199
_createDeferredReadResolutionCallback((reader) {
@@ -1253,9 +1253,9 @@ class LibraryReader {
12531253
void _readTopLevelVariableElements() {
12541254
_libraryElement.topLevelVariables = _reader.readTypedList(() {
12551255
var reference = _readReference();
1256-
var fragments = _readFragments<TopLevelVariableFragmentImpl>();
1257-
// TODO(scheglov): link fragments.
1256+
var fragments = _readFragmentsById<TopLevelVariableFragmentImpl>();
12581257
var element = TopLevelVariableElementImpl(reference, fragments.first);
1258+
element.linkFragments(fragments);
12591259

12601260
element.deferReadResolution(
12611261
_createDeferredReadResolutionCallback((reader) {
@@ -1293,7 +1293,7 @@ class LibraryReader {
12931293
void _readTypeAliasElements() {
12941294
_libraryElement.typeAliases = _reader.readTypedList(() {
12951295
var reference = _readReference();
1296-
var fragments = _readFragments<TypeAliasFragmentImpl>();
1296+
var fragments = _readFragmentsById<TypeAliasFragmentImpl>();
12971297
var element = TypeAliasElementImpl(reference, fragments.first);
12981298

12991299
element.deferReadResolution(

0 commit comments

Comments
 (0)