Skip to content

Commit 34ce33d

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Move extension type properties from fragment to element
The `typeErasure`, `primaryConstructor`, and `representation` fields are properties of the extension type as a whole, not of any individual declaration fragment. This commit moves `typeErasure` from `ExtensionTypeFragmentImpl` to `ExtensionTypeElementImpl` to better align the element model with this concept. As part of this refactoring, the `primaryConstructor` and `representation` getters on `ExtensionTypeFragment` are now deprecated. Clients should access these properties directly from the `ExtensionTypeElement`, which serves as the single source of truth. All internal call sites have been updated accordingly. Change-Id: I359572c6f7fe1d562fadfb60873a6e34aed0e5ee Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/445580 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 75d28ca commit 34ce33d

File tree

11 files changed

+44
-29
lines changed

11 files changed

+44
-29
lines changed

pkg/analyzer/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Deprecate `InterfaceFragment.interfaces`, use `InterfaceElement.interfaces` instead.
1313
* Deprecate `InterfaceFragment.mixins`, use `InterfaceElement.mixins` instead.
1414
* Deprecate `InterfaceFragment.supertype`, use `InterfaceElement.supertype` instead.
15+
* Deprecate `ExtensionTypeFragment.primaryConstructor`, use `ExtensionTypeElement.primaryConstructor`.
16+
* Deprecate `ExtensionTypeFragment.representation`, use `ExtensionTypeElement.representation`.
1517

1618
## 8.1.1
1719
* Fix for `EnumSet` usage when compiled to JavaScript.

pkg/analyzer/api.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3588,9 +3588,9 @@ package:analyzer/dart/element/element.dart:
35883588
element (getter: ExtensionTypeElement)
35893589
nextFragment (getter: ExtensionTypeFragment?)
35903590
previousFragment (getter: ExtensionTypeFragment?)
3591-
primaryConstructor (getter: ConstructorFragment)
3591+
primaryConstructor (getter: ConstructorFragment, deprecated)
35923592
primaryConstructor2 (getter: ConstructorFragment, deprecated)
3593-
representation (getter: FieldFragment)
3593+
representation (getter: FieldFragment, deprecated)
35943594
representation2 (getter: FieldFragment, deprecated)
35953595
FieldElement (class extends Object implements PropertyInducingElement):
35963596
new (constructor: FieldElement Function())

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,13 +1506,15 @@ abstract class ExtensionTypeFragment implements InterfaceFragment {
15061506
ExtensionTypeFragment? get previousFragment;
15071507

15081508
/// The primary constructor of this extension.
1509+
@Deprecated('Use ExtensionTypeElement.primaryConstructor instead')
15091510
ConstructorFragment get primaryConstructor;
15101511

15111512
/// The primary constructor of this extension.
15121513
@Deprecated('Use primaryConstructor instead')
15131514
ConstructorFragment get primaryConstructor2;
15141515

15151516
/// The representation of this extension.
1517+
@Deprecated('Use ExtensionTypeElement.representation instead')
15161518
FieldFragment get representation;
15171519

15181520
/// The representation of this extension.

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

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

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

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2455,6 +2455,8 @@ class ExtensionTypeElementImpl extends InterfaceElementImpl
24552455
@override
24562456
final ExtensionTypeFragmentImpl firstFragment;
24572457

2458+
late DartType _typeErasure;
2459+
24582460
ExtensionTypeElementImpl(this.reference, this.firstFragment) {
24592461
reference.element = this;
24602462
firstFragment.element = this;
@@ -2501,7 +2503,7 @@ class ExtensionTypeElementImpl extends InterfaceElementImpl
25012503

25022504
@override
25032505
ConstructorElement get primaryConstructor {
2504-
return firstFragment.primaryConstructor.element;
2506+
return constructors.first;
25052507
}
25062508

25072509
@Deprecated('Use primaryConstructor instead')
@@ -2510,9 +2512,14 @@ class ExtensionTypeElementImpl extends InterfaceElementImpl
25102512
return primaryConstructor;
25112513
}
25122514

2515+
FieldFormalParameterElementImpl get primaryFormalParameter {
2516+
return primaryConstructor.formalParameters.first
2517+
as FieldFormalParameterElementImpl;
2518+
}
2519+
25132520
@override
25142521
FieldElementImpl get representation {
2515-
return firstFragment.representation.element;
2522+
return fields.first;
25162523
}
25172524

25182525
@Deprecated('Use representation instead')
@@ -2522,7 +2529,14 @@ class ExtensionTypeElementImpl extends InterfaceElementImpl
25222529
}
25232530

25242531
@override
2525-
DartType get typeErasure => firstFragment.typeErasure;
2532+
DartType get typeErasure {
2533+
_ensureReadResolution();
2534+
return _typeErasure;
2535+
}
2536+
2537+
set typeErasure(DartType value) {
2538+
_typeErasure = value;
2539+
}
25262540

