Skip to content

Commit 53339bc

Browse files
fshcheglovCommit Queue
authored andcommitted
Add handling for error cases in class_test regarding too few or too many TypeParameters in augments.
Also added handling for cases involving TypeParameter bounds, and fixed several errors leading their incorrect display. Change-Id: Ice908849daae2e115b34f50e55be1f2fca82cc96 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448443 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Paul Berry <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 75cf999 commit 53339bc

File tree

5 files changed

+343
-4
lines changed

5 files changed

+343
-4
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4609,6 +4609,11 @@ abstract class InstanceFragmentImpl extends FragmentImpl
46094609
_setters.add(fragment);
46104610
fragment.enclosingFragment = this;
46114611
}
4612+
4613+
void addTypeParameter(TypeParameterFragmentImpl typeParameter) {
4614+
_typeParameters.add(typeParameter);
4615+
typeParameter.enclosingFragment = this;
4616+
}
46124617
}
46134618

46144619
abstract class InterfaceElementImpl extends InstanceElementImpl
@@ -10127,7 +10132,8 @@ class TypeParameterFragmentImpl extends FragmentImpl
1012710132
MetadataImpl get metadata2 => metadata;
1012810133

1012910134
@override
10130-
int get offset => nameOffset ?? firstTokenOffset!;
10135+
int get offset =>
10136+
nameOffset ?? firstTokenOffset ?? enclosingFragment?.offset ?? -1;
1013110137

1013210138
void addFragment(TypeParameterFragmentImpl fragment) {
1013310139
fragment.element = element;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,26 @@ class ElementBuilder {
195195
lastFragment.addFragment(fragment);
196196

197197
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+
// Synthesize 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+
198218
for (var i = 0; i < lastTypeParameterFragments.length; i++) {
199219
lastTypeParameterFragments[i].addFragment(fragment.typeParameters[i]);
200220
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,9 @@ class ReferenceResolver extends ThrowingAstVisitor<void> {
569569
if (bound != null) {
570570
bound.accept(this);
571571
var fragment = node.declaredFragment!;
572-
fragment.element.bound = bound.type;
572+
if (fragment.previousFragment == null) {
573+
fragment.element.bound = bound.type;
574+
}
573575
nodesToBuildType.addDeclaration(node);
574576
}
575577
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,9 @@ class TypesBuilder {
396396

397397
void _typeParameter(TypeParameterImpl node) {
398398
var fragment = node.declaredFragment!;
399-
fragment.element.bound = node.bound?.type;
399+
if (fragment.previousFragment == null) {
400+
fragment.element.bound = node.bound?.type;
401+
}
400402
}
401403

402404
List<TypeParameterFragmentImpl> _typeParameters(TypeParameterListImpl? node) {

0 commit comments

Comments
 (0)