Skip to content

Commit 29698c7

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Stop implementing VariableElementOrMember and ParameterElementMixin by members.
The test changes are intentional, because `typeParameters2` in `FormalParameterElementImpl` now returns elements. Change-Id: Idd4696f6b69d4f4d84f7f5678d1476044512dfaf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/437700 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 1197f56 commit 29698c7

File tree

8 files changed

+139
-65
lines changed

8 files changed

+139
-65
lines changed

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,20 @@ class ElementDisplayStringBuilder {
209209
}
210210
}
211211

212+
void writeFormalParameter2(FormalParameterElementMixin element) {
213+
if (element.isRequiredPositional) {
214+
_writeWithoutDelimiters2(element, forElement: true);
215+
} else if (element.isOptionalPositional) {
216+
_write('[');
217+
_writeWithoutDelimiters2(element, forElement: true);
218+
_write(']');
219+
} else if (element.isNamed) {
220+
_write('{');
221+
_writeWithoutDelimiters2(element, forElement: true);
222+
_write('}');
223+
}
224+
}
225+
212226
void writeFunctionType(FunctionTypeImpl type) {
213227
if (_maybeWriteTypeAlias(type)) {
214228
return;
@@ -219,10 +233,7 @@ class ElementDisplayStringBuilder {
219233
_writeType(type.returnType);
220234
_write(' Function');
221235
_writeTypeParameters2(type.typeParameters);
222-
_writeFormalParameters(
223-
type.parameters.map((e) => e.asElement).toList(),
224-
forElement: false,
225-
);
236+
_writeFormalParameters2(type.parameters, forElement: false);
226237
_writeNullability(type.nullabilitySuffix);
227238
}
228239

@@ -425,6 +436,12 @@ class ElementDisplayStringBuilder {
425436
_write(element.displayName);
426437
}
427438

439+
void writeVariableElement2(VariableElement2OrMember element) {
440+
_writeType(element.type);
441+
_write(' ');
442+
_write(element.displayName);
443+
}
444+
428445
void writeVoidType() {
429446
_write('void');
430447
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3111,7 +3111,8 @@ class FormalParameterElementImpl extends PromotableElementImpl
31113111

31123112
@override
31133113
// TODO(augmentations): Implement the merge of formal parameters.
3114-
List<TypeParameterElement> get typeParameters2 => const [];
3114+
List<TypeParameterElement> get typeParameters2 =>
3115+
firstFragment.typeParameters.map((fragment) => fragment.element).toList();
31153116

31163117
@override
31173118
TypeImpl get typeShared => type;

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

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -926,9 +926,8 @@ class MethodMember extends ExecutableMember implements MethodElement2OrMember {
926926

927927
/// A parameter element defined in a parameterized type where the values of the
928928
/// type parameters are known.
929-
class ParameterMember extends VariableMember
930-
with ParameterElementMixin, FormalParameterElementMixin {
931-
@override
929+
class ParameterMember extends VariableMember with FormalParameterElementMixin {
930+
// TODO(scheglov): replace with TypeParameterElementImpl(s)
932931
final List<TypeParameterFragmentImpl> typeParameters;
933932

934933
factory ParameterMember({
@@ -1012,6 +1011,30 @@ class ParameterMember extends VariableMember
10121011
@override
10131012
bool get isInitializingFormal => declaration.isInitializingFormal;
10141013

1014+
@override
1015+
bool get isNamed => baseElement.isNamed;
1016+
1017+
@override
1018+
bool get isOptional => baseElement.isOptional;
1019+
1020+
@override
1021+
bool get isOptionalNamed => baseElement.isOptionalNamed;
1022+
1023+
@override
1024+
bool get isOptionalPositional => baseElement.isOptionalPositional;
1025+
1026+
@override
1027+
bool get isPositional => baseElement.isPositional;
1028+
1029+
@override
1030+
bool get isRequired => baseElement.isRequired;
1031+
1032+
@override
1033+
bool get isRequiredNamed => baseElement.isRequiredNamed;
1034+
1035+
@override
1036+
bool get isRequiredPositional => baseElement.isRequiredPositional;
1037+
10151038
@override
10161039
bool get isSuperFormal => declaration.isSuperFormal;
10171040

@@ -1051,15 +1074,6 @@ class ParameterMember extends VariableMember
10511074
return declaration.parameterKind;
10521075
}
10531076

1054-
@override
1055-
List<ParameterElementMixin> get parameters {
1056-
var type = this.type;
1057-
if (type is FunctionTypeImpl) {
1058-
return type.parameters.map((element) => element.asElement).toList();
1059-
}
1060-
return const <ParameterElementMixin>[];
1061-
}
1062-
10631077
@override
10641078
Source? get source => _declaration.source;
10651079

@@ -1083,7 +1097,7 @@ class ParameterMember extends VariableMember
10831097

10841098
@override
10851099
void appendTo(ElementDisplayStringBuilder builder) {
1086-
builder.writeFormalParameter(this);
1100+
builder.writeFormalParameter2(this);
10871101
}
10881102

10891103
@override
@@ -1121,32 +1135,6 @@ class ParameterMember extends VariableMember
11211135
_element2.visitChildren2(visitor);
11221136
}
11231137

1124-
static ParameterElementMixin from(
1125-
ParameterElementMixin element,
1126-
MapSubstitution substitution,
1127-
) {
1128-
FormalParameterFragmentImpl declaration;
1129-
var combined = substitution;
1130-
if (element is ParameterMember) {
1131-
var member = element;
1132-
declaration = member.declaration;
1133-
1134-
var map = <TypeParameterElement, DartType>{
1135-
for (var MapEntry(:key, :value) in member.substitution.map.entries)
1136-
key: substitution.substituteType(value),
1137-
};
1138-
combined = Substitution.fromMap2(map);
1139-
} else {
1140-
declaration = element as FormalParameterFragmentImpl;
1141-
}
1142-
1143-
if (combined.map.isEmpty) {
1144-
return element;
1145-
}
1146-
1147-
return ParameterMember(declaration: declaration, substitution: combined);
1148-
}
1149-
11501138
static FormalParameterElementMixin from2(
11511139
FormalParameterElementMixin element,
11521140
MapSubstitution substitution,
@@ -1398,7 +1386,7 @@ class SuperFormalParameterMember extends ParameterMember
13981386
/// A variable element defined in a parameterized type where the values of the
13991387
/// type parameters are known.
14001388
abstract class VariableMember extends Member
1401-
implements VariableElementOrMember {
1389+
implements VariableElement2OrMember {
14021390
TypeImpl? _type;
14031391

14041392
/// Initialize a newly created element to represent a variable, based on the
@@ -1437,7 +1425,7 @@ abstract class VariableMember extends Member
14371425

14381426
@override
14391427
void appendTo(ElementDisplayStringBuilder builder) {
1440-
builder.writeVariableElement(this);
1428+
builder.writeVariableElement2(this);
14411429
}
14421430
}
14431431

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

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,10 @@ class ResolutionSink extends _SummaryDataWriter {
991991
}
992992
}
993993

994+
void _writeElementName(Element element) {
995+
_writeOptionalStringReference(element.name3);
996+
}
997+
994998
void _writeFormalParameters(
995999
List<ParameterElementMixin> parameters, {
9961000
required bool withAnnotations,
@@ -1014,6 +1018,29 @@ class ResolutionSink extends _SummaryDataWriter {
10141018
}
10151019
}
10161020

1021+
void _writeFormalParameters2(
1022+
List<FormalParameterElementMixin> parameters, {
1023+
required bool withAnnotations,
1024+
}) {
1025+
writeUInt30(parameters.length);
1026+
for (var parameter in parameters) {
1027+
_writeFormalParameterKind2(parameter);
1028+
writeBool(parameter.hasImplicitType);
1029+
writeBool(parameter.isInitializingFormal);
1030+
_writeTypeParameters2(parameter.typeParameters2.cast(), () {
1031+
writeType(parameter.type);
1032+
_writeElementName(parameter);
1033+
_writeFormalParameters2(
1034+
parameter.formalParameters.cast(),
1035+
withAnnotations: withAnnotations,
1036+
);
1037+
}, withAnnotations: withAnnotations);
1038+
if (withAnnotations) {
1039+
_writeMetadata(parameter.metadata as MetadataImpl);
1040+
}
1041+
}
1042+
}
1043+
10171044
void _writeFragmentName(Fragment fragment) {
10181045
_writeOptionalStringReference(fragment.name2);
10191046
}
@@ -1025,10 +1052,7 @@ class ResolutionSink extends _SummaryDataWriter {
10251052

10261053
_writeTypeParameters(type.typeFormals, () {
10271054
writeType(type.returnType);
1028-
_writeFormalParameters(
1029-
type.parameters.map((e) => e.asElement).toList(),
1030-
withAnnotations: false,
1031-
);
1055+
_writeFormalParameters2(type.formalParameters, withAnnotations: false);
10321056
}, withAnnotations: false);
10331057
_writeNullabilitySuffix(type.nullabilitySuffix);
10341058
}
@@ -1115,6 +1139,26 @@ class ResolutionSink extends _SummaryDataWriter {
11151139
});
11161140
}
11171141

1142+
void _writeTypeParameters2(
1143+
List<TypeParameterElementImpl> typeParameters,
1144+
void Function() f, {
1145+
required bool withAnnotations,
1146+
}) {
1147+
localElements.withElements(typeParameters, () {
1148+
writeUInt30(typeParameters.length);
1149+
for (var typeParameter in typeParameters) {
1150+
_writeElementName(typeParameter);
1151+
}
1152+
for (var typeParameter in typeParameters) {
1153+
writeType(typeParameter.bound);
1154+
if (withAnnotations) {
1155+
_writeMetadata(typeParameter.metadata);
1156+
}
1157+
}
1158+
f();
1159+
});
1160+
}
1161+
11181162
static List<DartType> _enclosingClassTypeArguments(
11191163
Element declaration,
11201164
Map<TypeParameterElement, DartType> substitution,
@@ -1320,6 +1364,20 @@ class _SummaryDataWriter extends BufferedSink {
13201364
}
13211365
}
13221366

1367+
void _writeFormalParameterKind2(FormalParameterElementMixin p) {
1368+
if (p.isRequiredPositional) {
1369+
writeByte(Tag.ParameterKindRequiredPositional);
1370+
} else if (p.isOptionalPositional) {
1371+
writeByte(Tag.ParameterKindOptionalPositional);
1372+
} else if (p.isRequiredNamed) {
1373+
writeByte(Tag.ParameterKindRequiredNamed);
1374+
} else if (p.isOptionalNamed) {
1375+
writeByte(Tag.ParameterKindOptionalNamed);
1376+
} else {
1377+
throw StateError('Unexpected parameter kind: $p');
1378+
}
1379+
}
1380+
13231381
void _writeOptionalStringReference(String? value) {
13241382
if (value != null) {
13251383
writeBool(true);

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -274,16 +274,6 @@ extension FormalParameterElementImplExtension on FormalParameterElementImpl {
274274
}
275275
}
276276

277-
extension FormalParameterElementMixinExtension on FormalParameterElementMixin {
278-
ParameterElementMixin get asElement {
279-
return switch (this) {
280-
FormalParameterElementImpl(:var firstFragment) => firstFragment,
281-
ParameterMember member => member,
282-
_ => throw UnsupportedError('Unsupported type: $runtimeType'),
283-
};
284-
}
285-
}
286-
287277
extension GetterElementImplExtension on GetterElementImpl {
288278
PropertyAccessorFragmentImpl get asElement {
289279
return lastFragment;

pkg/analyzer/test/src/summary/elements/class_test.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -728,9 +728,14 @@ library
728728
requiredPositional final f
729729
firstFragment: #F4
730730
type: List<U> Function<T, U>(T)
731+
typeParameters
732+
#E0 T
733+
firstFragment: #F8
734+
#E1 U
735+
firstFragment: #F9
731736
formalParameters
732737
requiredPositional t
733-
firstFragment: #F8
738+
firstFragment: #F10
734739
type: T
735740
getters
736741
synthetic f
@@ -2917,9 +2922,13 @@ library
29172922
requiredPositional final a
29182923
firstFragment: #F6
29192924
type: int Function<T extends num>(T)?
2925+
typeParameters
2926+
#E0 T
2927+
firstFragment: #F7
2928+
bound: num
29202929
formalParameters
29212930
requiredPositional d
2922-
firstFragment: #F7
2931+
firstFragment: #F8
29232932
type: T
29242933
superConstructor: <testLibrary>::@class::A::@constructor::new
29252934
''');

pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,9 +559,14 @@ library
559559
requiredPositional a
560560
firstFragment: #F2
561561
type: T Function<T, U>(U)
562+
typeParameters
563+
#E0 T
564+
firstFragment: #F3
565+
#E1 U
566+
firstFragment: #F4
562567
formalParameters
563568
requiredPositional u
564-
firstFragment: #F3
569+
firstFragment: #F5
565570
type: U
566571
returnType: void
567572
''');

pkg/analyzer/test/src/summary/elements/offsets_test.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3037,9 +3037,12 @@ library
30373037
requiredPositional f
30383038
firstFragment: #F2
30393039
type: void Function<U>(int)
3040+
typeParameters
3041+
#E0 U
3042+
firstFragment: #F3
30403043
formalParameters
30413044
requiredPositional a
3042-
firstFragment: #F3
3045+
firstFragment: #F4
30433046
type: int
30443047
returnType: void
30453048
''');
@@ -3069,9 +3072,12 @@ library
30693072
requiredNamed f
30703073
firstFragment: #F2
30713074
type: void Function<U>(int)
3075+
typeParameters
3076+
#E0 U
3077+
firstFragment: #F3
30723078
formalParameters
30733079
requiredPositional a
3074-
firstFragment: #F3
3080+
firstFragment: #F4
30753081
type: int
30763082
returnType: void
30773083
''');

0 commit comments

Comments
 (0)