Skip to content

Commit 28bbe25

Browse files
fshcheglovCommit Queue
authored andcommitted
Implement type parameter linking between augmentations in non-erroneous class augmentations.
This implementation is currently for classes only, future CLs will add it for other top-levels and methods. It is expected that all ClassFragment(s) have the same number of type parameters. I plan to implement recovery for incorrect cases in the future. Change-Id: I4708f23b74a4fef2258c33aa67e3a57d72b333c9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448257 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent 4af0918 commit 28bbe25

File tree

5 files changed

+122
-91
lines changed

5 files changed

+122
-91
lines changed

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,7 @@ mixin DeferredMembersReadingMixin {
957957
/// invoke [_ensureReadResolution].
958958
mixin DeferredResolutionReadingMixin {
959959
// TODO(scheglov): review whether we need this
960-
int _lockResolutionLoading = 0;
960+
static int _lockResolutionLoading = 0;
961961
void Function()? _readResolutionCallback;
962962
void Function()? _applyResolutionConstantOffsets;
963963

@@ -10067,6 +10067,12 @@ class TypeParameterFragmentImpl extends FragmentImpl
1006710067
@override
1006810068
int? nameOffset;
1006910069

10070+
@override
10071+
TypeParameterFragmentImpl? previousFragment;
10072+
10073+
@override
10074+
TypeParameterFragmentImpl? nextFragment;
10075+
1007010076
/// The element corresponding to this fragment.
1007110077
TypeParameterElementImpl? _element;
1007210078

@@ -10120,16 +10126,14 @@ class TypeParameterFragmentImpl extends FragmentImpl
1012010126
@override
1012110127
MetadataImpl get metadata2 => metadata;
1012210128

10123-
@override
10124-
// TODO(augmentations): Support chaining between the fragments.
10125-
TypeParameterFragmentImpl? get nextFragment => null;
10126-
1012710129
@override
1012810130
int get offset => nameOffset ?? firstTokenOffset!;
1012910131

10130-
@override
10131-
// TODO(augmentations): Support chaining between the fragments.
10132-
TypeParameterFragmentImpl? get previousFragment => null;
10132+
void addFragment(TypeParameterFragmentImpl fragment) {
10133+
fragment.element = element;
10134+
fragment.previousFragment = this;
10135+
nextFragment = fragment;
10136+
}
1013310137
}
1013410138

1013510139
abstract class VariableElementImpl extends ElementImpl

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,19 @@ class LibraryReader {
265265
var fragments = _readFragmentsById<ClassFragmentImpl>();
266266
var element = ClassElementImpl(reference, fragments.first);
267267
element.linkFragments(fragments);
268+
269+
element.withoutLoadingResolution(() {
270+
var typeParameterFragments = fragments.first.typeParameters;
271+
for (var i = 0; i < typeParameterFragments.length; i++) {
272+
// Side effect: set element for the fragment.
273+
TypeParameterElementImpl(firstFragment: typeParameterFragments[i]);
274+
fragments.reduce((previous, current) {
275+
previous.typeParameters[i].addFragment(current.typeParameters[i]);
276+
return current;
277+
});
278+
}
279+
});
280+
268281
element.readModifiers(_reader);
269282
element.hasNonFinalField = _reader.readBool();
270283

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,23 @@ class ElementBuilder {
193193

194194
if (fragment.isAugmentation && lastFragment is ClassFragmentImpl) {
195195
lastFragment.addFragment(fragment);
196+
197+
var lastTypeParameterFragments = lastFragment.typeParameters;
198+
for (var i = 0; i < lastTypeParameterFragments.length; i++) {
199+
lastTypeParameterFragments[i].addFragment(fragment.typeParameters[i]);
200+
}
196201
return;
197202
}
198203

199204
var element = ClassElementImpl(
200205
_addTopReference('@class', fragment.name),
201206
fragment,
202207
);
208+
209+
for (var typeParameterFragment in fragment.typeParameters) {
210+
TypeParameterElementImpl(firstFragment: typeParameterFragment);
211+
}
212+
203213
libraryElement.addClass(element);
204214
libraryBuilder.declare(element, element.reference);
205215
}

pkg/analyzer/test/src/summary/element_text.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1879,7 +1879,8 @@ class _Element2Writer extends _AbstractElementWriter {
18791879

18801880
_sink.withIndent(() {
18811881
_writeElementReference('element', f.element);
1882-
// _writeCodeRange(e);
1882+
_writeFragmentReference('previousFragment', f.previousFragment);
1883+
_writeFragmentReference('nextFragment', f.nextFragment);
18831884

18841885
// var bound = e.bound;
18851886
// if (bound != null) {

0 commit comments

Comments
 (0)