Skip to content

Commit bf8aca0

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Store FieldElementImpl.type, not get it from the fragment.
I will pull shared portions of TopLevelVariableElementImpl and FieldElementImpl into PropertyInducingElementImpl in a separate CL. Change-Id: I5ea2cedc21196c9688bb1e25fb48d953611fc986 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439040 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 80e1664 commit bf8aca0

File tree

12 files changed

+102
-20
lines changed

12 files changed

+102
-20
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ testFineAfterLibraryAnalyzerHook;
110110
// TODO(scheglov): Clean up the list of implicitly analyzed files.
111111
class AnalysisDriver {
112112
/// The version of data format, should be incremented on every format change.
113-
static const int DATA_VERSION = 491;
113+
static const int DATA_VERSION = 492;
114114

115115
/// The number of exception contexts allowed to write. Once this field is
116116
/// zero, we stop writing any new exception contexts in this process.

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2605,14 +2605,17 @@ class FieldElementImpl extends PropertyInducingElementImpl
26052605
with
26062606
FragmentedAnnotatableElementMixin<FieldFragmentImpl>,
26072607
FragmentedElementMixin<FieldFragmentImpl>,
2608-
_HasSinceSdkVersionMixin
2608+
_HasSinceSdkVersionMixin,
2609+
DeferredResolutionReadingMixin
26092610
implements FieldElement2OrMember {
26102611
@override
26112612
final Reference reference;
26122613

26132614
@override
26142615
final FieldFragmentImpl firstFragment;
26152616

2617+
TypeImpl? _type;
2618+
26162619
FieldElementImpl({required this.reference, required this.firstFragment}) {
26172620
reference.element = this;
26182621
firstFragment.element = this;
@@ -2696,7 +2699,41 @@ class FieldElementImpl extends PropertyInducingElementImpl
26962699
String? get name3 => firstFragment.name2;
26972700

26982701
@override
2699-
TypeImpl get type => firstFragment.type;
2702+
TypeImpl get type {
2703+
_ensureReadResolution();
2704+
if (_type != null) return _type!;
2705+
2706+
// We must be linking, and the type has not been set yet.
2707+
var type = firstFragment.typeInference?.perform();
2708+
type ??= InvalidTypeImpl.instance;
2709+
_type = type;
2710+
firstFragment._type = type;
2711+
firstFragment.shouldUseTypeForInitializerInference = false;
2712+
2713+
// TODO(scheglov): We repeat this code.
2714+
var element = this;
2715+
if (element.getter2 case var getterElement?) {
2716+
getterElement.returnType = type;
2717+
getterElement.firstFragment.returnType = type;
2718+
}
2719+
if (element.setter2 case var setterElement?) {
2720+
if (setterElement.isSynthetic) {
2721+
setterElement.returnType = VoidTypeImpl.instance;
2722+
setterElement.firstFragment.returnType = VoidTypeImpl.instance;
2723+
(setterElement.formalParameters.single as FormalParameterElementImpl)
2724+
.type = type;
2725+
(setterElement.formalParameters.single as FormalParameterElementImpl)
2726+
.firstFragment
2727+
.type = type;
2728+
}
2729+
}
2730+
2731+
return _type!;
2732+
}
2733+
2734+
set type(TypeImpl value) {
2735+
_type = value;
2736+
}
27002737

27012738
@override
27022739
T? accept<T>(ElementVisitor2<T> visitor) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,8 +1157,10 @@ class InheritanceManager3 {
11571157

11581158
if (firstElement is GetterElement) {
11591159
field.type = resultFragment.returnType;
1160+
fieldElement.type = resultFragment.returnType;
11601161
} else {
11611162
field.type = resultFragment.parameters[0].type;
1163+
fieldElement.type = resultFragment.parameters[0].type;
11621164
}
11631165

11641166
return resultElement;

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,10 +695,21 @@ class LibraryReader {
695695
var reference = _readReference();
696696
var fragments = _readFragmentsById<FieldFragmentImpl>();
697697
// TODO(scheglov): link fragments.
698-
return FieldElementImpl(
698+
var element = FieldElementImpl(
699699
reference: reference,
700700
firstFragment: fragments.first,
701701
);
702+
703+
element.deferReadResolution(
704+
_createDeferredReadResolutionCallback((reader) {
705+
var enclosingElement =
706+
element.enclosingElement as InstanceElementImpl;
707+
reader._addTypeParameters2(enclosingElement.typeParameters2);
708+
element.type = reader.readRequiredType();
709+
}),
710+
);
711+
712+
return element;
702713
});
703714
}
704715

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,9 @@ class BundleWriter {
413413
_sink.writeList(elements, (element) {
414414
_writeReference(element.reference);
415415
_sink.writeList(element.fragments, _writeFragmentId);
416+
_writeElementResolution(() {
417+
_resolutionSink.writeType(element.type);
418+
});
416419
});
417420
}
418421

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,14 @@ class _Node extends graph.Node<_Node> {
153153
void _evaluateWithType(TypeImpl type) {
154154
var typeSystem = element.library.typeSystem;
155155

156-
var representation = element.firstFragment.representation;
157-
representation.type = type;
156+
var representationFragment = element.firstFragment.representation;
157+
var representationElement = representationFragment.element;
158+
159+
representationFragment.type = type;
160+
representationElement.type = type;
158161
// TODO(scheglov): we repeat similar code in many places
159-
representation.element.getter2!.returnType = type;
160-
representation.element.getter2!.firstFragment.returnType = type;
162+
representationElement.getter2!.returnType = type;
163+
representationElement.getter2!.firstFragment.returnType = type;
161164

162165
element.firstFragment.typeErasure = type.extensionTypeErasure;
163166
element.firstFragment.interfaces =

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,9 @@ class InstanceMemberInferrer {
180180
accessor.returnType = returnType;
181181
accessor.element.returnType = returnType;
182182
// TODO(scheglov): store type in FieldElementImpl itself
183-
(accessor.element.variable3 as FieldElementImpl).firstFragment.type =
184-
returnType;
183+
var fieldElement = accessor.element.variable3 as FieldElementImpl;
184+
fieldElement.type = returnType;
185+
fieldElement.firstFragment.type = returnType;
185186
return;
186187
}
187188

@@ -194,8 +195,9 @@ class InstanceMemberInferrer {
194195
accessor.returnType = returnType;
195196
accessor.element.returnType = returnType;
196197
// TODO(scheglov): store type in FieldElementImpl itself
197-
(accessor.element.variable3 as FieldElementImpl).firstFragment.type =
198-
returnType;
198+
var fieldElement = accessor.element.variable3 as FieldElementImpl;
199+
fieldElement.type = returnType;
200+
fieldElement.firstFragment.type = returnType;
199201
return;
200202
}
201203

@@ -222,7 +224,10 @@ class InstanceMemberInferrer {
222224
// to be the return type of the combined member signature of said getter
223225
// in the direct superinterfaces.
224226
if (overriddenGetters.isNotEmpty && overriddenSetters.isEmpty) {
225-
parameter.type = combinedGetterType();
227+
var valueType = combinedGetterType();
228+
parameter.type = valueType;
229+
var fieldElement = accessor.element.variable3 as FieldElementImpl;
230+
fieldElement.type = valueType;
226231
return;
227232
}
228233

@@ -235,7 +240,10 @@ class InstanceMemberInferrer {
235240
// setter and a getter is inferred to be the parameter type of the
236241
// combined member signature of said setter in the direct superinterfaces.
237242
if (overriddenSetters.isNotEmpty) {
238-
parameter.type = combinedSetterType();
243+
var valueType = combinedSetterType();
244+
parameter.type = valueType;
245+
var fieldElement = accessor.element.variable3 as FieldElementImpl;
246+
fieldElement.type = valueType;
239247
return;
240248
}
241249

@@ -385,7 +393,7 @@ class InstanceMemberInferrer {
385393
if (parameter is FieldFormalParameterFragmentImpl) {
386394
var field = parameter.field;
387395
if (field != null) {
388-
parameter.type = field.type;
396+
parameter.type = field.element.type;
389397
}
390398
} else if (parameter is SuperFormalParameterFragmentImpl) {
391399
var superParameter = parameter.element.superConstructorParameter2;
@@ -774,6 +782,7 @@ class InstanceMemberInferrer {
774782

775783
static void _setFieldType(FieldFragmentImpl field, TypeImpl type) {
776784
field.type = type;
785+
field.element.type = type;
777786
// TODO(scheglov): We repeat this code.
778787
field.element.getter2?.returnType = type;
779788
field.element.getter2?.firstFragment.returnType = type;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ class LibraryBuilder {
212212
);
213213
enum_.valuesTypeNode.type = valuesType;
214214
enum_.valuesElement.type = valuesType;
215+
enum_.valuesElement.element.type = valuesType;
215216
// TODO(scheglov): We repeat this code.
216217
enum_.valuesElement.element.getter2!.returnType = valuesType;
217218
enum_.valuesElement.element.getter2!.firstFragment.returnType =

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,15 +229,23 @@ class TypesBuilder {
229229
switch (element) {
230230
case GetterElementImpl():
231231
element.returnType = returnType;
232+
(element.variable3 as FieldElementImpl).type = returnType;
232233
element.variable3!.firstFragment.type = returnType;
233234
case SetterElementImpl():
234235
element.returnType = returnType;
235-
var fragmentValue =
236+
var valueElement =
236237
element.formalParameters.singleOrNull
237238
as FormalParameterElementImpl?;
238239
var valueNode = node.parameters?.parameters.firstOrNull;
239240
var valueNodeType = valueNode?.declaredFragment!.type;
240-
fragmentValue?.type = valueNodeType ?? InvalidTypeImpl.instance;
241+
var valueType = valueNodeType ?? InvalidTypeImpl.instance;
242+
valueElement?.type = valueType;
243+
244+
var variableElement = element.variable3 as FieldElementImpl;
245+
if (variableElement.isSynthetic && variableElement.getter2 == null) {
246+
variableElement.type = valueType;
247+
variableElement.firstFragment.type = valueType;
248+
}
241249
case MethodElementImpl():
242250
element.returnType = returnType;
243251
}
@@ -257,6 +265,9 @@ class TypesBuilder {
257265
var variableFragment = variable.declaredFragment!;
258266
var variableElement = variableFragment.element;
259267
variableFragment.type = type;
268+
if (variableElement is FieldElementImpl) {
269+
variableElement.type = type;
270+
}
260271
if (variableElement is TopLevelVariableElementImpl) {
261272
variableElement.type = type;
262273
}

pkg/analyzer/test/generated/elements_types_mixin.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,15 @@ mixin ElementsTypesMixin {
271271
name2: representationName,
272272
nameOffset: -1,
273273
);
274-
FieldElementImpl(reference: Reference.root(), firstFragment: fieldFragment);
275274
fieldFragment.type = representationType;
276275
fragment.fields = [fieldFragment];
277276

277+
var fieldElement = FieldElementImpl(
278+
reference: Reference.root(),
279+
firstFragment: fieldFragment,
280+
);
281+
fieldElement.type = representationType;
282+
278283
fragment.typeErasure = representationType;
279284

280285
return ExtensionTypeElementImpl(Reference.root(), fragment);

0 commit comments

Comments
 (0)