25272541
@override
25282542
T? accept<T>(ElementVisitor2<T> visitor) {
@@ -2552,8 +2566,6 @@ class ExtensionTypeFragmentImpl extends InterfaceFragmentImpl
25522566
@override
25532567
late final ExtensionTypeElementImpl element;
25542568

2555-
late DartType typeErasure;
2556-
25572569
/// Whether the element has direct or indirect reference to itself,
25582570
/// in representation.
25592571
bool hasRepresentationSelfReference = false;
@@ -2572,6 +2584,7 @@ class ExtensionTypeFragmentImpl extends InterfaceFragmentImpl
25722584
ExtensionTypeFragmentImpl? get previousFragment =>
25732585
super.previousFragment as ExtensionTypeFragmentImpl?;
25742586

2587+
@Deprecated('Use ExtensionTypeElement.primaryConstructor instead')
25752588
@override
25762589
ConstructorFragmentImpl get primaryConstructor {
25772590
return constructors.first;
@@ -2581,6 +2594,7 @@ class ExtensionTypeFragmentImpl extends InterfaceFragmentImpl
25812594
@override
25822595
ConstructorFragmentImpl get primaryConstructor2 => primaryConstructor;
25832596

2597+
@Deprecated('Use ExtensionTypeElement.representation instead')
25842598
@override
25852599
FieldFragmentImpl get representation {
25862600
return fields.first;

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -596,10 +596,12 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
596596

597597
_setOrCreateMetadataElements(fragment, node.metadata);
598598

599-
_setOrCreateMetadataElements(
600-
fragment.representation,
601-
node.representation.fieldMetadata,
602-
);
599+
if (identical(element.firstFragment, fragment)) {
600+
_setOrCreateMetadataElements(
601+
element.representation.firstFragment,
602+
node.representation.fieldMetadata,
603+
);
604+
}
603605

604606
_withElementWalker(ElementWalker.forExtensionType(fragment), () {
605607
_withNameScope(() {

pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -799,9 +799,10 @@ class MemberDuplicateDefinitionVerifier {
799799

800800
void _checkExtensionType(ExtensionTypeDeclarationImpl node) {
801801
var fragment = node.declaredFragment!;
802-
var firstFragment = fragment.element.firstFragment;
803-
var primaryConstructorName = firstFragment.constructors.first.name;
804-
var representationGetter = firstFragment.representation.element.getter!;
802+
var element = fragment.element;
803+
var firstFragment = element.firstFragment;
804+
var primaryConstructorName = element.primaryConstructor.name!;
805+
var representationGetter = element.representation.getter!;
805806
var elementContext = _getElementContext(firstFragment);
806807
elementContext.constructorNames.add(primaryConstructorName);
807808
if (representationGetter.name case var getterName?) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ class LibraryReader {
630630
element.deferReadResolution(
631631
_createDeferredReadResolutionCallback((reader) {
632632
reader._addTypeParameters2(element.typeParameters);
633+
element.typeErasure = reader.readRequiredType();
633634
element.interfaces = reader._readInterfaceTypeList();
634635
}),
635636
);
@@ -663,7 +664,6 @@ class LibraryReader {
663664
fragment.typeParameters,
664665
);
665666
fragment.metadata = reader._readMetadata();
666-
fragment.typeErasure = reader.readRequiredType();
667667
},
668668
);
669669
});

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

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

368368
_writeElementResolution(() {
369369
_resolutionSink.withTypeParameters(element.typeParameters, () {
370+
_resolutionSink.writeType(element.typeErasure);
370371
_resolutionSink._writeTypeList(element.interfaces);
371372
});
372373
});
@@ -380,7 +381,6 @@ class BundleWriter {
380381
_sink.writeBool(fragment.hasImplementsSelfReference);
381382
_writeTypeParameters(fragment.typeParameters, () {
382383
_resolutionSink._writeMetadata(fragment.metadata);
383-
_resolutionSink.writeType(fragment.typeErasure);
384384

385385
// TODO(scheglov): consider reading lazily
386386
_sink.writeList(fragment.fields, _writeFieldFragment);

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

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

156-
var representationFragment = element.firstFragment.representation;
157-
var representationElement = representationFragment.element;
158-
representationElement.type = type;
156+
element.representation.type = type;
157+
element.primaryFormalParameter.type = type;
159158

160-
element.firstFragment.typeErasure = type.extensionTypeErasure;
159+
element.typeErasure = type.extensionTypeErasure;
161160
element.interfaces =
162161
element.interfaces
163162
.whereType<InterfaceType>()
164163
.where(typeSystem.isValidExtensionTypeSuperinterface)
165164
.toFixedList();
166165

167-
var primaryConstructor = element.constructors.first;
168-
var primaryFormalParameter = primaryConstructor.formalParameters.first;
169-
primaryFormalParameter as FieldFormalParameterElementImpl;
170-
primaryFormalParameter.type = type;
171166
isEvaluated = true;
172167
}
173168

0 commit comments

Comments
 (0)