Skip to content

Commit 22075cf

Browse files
fshcheglovCommit Queue
authored andcommitted
Add tests in class_test and mixin_test for type parameters in methods.
Make type parameter linking and error correction occur through a generic method in `bundle_reader` and `element_builder` respectively. Moved the generic type parameter method from `bundle_reader` to a static method of `TypeParameterFragmentImpl` in `element`. Fix a bug with augments where the last augment type is preserved instead of the first. Change-Id: I37a1cc54a3e73cfc2eb981a817b1d4bcf09f21dc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448801 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 5700eea commit 22075cf

File tree

7 files changed

+3651
-5429
lines changed

7 files changed

+3651
-5429
lines changed

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

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,10 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
443443
previous.addFragment(current);
444444
return current;
445445
});
446+
TypeParameterFragmentImpl._linkFragments(
447+
fragments,
448+
getFragments: (f) => f.typeParameters,
449+
);
446450
}
447451

448452
@override
@@ -1015,12 +1019,6 @@ mixin DeferredResolutionReadingMixin {
10151019
_applyResolutionConstantOffsets = callback;
10161020
}
10171021

1018-
void withoutLoadingResolution(void Function() operation) {
1019-
_lockResolutionLoading++;
1020-
operation();
1021-
_lockResolutionLoading--;
1022-
}
1023-
10241022
void _ensureReadResolution() {
10251023
if (_lockResolutionLoading > 0) {
10261024
return;
@@ -1037,6 +1035,12 @@ mixin DeferredResolutionReadingMixin {
10371035
}
10381036
}
10391037
}
1038+
1039+
static void withoutLoadingResolution(void Function() operation) {
1040+
_lockResolutionLoading++;
1041+
operation();
1042+
_lockResolutionLoading--;
1043+
}
10401044
}
10411045

10421046
class DirectiveUriImpl implements DirectiveUri {}
@@ -7860,6 +7864,10 @@ class MethodElementImpl extends ExecutableElementImpl
78607864
previous.addFragment(current);
78617865
return current;
78627866
});
7867+
TypeParameterFragmentImpl._linkFragments(
7868+
fragments,
7869+
getFragments: (f) => f.typeParameters,
7870+
);
78637871
}
78647872
}
78657873

@@ -7923,6 +7931,11 @@ class MethodFragmentImpl extends ExecutableFragmentImpl
79237931
fragment.previousFragment = this;
79247932
nextFragment = fragment;
79257933
}
7934+
7935+
void addTypeParameter(TypeParameterFragmentImpl typeParameter) {
7936+
_typeParameters.add(typeParameter);
7937+
typeParameter.enclosingFragment = this;
7938+
}
79267939
}
79277940

79287941
@elementClass
@@ -8055,6 +8068,10 @@ class MixinElementImpl extends InterfaceElementImpl implements MixinElement {
80558068
previous.addFragment(current);
80568069
return current;
80578070
});
8071+
TypeParameterFragmentImpl._linkFragments(
8072+
fragments,
8073+
getFragments: (f) => f.typeParameters,
8074+
);
80588075
}
80598076
}
80608077

@@ -10524,6 +10541,23 @@ class TypeParameterFragmentImpl extends FragmentImpl
1052410541
fragment.previousFragment = this;
1052510542
nextFragment = fragment;
1052610543
}
10544+
10545+
static void _linkFragments<T extends FragmentImpl>(
10546+
List<T> fragments, {
10547+
required List<TypeParameterFragmentImpl> Function(T) getFragments,
10548+
}) {
10549+
DeferredResolutionReadingMixin.withoutLoadingResolution(() {
10550+
var firstFragments = getFragments(fragments.first);
10551+
for (var i = 0; i < firstFragments.length; i++) {
10552+
// Side effect: set element for the fragment.
10553+
TypeParameterElementImpl(firstFragment: firstFragments[i]);
10554+
fragments.reduce((previous, current) {
10555+
getFragments(previous)[i].addFragment(getFragments(current)[i]);
10556+
return current;
10557+
});
10558+
}
10559+
});
10560+
}
1052710561
}
1052810562

