Skip to content

Commit 84f22e8

Browse files
committed
Elements. Store FormalParameterElementImpl.type, do not get from the fragment.
Change-Id: I9149d7512e306b84fa03b2d0497dcbf3a7780709 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439144 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 1a88edc commit 84f22e8

File tree

13 files changed

+61
-55
lines changed

13 files changed

+61
-55
lines changed

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

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,8 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
498498
);
499499
formalParameterElements.add(formalParameterElement);
500500

501-
formalParameterFragment.type = superFormalParameter.type;
502501
formalParameterElement.type = superFormalParameter.type;
502+
formalParameterFragment.type = superFormalParameter.type;
503503

504504
superInvocationArguments.add(
505505
SimpleIdentifierImpl(
@@ -2991,6 +2991,9 @@ class FormalParameterElementImpl extends PromotableElementImpl
29912991

29922992
final FormalParameterFragmentImpl wrappedElement;
29932993

2994+
@override
2995+
late TypeImpl type;
2996+
29942997
FormalParameterElementImpl(this.wrappedElement) {
29952998
FormalParameterFragmentImpl? fragment = wrappedElement;
29962999
while (fragment != null) {
@@ -3007,10 +3010,9 @@ class FormalParameterElementImpl extends PromotableElementImpl
30073010
) {
30083011
var fragment = FormalParameterFragmentImpl.synthetic(
30093012
name,
3010-
type,
30113013
parameterKind,
30123014
);
3013-
return FormalParameterElementImpl(fragment);
3015+
return FormalParameterElementImpl(fragment)..type = type;
30143016
}
30153017

30163018
@override
@@ -3130,15 +3132,6 @@ class FormalParameterElementImpl extends PromotableElementImpl
31303132
return firstFragment.parameterKind;
31313133
}
31323134

3133-
@override
3134-
// TODO(augmentations): Implement the merge of formal parameters.
3135-
TypeImpl get type => wrappedElement.type;
3136-
3137-
@override
3138-
set type(TypeImpl value) {
3139-
wrappedElement.type = value;
3140-
}
3141-
31423135
@override
31433136
// TODO(augmentations): Implement the merge of formal parameters.
31443137
List<TypeParameterElement> get typeParameters =>
@@ -3251,7 +3244,6 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
32513244
/// Creates a synthetic parameter with [name2], [type] and [parameterKind].
32523245
factory FormalParameterFragmentImpl.synthetic(
32533246
String? name2,
3254-
TypeImpl type,
32553247
ParameterKind parameterKind,
32563248
) {
32573249
// TODO(dantup): This does not keep any reference to the non-synthetic
@@ -3263,7 +3255,6 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
32633255
nameOffset2: null,
32643256
parameterKind: parameterKind,
32653257
);
3266-
element.type = type;
32673258
element.isSynthetic = true;
32683259
return element;
32693260
}

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

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,14 @@ extension FormalParameterElementMixinExtension on FormalParameterElementMixin {
161161
ParameterKind? kind,
162162
bool? isCovariant,
163163
}) {
164-
var firstFragment = this.firstFragment as FormalParameterFragmentImpl;
165-
return FormalParameterElementImpl(
166-
firstFragment.copyWith(type: type, kind: kind, isCovariant: isCovariant),
164+
var element = FormalParameterElementImpl.synthetic(
165+
name,
166+
type ?? this.type,
167+
kind ?? parameterKind,
167168
);
169+
element.firstFragment.isExplicitlyCovariant =
170+
isCovariant ?? this.isCovariant;
171+
return element;
168172
}
169173
}
170174

@@ -179,21 +183,6 @@ extension LibraryExtension2 on LibraryElement? {
179183
this?.featureSet.isEnabled(Feature.wildcard_variables) ?? false;
180184
}
181185

