Skip to content

Commit d116d50

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Add reference to FieldElementImpl2, write it.
Change-Id: Ia5f4c01aa46571c0a835f7e6408cd1af17fd75e0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432781 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent d150bcb commit d116d50

File tree

7 files changed

+112
-45
lines changed

7 files changed

+112
-45
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 = 470;
113+
static const int DATA_VERSION = 471;
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: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2847,15 +2847,15 @@ class FieldElementImpl2 extends PropertyInducingElementImpl2
28472847
FragmentedElementMixin<FieldFragmentImpl>,
28482848
_HasSinceSdkVersionMixin
28492849
implements FieldElement2OrMember {
2850+
@override
2851+
final Reference reference;
2852+
28502853
@override
28512854
final FieldFragmentImpl firstFragment;
28522855

2853-
FieldElementImpl2(this.firstFragment) {
2854-
FieldFragmentImpl? fragment = firstFragment;
2855-
while (fragment != null) {
2856-
fragment.element = this;
2857-
fragment = fragment.nextFragment;
2858-
}
2856+
FieldElementImpl2({required this.reference, required this.firstFragment}) {
2857+
reference.element2 = this;
2858+
firstFragment.element = this;
28592859
}
28602860

28612861
@override
@@ -3054,8 +3054,8 @@ class FieldFragmentImpl extends PropertyInducingElementImpl
30543054
/// annotations, but also inferred types.
30553055
bool hasEnclosingTypeParameterReference = true;
30563056

3057-
/// The element corresponding to this fragment.
3058-
FieldElementImpl2? _element;
3057+
@override
3058+
late final FieldElementImpl2 element;
30593059

30603060
/// Initialize a newly created synthetic field element to have the given
30613061
/// [name] at the given [offset].
@@ -3064,24 +3064,6 @@ class FieldFragmentImpl extends PropertyInducingElementImpl
30643064
@override
30653065
FieldFragmentImpl get declaration => this;
30663066

3067-
@override
3068-
FieldElementImpl2 get element {
3069-
if (_element != null) {
3070-
return _element!;
3071-
}
3072-
FieldFragment firstFragment = this;
3073-
var previousFragment = firstFragment.previousFragment;
3074-
while (previousFragment != null) {
3075-
firstFragment = previousFragment;
3076-
previousFragment = firstFragment.previousFragment;
3077-
}
3078-
// As a side-effect of creating the element, all of the fragments in the
3079-
// chain will have their `_element` set to the newly created element.
3080-
return FieldElementImpl2(firstFragment as FieldFragmentImpl);
3081-
}
3082-
3083-
set element(FieldElementImpl2 element) => _element = element;
3084-
30853067
/// Whether the field is abstract.
30863068
///
30873069
/// Executable fields are abstract if they are declared with the `abstract`

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

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,16 @@ class InheritanceManager3 {
12061206
resultField.type = executable.parameters[0].type;
12071207
result.variable2 = resultField;
12081208

1209+
var elementName = executable.asElement2.name3!;
1210+
var elementReference = class_.element.reference!
1211+
.getChild('@field')
1212+
.getChild(elementName);
1213+
assert(elementReference.element2 == null);
1214+
FieldElementImpl2(
1215+
reference: elementReference,
1216+
firstFragment: resultField,
1217+
);
1218+
12091219
return result;
12101220
}
12111221

@@ -1279,16 +1289,36 @@ class InheritanceManager3 {
12791289
return result;
12801290
} else {
12811291
var firstAccessor = first as PropertyAccessorElementOrMember;
1282-
var fragmentName = first.asElement2.firstFragment.name2;
1292+
var fragmentName = first.asElement2.firstFragment.name2!;
12831293
var field = FieldFragmentImpl(name2: fragmentName, nameOffset: -1);
12841294

12851295
PropertyAccessorFragmentImpl result;
12861296
if (firstAccessor.isGetter) {
1287-
field.getter =
1288-
result = GetterFragmentImpl(name2: fragmentName, nameOffset: -1);
1297+
var fragmentReference = targetClass.reference!
1298+
.getChild('@getter')
1299+
.getChild(fragmentName);
1300+
if (fragmentReference.element case GetterFragmentImpl result) {
1301+
return result;
1302+
}
1303+
1304+
var fragment = GetterFragmentImpl(name2: fragmentName, nameOffset: -1);
1305+
fragment.reference = fragmentReference;
1306+
fragmentReference.element = fragment;
1307+
field.getter = fragment;
1308+
result = fragment;
12891309
} else {
1290-
field.setter =
1291-
result = SetterFragmentImpl(name2: fragmentName, nameOffset: -1);
1310+
var fragmentReference = targetClass.reference!
1311+
.getChild('@setter')
1312+
.getChild(fragmentName);
1313+
if (fragmentReference.element case SetterFragmentImpl result) {
1314+
return result;
1315+
}
1316+
1317+
var fragment = SetterFragmentImpl(name2: fragmentName, nameOffset: -1);
1318+
fragment.reference = fragmentReference;
1319+
fragmentReference.element = fragment;
1320+
field.setter = fragment;
1321+
result = fragment;
12921322
}
12931323
result.enclosingElement3 = targetClass;
12941324
result.returnType = resultType.returnType;
@@ -1306,6 +1336,13 @@ class InheritanceManager3 {
13061336
}
13071337
result.variable2 = field;
13081338

1339+
var elementName = first.asElement2.name3!;
1340+
var elementReference = targetClass.element.reference!
1341+
.getChild('@field')
1342+
.getChild(elementName);
1343+
assert(elementReference.element2 == null);
1344+
FieldElementImpl2(reference: elementReference, firstFragment: field);
1345+
13091346
return result;
13101347
}
13111348
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,7 @@ class LibraryReader {
10891089
var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
10901090

10911091
var reference = _readReference();
1092+
var reference2 = _readReference();
10921093
var getterReference = _readOptionalReference();
10931094
var setterReference = _readOptionalReference();
10941095
var fragmentName = _readFragmentName();
@@ -1125,6 +1126,8 @@ class LibraryReader {
11251126
}
11261127
}
11271128

1129+
FieldElementImpl2(reference: reference2, firstFragment: element);
1130+
11281131
return element;
11291132
}
11301133

@@ -1515,8 +1518,7 @@ class LibraryReader {
15151518

15161519
// Read the property references.
15171520
var propertyFragmentReference = _readReference();
1518-
// TODO(scheglov): should be required?
1519-
var propertyElementReference = _readOptionalReference();
1521+
var propertyElementReference = _readReference();
15201522

15211523
bool canUseExisting(PropertyInducingElementImpl property) {
15221524
return property.isSynthetic ||
@@ -1542,8 +1544,6 @@ class LibraryReader {
15421544
propertyFragmentReference.element ??= propertyFragment;
15431545
propertyFragments.add(variableFragment);
15441546

1545-
// TODO(scheglov): should be required?
1546-
propertyElementReference!;
15471547
var variableElement = TopLevelVariableElementImpl2(
15481548
propertyElementReference,
15491549
variableFragment,
@@ -1555,7 +1555,7 @@ class LibraryReader {
15551555
if (existing is FieldFragmentImpl && canUseExisting(existing)) {
15561556
propertyFragment = existing;
15571557
} else {
1558-
propertyFragment =
1558+
var fieldFragment =
15591559
FieldFragmentImpl(name2: accessor.name2, nameOffset: -1)
15601560
..enclosingElement3 = enclosingElement
15611561
..reference = propertyFragmentReference
@@ -1564,8 +1564,14 @@ class LibraryReader {
15641564
..isPromotable = isPromotable
15651565
..hasEnclosingTypeParameterReference =
15661566
accessor.hasEnclosingTypeParameterReference;
1567+
propertyFragment = fieldFragment;
15671568
propertyFragmentReference.element ??= propertyFragment;
15681569
propertyFragments.add(propertyFragment);
1570+
1571+
FieldElementImpl2(
1572+
reference: propertyElementReference,
1573+
firstFragment: fieldFragment,
1574+
);
15691575
}
15701576
}
15711577

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import 'package:analyzer/src/summary2/element_flags.dart';
2424
import 'package:analyzer/src/summary2/export.dart';
2525
import 'package:analyzer/src/summary2/reference.dart';
2626
import 'package:analyzer/src/utilities/extensions/element.dart';
27-
import 'package:analyzer/src/utilities/extensions/object.dart';
2827

2928
class BundleWriter {
3029
late final _BundleWriterReferences _references;
@@ -321,6 +320,7 @@ class BundleWriter {
321320
void _writeFieldElement(FieldFragmentImpl element) {
322321
_sink.writeUInt30(_resolutionSink.offset);
323322
_writeReference(element);
323+
_writeReference2(element.element.reference);
324324
_writeOptionalReference(element.getter?.reference);
325325
_writeOptionalReference(element.setter?.reference);
326326
_writeFragmentName(element);
@@ -541,12 +541,12 @@ class BundleWriter {
541541
if (!fragment.isAugmentation) {
542542
var variableFragment = fragment.variable2!;
543543
_writeReference(variableFragment);
544-
_writeOptionalReference(
545-
variableFragment
546-
.ifTypeOrNull<TopLevelVariableFragmentImpl>()
547-
?.element
548-
.reference,
549-
);
544+
switch (variableFragment) {
545+
case FieldFragmentImpl fieldFragment:
546+
_writeReference2(fieldFragment.element.reference);
547+
case TopLevelVariableFragmentImpl topFragment:
548+
_writeReference2(topFragment.element.reference);
549+
}
550550
switch (variableFragment) {
551551
case FieldFragmentImpl fieldFragment:
552552
var field = fieldFragment.element;
@@ -713,7 +713,6 @@ class ResolutionSink extends _SummaryDataWriter {
713713
);
714714
_writeTypeList(typeArguments);
715715
// TODO(scheglov): give reference to each element below
716-
case FieldElementImpl2():
717716
case FormalParameterElementImpl():
718717
case GetterElementImpl():
719718
case SetterElementImpl():

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,13 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
453453
SimpleIdentifierImpl(token: StringToken(TokenType.STRING, name, -1)),
454454
);
455455
valuesNames.add(name);
456+
457+
FieldElementImpl2(
458+
reference: elementBuilder.element.reference
459+
.getChild('@field')
460+
.addChild(refName),
461+
firstFragment: field,
462+
);
456463
}
457464

458465
// Build the 'values' field.
@@ -508,6 +515,13 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
508515

509516
holder.addNonSyntheticField('values', valuesField);
510517

518+
FieldElementImpl2(
519+
reference: elementBuilder.element.reference
520+
.getChild('@field')
521+
.addChild('values'),
522+
firstFragment: valuesField,
523+
);
524+
511525
_libraryBuilder.implicitEnumNodes[fragment] = ImplicitEnumNodes(
512526
element: fragment,
513527
valuesTypeNode: valuesTypeNode,
@@ -761,6 +775,13 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
761775

762776
_linker.elementNodes[fragment] = variable;
763777
variable.declaredFragment = fragment;
778+
779+
var containerBuilder = _enclosingContext.instanceElementBuilder!;
780+
var containerElement = containerBuilder.element;
781+
var containerRef = containerElement.reference!.getChild('@field');
782+
var elementReference = containerRef.addChild(refName);
783+
784+
FieldElementImpl2(reference: elementReference, firstFragment: fragment);
764785
}
765786
_buildType(node.fields.type);
766787
}
@@ -1767,6 +1788,16 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
17671788
..isStatic = accessorElement.isStatic
17681789
..isSynthetic = true;
17691790
_enclosingContext.addFieldSynthetic(reference, field);
1791+
1792+
FieldElementImpl2(
1793+
reference: _enclosingContext
1794+
.instanceElementBuilder!
1795+
.element
1796+
.reference!
1797+
.getChild('@field')
1798+
.getChild(name),
1799+
firstFragment: field,
1800+
);
17701801
}
17711802
}
17721803

@@ -1811,6 +1842,13 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
18111842
_linker.elementNodes[fieldFragment] = representation;
18121843
_enclosingContext.addNonSyntheticField(fieldName, fieldFragment);
18131844

1845+
FieldElementImpl2(
1846+
reference: extensionFragment.element.reference
1847+
.getChild('@field')
1848+
.addChild(fieldName),
1849+
firstFragment: fieldFragment,
1850+
);
1851+
18141852
var nameOffset2 = fieldNameToken.offset.nullIfNegative;
18151853

18161854
var formalParameterElement =

pkg/analyzer/test/generated/elements_types_mixin.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,11 @@ mixin ElementsTypesMixin {
271271
field.type = representationType;
272272
fragment.fields = [field];
273273

274+
FieldElementImpl2(
275+
reference: Reference.root(),
276+
firstFragment: field,
277+
);
278+
274279
fragment.typeErasure = representationType;
275280

276281
return ExtensionTypeElementImpl2(Reference.root(), fragment);

0 commit comments

Comments
 (0)