1052910563
abstract class VariableElementImpl extends ElementImpl

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -266,18 +266,6 @@ class LibraryReader {
266266
var element = ClassElementImpl(reference, fragments.first);
267267
element.linkFragments(fragments);
268268

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-
281269
element.readModifiers(_reader);
282270
element.hasNonFinalField = _reader.readBool();
283271

@@ -913,6 +901,7 @@ class LibraryReader {
913901
firstFragment: fragments.first,
914902
);
915903
element.linkFragments(fragments);
904+
916905
element.readModifiers(_reader);
917906
element.typeInferenceError = _readTopLevelInferenceError();
918907

@@ -970,6 +959,7 @@ class LibraryReader {
970959
var fragments = _readFragmentsById<MixinFragmentImpl>();
971960
var element = MixinElementImpl(reference, fragments.first);
972961
element.linkFragments(fragments);
962+
973963
element.readModifiers(_reader);
974964
element.hasNonFinalField = _reader.readBool();
975965

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

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -194,30 +194,11 @@ class ElementBuilder {
194194
if (fragment.isAugmentation && lastFragment is ClassFragmentImpl) {
195195
lastFragment.addFragment(fragment);
196196

197-
var lastTypeParameterFragments = lastFragment.typeParameters;
198-
199-
// Trim extra type parameters.
200-
if (lastTypeParameterFragments.length < fragment.typeParameters.length) {
201-
fragment.typeParameters.length = lastTypeParameterFragments.length;
202-
}
203-
204-
// Add missing type parameters.
205-
if (lastTypeParameterFragments.length > fragment.typeParameters.length) {
206-
for (
207-
var i = fragment.typeParameters.length;
208-
i < lastTypeParameterFragments.length;
209-
i++
210-
) {
211-
fragment.addTypeParameter(
212-
TypeParameterFragmentImpl(name: lastTypeParameterFragments[i].name)
213-
..isSynthetic = true,
214-
);
215-
}
216-
}
217-
218-
for (var i = 0; i < lastTypeParameterFragments.length; i++) {
219-
lastTypeParameterFragments[i].addFragment(fragment.typeParameters[i]);
220-
}
197+
_linkTypeParameters(
198+
lastFragments: lastFragment.typeParameters,
199+
fragments: fragment.typeParameters,
200+
add: fragment.addTypeParameter,
201+
);
221202
return;
222203
}
223204

@@ -227,6 +208,7 @@ class ElementBuilder {
227208
);
228209

229210
for (var typeParameterFragment in fragment.typeParameters) {
211+
// Side effect: set element for the fragment.
230212
TypeParameterElementImpl(firstFragment: typeParameterFragment);
231213
}
232214

@@ -471,9 +453,21 @@ class ElementBuilder {
471453

472454
if (lastFragment is MethodFragmentImpl && fragment.isAugmentation) {
473455
lastFragment.addFragment(fragment);
456+
457+
_linkTypeParameters(
458+
lastFragments: lastFragment.typeParameters,
459+
fragments: fragment.typeParameters,
460+
add: fragment.addTypeParameter,
461+
);
462+
474463
return;
475464
}
476465

466+
for (var typeParameterFragment in fragment.typeParameters) {
467+
// Side effect: set element for the fragment.
468+
TypeParameterElementImpl(firstFragment: typeParameterFragment);
469+
}
470+
477471
instanceElement.addMethod(
478472
MethodElementImpl(
479473
name: fragment.name,
@@ -549,16 +543,28 @@ class ElementBuilder {
549543
) {
550544
assert(!fragment.isSynthetic);
551545
libraryFragment.addMixin(fragment);
552-
553546
if (fragment.isAugmentation && lastFragment is MixinFragmentImpl) {
554547
lastFragment.addFragment(fragment);
548+
549+
_linkTypeParameters(
550+
lastFragments: lastFragment.typeParameters,
551+
fragments: fragment.typeParameters,
552+
add: fragment.addTypeParameter,
553+
);
554+
555555
return;
556556
}
557557

558558
var element = MixinElementImpl(
559559
_addTopReference('@mixin', fragment.name),
560560
fragment,
561561
);
562+
563+
for (var typeParameterFragment in fragment.typeParameters) {
564+
// Side effect: set element for the fragment.
565+
TypeParameterElementImpl(firstFragment: typeParameterFragment);
566+
}
567+
562568
libraryElement.addMixin(element);
563569
libraryBuilder.declare(element, element.reference);
564570
}
@@ -766,6 +772,31 @@ class ElementBuilder {
766772
}
767773
}
768774

775+
void _linkTypeParameters<T extends FragmentImpl>({
776+
required List<TypeParameterFragmentImpl> lastFragments,
777+
required List<TypeParameterFragmentImpl> fragments,
778+
required void Function(TypeParameterFragmentImpl) add,
779+
}) {
780+
// Trim extra type parameters.
781+
if (lastFragments.length < fragments.length) {
782+
fragments.length = lastFragments.length;
783+
}
784+
785+
// Synthesize missing type parameters.
786+
if (lastFragments.length > fragments.length) {
787+
for (var i = fragments.length; i < lastFragments.length; i++) {
788+
add(
789+
TypeParameterFragmentImpl(name: lastFragments[i].name)
790+
..isSynthetic = true,
791+
);
792+
}
793+
}
794+
795+
for (var i = 0; i < lastFragments.length; i++) {
796+
lastFragments[i].addFragment(fragments[i]);
797+
}
798+
}
799+
769800
TopLevelVariableElementImpl? _topLevelVariableElement(
770801
FragmentImpl? fragment,
771802
) {

0 commit comments

Comments
 (0)