182-
extension ParameterElementMixinExtension on FormalParameterFragmentImpl {
183-
/// Return [FormalParameterFragmentImpl] with the specified properties replaced.
184-
FormalParameterFragmentImpl copyWith({
185-
TypeImpl? type,
186-
ParameterKind? kind,
187-
bool? isCovariant,
188-
}) {
189-
return FormalParameterFragmentImpl.synthetic(
190-
name,
191-
type ?? this.type,
192-
kind ?? parameterKind,
193-
)..isExplicitlyCovariant = isCovariant ?? this.isCovariant;
194-
}
195-
}
196-
197186
extension RecordTypeExtension on RecordType {
198187
/// A regular expression used to match positional field names.
199188
static final RegExp _positionalName = RegExp(r'^\$[1-9]\d*$');

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,8 +1159,9 @@ class InheritanceManager3 {
11591159
field.type = resultFragment.returnType;
11601160
fieldElement.type = resultFragment.returnType;
11611161
} else {
1162-
field.type = resultFragment.parameters[0].type;
1163-
fieldElement.type = resultFragment.parameters[0].type;
1162+
var type = resultFragment.parameters[0].element.type;
1163+
field.type = type;
1164+
fieldElement.type = type;
11641165
}
11651166

11661167
return resultElement;

pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class FunctionExpressionResolver {
113113
inferredType = _typeSystem.objectQuestion;
114114
}
115115
if (inferredType is! DynamicType) {
116+
p.type = inferredType;
116117
p.firstFragment.type = inferredType;
117118
}
118119
}

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
662662
node.parameters?.accept(this);
663663
} else {
664664
// Only for recovery, this should not happen in valid code.
665+
fragment.element.type = node.type?.type ?? _dynamicType;
665666
fragment.type = node.type?.type ?? _dynamicType;
666667
_withElementWalker(null, () {
667668
node.parameters?.accept(this);
@@ -879,14 +880,16 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
879880

880881
node.returnType?.accept(this);
881882
if (_elementWalker == null) {
882-
fragment.type = FunctionTypeImpl(
883+
var type = FunctionTypeImpl(
883884
typeParameters:
884885
fragment.typeParameters.map((f) => f.element).toList(),
885886
parameters:
886887
fragment.parameters.map((f) => f.asElement2).toList(),
887888
returnType: node.returnType?.type ?? _dynamicType,
888889
nullabilitySuffix: _getNullability(node.question != null),
889890
);
891+
fragment.element.type = type;
892+
fragment.type = type;
890893
}
891894
});
892895
},
@@ -1262,6 +1265,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
12621265

12631266
node.type?.accept(this);
12641267
if (_elementWalker == null) {
1268+
fragment.element.type = node.type?.type ?? _dynamicType;
12651269
fragment.type = node.type?.type ?? _dynamicType;
12661270
}
12671271

@@ -1319,6 +1323,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
13191323
node.parameters?.accept(this);
13201324
} else {
13211325
// Only for recovery, this should not happen in valid code.
1326+
element.element.type = node.type?.type ?? _dynamicType;
13221327
element.type = node.type?.type ?? _dynamicType;
13231328
_withElementWalker(null, () {
13241329
node.parameters?.accept(this);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ class AstBinaryReader {
435435
parameter.declaredFragment = fragment;
436436
}
437437
node.declaredFragment = fragment;
438+
fragment.element.type = nonDefaultElement.type;
438439
fragment.type = nonDefaultElement.type;
439440

440441
return node;
@@ -1223,6 +1224,7 @@ class AstBinaryReader {
12231224
nameOffset2: null,
12241225
parameterKind: node.kind,
12251226
);
1227+
fragment.element.type = actualType;
12261228
fragment.type = actualType;
12271229
node.declaredFragment = fragment;
12281230

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,10 @@ class LibraryReader {
746746
parameter.metadata = reader._readMetadata(unitElement: unitElement);
747747
_readTypeParameters2(unitElement, reader, parameter.typeParameters);
748748
_readFormalParameters2(unitElement, reader, parameter.parameters);
749-
parameter.type = reader.readRequiredType();
749+
var type = reader.readType() ?? InvalidTypeImpl.instance;
750+
parameter.element.type = type;
751+
// TODO(scheglov): make the `type` property optional
752+
parameter.type = type;
750753
parameter.constantInitializer = reader.readOptionalExpression();
751754
if (parameter is FieldFormalParameterFragmentImpl) {
752755
// TODO(scheglov): use element
@@ -1800,14 +1803,18 @@ class ResolutionReader {
18001803
name: name,
18011804
nameOffset2: null,
18021805
parameterKind: kind,
1803-
)..type = type;
1806+
);
1807+
element.element.type = type;
1808+
element.type = type;
18041809
} else {
18051810
element = FormalParameterFragmentImpl(
18061811
nameOffset: -1,
18071812
name: name,
18081813
nameOffset2: null,
18091814
parameterKind: kind,
1810-
)..type = type;
1815+
);
1816+
element.element.type = type;
1817+
element.type = type;
18111818
}
18121819
element.hasImplicitType = hasImplicitType;
18131820
element.typeParameters = typeParameters;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ class BundleWriter {
644644

645645
_writeTypeParameters(element.typeParameters, () {
646646
_writeList(element.parameters, _writeParameterElement);
647-
_resolutionSink.writeType(element.type);
647+
_resolutionSink.writeType(element.type2);
648648
_resolutionSink._writeOptionalNode(element.constantInitializer);
649649

650650
if (element is FieldFormalParameterFragmentImpl) {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ class InstanceMemberInferrer {
225225
// in the direct superinterfaces.
226226
if (overriddenGetters.isNotEmpty && overriddenSetters.isEmpty) {
227227
var valueType = combinedGetterType();
228+
parameter.element.type = valueType;
228229
parameter.type = valueType;
229230
var fieldElement = accessor.element.variable3 as FieldElementImpl;
230231
if (fieldElement.getter2 == null) {
@@ -244,6 +245,7 @@ class InstanceMemberInferrer {
244245
// combined member signature of said setter in the direct superinterfaces.
245246
if (overriddenSetters.isNotEmpty) {
246247
var valueType = combinedSetterType();
248+
parameter.element.type = valueType;
247249
parameter.type = valueType;
248250
var fieldElement = accessor.element.variable3 as FieldElementImpl;
249251
fieldElement.type = valueType;
@@ -396,13 +398,16 @@ class InstanceMemberInferrer {
396398
if (parameter is FieldFormalParameterFragmentImpl) {
397399
var field = parameter.field;
398400
if (field != null) {
401+
parameter.element.type = field.element.type;
399402
parameter.type = field.element.type;
400403
}
401404
} else if (parameter is SuperFormalParameterFragmentImpl) {
402405
var superParameter = parameter.element.superConstructorParameter2;
403406
if (superParameter != null) {
407+
parameter.element.type = superParameter.type;
404408
parameter.type = superParameter.type;
405409
} else {
410+
parameter.element.type = DynamicTypeImpl.instance;
406411
parameter.type = DynamicTypeImpl.instance;
407412
}
408413
}
@@ -542,6 +547,7 @@ class InstanceMemberInferrer {
542547
baseParameter,
543548
) {
544549
var type = substitution.substituteType(baseParameter.type);
550+
parameter.element.type = type;
545551
parameter.type = type;
546552
});
547553
// Update arguments of `SuperConstructorInvocation` to have the types
@@ -593,11 +599,14 @@ class InstanceMemberInferrer {
593599
combinedSignatureType.parameters,
594600
);
595601
if (matchingParameter != null) {
602+
parameter.element.type = matchingParameter.type;
596603
parameter.type = matchingParameter.type;
597604
} else {
605+
parameter.element.type = DynamicTypeImpl.instance;
598606
parameter.type = DynamicTypeImpl.instance;
599607
}
600608
} else {
609+
parameter.element.type = DynamicTypeImpl.instance;
601610
parameter.type = DynamicTypeImpl.instance;
602611
}
603612
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ class TypesBuilder {
256256
_mixinDeclaration(node);
257257
} else if (node is SimpleFormalParameterImpl) {
258258
var fragment = node.declaredFragment!;
259+
fragment.element.type = node.type?.type ?? _dynamicType;
259260
fragment.type = node.type?.type ?? _dynamicType;
260261
} else if (node is SuperFormalParameterImpl) {
261262
_superFormalParameter(node);
@@ -338,8 +339,10 @@ class TypesBuilder {
338339
parameterList,
339340
_nullability(node, node.question != null),
340341
);
342+
fragment.element.type = type;
341343
fragment.type = type;
342344
} else {
345+
fragment.element.type = node.type?.type ?? _dynamicType;
343346
fragment.type = node.type?.type ?? _dynamicType;
344347
}
345348
}
@@ -367,6 +370,7 @@ class TypesBuilder {
367370
_nullability(node, node.question != null),
368371
);
369372
var fragment = node.declaredFragment!;
373+
fragment.element.type = type;
370374
fragment.type = type;
371375
}
372376

@@ -422,8 +426,10 @@ class TypesBuilder {
422426
parameterList,
423427
_nullability(node, node.question != null),
424428
);
429+
fragment.element.type = type;
425430
fragment.type = type;
426431
} else {
432+
fragment.element.type = node.type?.type ?? _dynamicType;
427433
fragment.type = node.type?.type ?? _dynamicType;
428434
}
429435
}

0 commit comments

Comments
 (0)