Skip to content

Commit e3d218a

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Standardize fragment APIs to XyzFragmentImpl across elements.
Replace uses of the generic Fragment/FunctionTypedFragment in element APIs with their concrete *FragmentImpl counterparts. This makes the element <-> fragment contract explicit, enforces invariants, and removes a number of ad-hoc casts and hand-rolled fragment traversals. Key changes: - ElementImpl: make `firstFragment` abstract returning FragmentImpl and specialize `fragments` to `List<FragmentImpl>`. - Function-typed hierarchy: make ExecutableFragmentImpl extend FunctionTypedFragmentImpl; make FunctionTypedFragmentImpl extend FragmentImpl and expose `element`, `formalParameters`, and `typeParameters`. - Internal* mixins and concrete *ElementImpl classes: specialize `firstFragment`/`fragments` to the corresponding *FragmentImpl types (e.g., MethodFragmentImpl, SetterFragmentImpl, VariableFragmentImpl, InstanceFragmentImpl, etc.). - Substituted*ElementImpl: return `baseElement.fragments` directly and tighten `firstFragment`/`fragments` to *FragmentImpl types to avoid manual iteration and casts. - Inheritance manager: drop redundant casts when mapping parameters/type parameters; build result fragments using the concrete *FragmentImpl types. - Cleanup: remove unnecessary casts in constant-initializer handling and detachment logic. Behavior is unchanged; the API is now stricter and more consistent, which prevents mixing arbitrary Fragment implementations with elements and reduces boilerplate and casting throughout the codebase. Change-Id: I9b90575affd7fe2ad3ac89a9dd7f145605619d2b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447942 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 2765c75 commit e3d218a

File tree

4 files changed

+74
-85
lines changed

4 files changed

+74
-85
lines changed

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

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,6 +1699,9 @@ abstract class ElementImpl implements Element {
16991699
return buffer.toString();
17001700
}
17011701

1702+
@override
1703+
FragmentImpl get firstFragment;
1704+
17021705
/// The location of [firstFragment], without recording opaque requirement.
17031706
@trackedIncludedInId
17041707
FirstFragmentLocation get firstFragmentLocation {
@@ -1710,16 +1713,7 @@ abstract class ElementImpl implements Element {
17101713
}
17111714

17121715
@override
1713-
List<Fragment> get fragments {
1714-
return [
1715-
for (
1716-
Fragment? fragment = _firstFragment;
1717-
fragment != null;
1718-
fragment = fragment.nextFragment
1719-
)
1720-
fragment,
1721-
];
1722-
}
1716+
List<FragmentImpl> get fragments;
17231717

17241718
@override
17251719
bool get isPrivate {
@@ -2208,7 +2202,7 @@ abstract class ExecutableElementImpl extends FunctionTypedElementImpl
22082202
}
22092203

22102204
@GenerateFragmentImpl(modifiers: _ExecutableFragmentImplModifiers.values)
2211-
abstract class ExecutableFragmentImpl extends FragmentImpl
2205+
abstract class ExecutableFragmentImpl extends FunctionTypedFragmentImpl
22122206
with DeferredResolutionReadingMixin, _ExecutableFragmentImplMixin
22132207
implements ExecutableFragment {
22142208
List<TypeParameterFragmentImpl> _typeParameters = const [];
@@ -3513,6 +3507,12 @@ sealed class FunctionFragmentImpl extends ExecutableFragmentImpl
35133507

35143508
abstract class FunctionTypedElementImpl extends ElementImpl
35153509
implements FunctionTypedElement {
3510+
@override
3511+
FunctionTypedFragmentImpl get firstFragment;
3512+
3513+
@override
3514+
List<FunctionTypedFragmentImpl> get fragments;
3515+
35163516
@override
35173517
LibraryElementImpl get library => super.library!;
35183518

@@ -3527,14 +3527,17 @@ abstract class FunctionTypedElementImpl extends ElementImpl
35273527
/// Common internal interface shared by elements whose type is a function type.
35283528
///
35293529
/// Clients may not extend, implement or mix-in this class.
3530-
abstract class FunctionTypedFragmentImpl implements FragmentImpl {
3531-
/// The parameters defined by this executable element.
3530+
abstract class FunctionTypedFragmentImpl extends FragmentImpl
3531+
implements FunctionTypedFragment {
3532+
FunctionTypedFragmentImpl({super.firstTokenOffset});
3533+
3534+
@override
3535+
FunctionTypedElementImpl get element;
3536+
3537+
@override
35323538
List<FormalParameterFragmentImpl> get formalParameters;
35333539

3534-
/// The type parameters declared by this element directly.
3535-
///
3536-
/// This does not include type parameters that are declared by any enclosing
3537-
/// elements.
3540+
@override
35383541
List<TypeParameterFragmentImpl> get typeParameters;
35393542
}
35403543

@@ -3985,6 +3988,9 @@ abstract class InstanceElementImpl extends ElementImpl
39853988
@override
39863989
InstanceFragmentImpl get firstFragment;
39873990

3991+
@override
3992+
List<InstanceFragmentImpl> get fragments;
3993+
39883994
@override
39893995
@trackedDirectlyExpensive
39903996
List<GetterElementImpl> get getters {
@@ -5142,9 +5148,15 @@ mixin InternalExecutableElement implements ExecutableElement {
51425148
@override
51435149
ExecutableElementImpl get baseElement;
51445150

5151+
@override
5152+
ExecutableFragmentImpl get firstFragment;
5153+
51455154
@override
51465155
List<InternalFormalParameterElement> get formalParameters;
51475156

5157+
@override
5158+
List<ExecutableFragmentImpl> get fragments;
5159+
51485160
@override
51495161
MetadataImpl get metadata;
51505162

@@ -5175,6 +5187,12 @@ mixin InternalFormalParameterElement on InternalVariableElement
51755187
@override
51765188
FormalParameterElementImpl get baseElement;
51775189

5190+
@override
5191+
FormalParameterFragmentImpl get firstFragment;
5192+
5193+
@override
5194+
List<FormalParameterFragmentImpl> get fragments;
5195+
51785196
ParameterKind get parameterKind;
51795197

51805198
@override
@@ -5249,6 +5267,12 @@ mixin InternalPropertyInducingElement on InternalVariableElement
52495267
@override
52505268
PropertyInducingElementImpl get baseElement;
52515269

5270+
@override
5271+
PropertyInducingFragmentImpl get firstFragment;
5272+
5273+
@override
5274+
List<PropertyInducingFragmentImpl> get fragments;
5275+
52525276
@override
52535277
InternalGetterElement? get getter;
52545278

@@ -5283,6 +5307,12 @@ mixin InternalSetterElement on InternalPropertyAccessorElement
52835307
}
52845308

52855309
mixin InternalVariableElement implements VariableElement {
5310+
@override
5311+
VariableFragmentImpl get firstFragment;
5312+
5313+
@override
5314+
List<VariableFragmentImpl> get fragments;
5315+
52865316
@override
52875317
MetadataImpl get metadata;
52885318

@@ -10131,7 +10161,6 @@ abstract class VariableElementImpl extends ElementImpl
1013110161
}
1013210162

1013310163
for (var fragment in fragments.reversed) {
10134-
fragment as VariableFragmentImpl;
1013510164
if (fragment.initializer case ExpressionImpl expression) {
1013610165
return _constantInitializer = ConstantInitializerImpl(
1013710166
fragment: fragment,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,7 +1080,7 @@ class InheritanceManager3 {
10801080
.toList();
10811081
// TODO(scheglov): check if can type cast instead
10821082
resultFragment.formalParameters = resultType.parameters
1083-
.map((e) => e.firstFragment as FormalParameterFragmentImpl)
1083+
.map((e) => e.firstFragment)
10841084
.toList();
10851085

10861086
var elementName = firstElement.name!;
@@ -1131,7 +1131,7 @@ class InheritanceManager3 {
11311131
resultFragment.enclosingFragment = targetClass.firstFragment;
11321132
// TODO(scheglov): check if can type cast instead
11331133
resultFragment.formalParameters = resultType.parameters
1134-
.map((e) => e.firstFragment as FormalParameterFragmentImpl)
1134+
.map((e) => e.firstFragment)
11351135
.toList();
11361136

11371137
field.enclosingFragment = targetClass.firstFragment;

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

Lines changed: 25 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,7 @@ class SubstitutedConstructorElementImpl extends SubstitutedExecutableElementImpl
5454

5555
@override
5656
List<ConstructorFragmentImpl> get fragments {
57-
return [
58-
for (
59-
ConstructorFragmentImpl? fragment = firstFragment;
60-
fragment != null;
61-
fragment = fragment.nextFragment
62-
)
63-
fragment,
64-
];
57+
return baseElement.fragments;
6558
}
6659

6760
@override
@@ -187,6 +180,12 @@ abstract class SubstitutedElementImpl implements Element {
187180
@override
188181
String get displayName => baseElement.displayName;
189182

183+
@override
184+
FragmentImpl get firstFragment;
185+
186+
@override
187+
List<FragmentImpl> get fragments;
188+
190189
@override
191190
int get id => baseElement.id;
192191

@@ -317,7 +316,7 @@ abstract class SubstitutedExecutableElementImpl extends SubstitutedElementImpl
317316
Element? get enclosingElement2 => enclosingElement;
318317

319318
@override
320-
ExecutableFragment get firstFragment;
319+
ExecutableFragmentImpl get firstFragment;
321320

322321
@override
323322
List<InternalFormalParameterElement> get formalParameters {
@@ -345,15 +344,8 @@ abstract class SubstitutedExecutableElementImpl extends SubstitutedElementImpl
345344
}
346345

347346
@override
348-
List<ExecutableFragment> get fragments {
349-
return [
350-
for (
351-
ExecutableFragment? fragment = firstFragment;
352-
fragment != null;
353-
fragment = fragment.nextFragment
354-
)
355-
fragment,
356-
];
347+
List<ExecutableFragmentImpl> get fragments {
348+
return baseElement.fragments;
357349
}
358350

359351
@override
@@ -525,14 +517,7 @@ class SubstitutedFieldElementImpl extends SubstitutedVariableElementImpl
525517

526518
@override
527519
List<FieldFragmentImpl> get fragments {
528-
return [
529-
for (
530-
FieldFragmentImpl? fragment = firstFragment;
531-
fragment != null;
532-
fragment = fragment.nextFragment
533-
)
534-
fragment,
535-
];
520+
return baseElement.fragments;
536521
}
537522

538523
@override
@@ -685,10 +670,12 @@ class SubstitutedFieldFormalParameterElementImpl
685670
}
686671

687672
@override
688-
FieldFormalParameterFragment get firstFragment => baseElement.firstFragment;
673+
FieldFormalParameterFragmentImpl get firstFragment {
674+
return baseElement.firstFragment;
675+
}
689676

690677
@override
691-
List<FieldFormalParameterFragment> get fragments {
678+
List<FieldFormalParameterFragmentImpl> get fragments {
692679
return baseElement.fragments;
693680
}
694681

@@ -757,22 +744,15 @@ class SubstitutedFormalParameterElementImpl
757744
Element? get enclosingElement2 => enclosingElement;
758745

759746
@override
760-
FormalParameterFragment get firstFragment => baseElement.firstFragment;
747+
FormalParameterFragmentImpl get firstFragment => baseElement.firstFragment;
761748

762749
@override
763750
List<FormalParameterElementImpl> get formalParameters =>
764751
baseElement.formalParameters;
765752

766753
@override
767-
List<FormalParameterFragment> get fragments {
768-
return [
769-
for (
770-
FormalParameterFragment? fragment = firstFragment;
771-
fragment != null;
772-
fragment = fragment.nextFragment
773-
)
774-
fragment,
775-
];
754+
List<FormalParameterFragmentImpl> get fragments {
755+
return baseElement.fragments;
776756
}
777757

778758
@override
@@ -936,14 +916,7 @@ class SubstitutedGetterElementImpl
936916

937917
@override
938918
List<GetterFragmentImpl> get fragments {
939-
return [
940-
for (
941-
GetterFragmentImpl? fragment = firstFragment;
942-
fragment != null;
943-
fragment = fragment.nextFragment
944-
)
945-
fragment,
946-
];
919+
return baseElement.fragments;
947920
}
948921

949922
@override
@@ -1015,14 +988,7 @@ class SubstitutedMethodElementImpl extends SubstitutedExecutableElementImpl
1015988

1016989
@override
1017990
List<MethodFragmentImpl> get fragments {
1018-
return [
1019-
for (
1020-
MethodFragmentImpl? fragment = firstFragment;
1021-
fragment != null;
1022-
fragment = fragment.nextFragment
1023-
)
1024-
fragment,
1025-
];
991+
return baseElement.fragments;
1026992
}
1027993

1028994
@override
@@ -1173,14 +1139,7 @@ class SubstitutedSetterElementImpl
11731139

11741140
@override
11751141
List<SetterFragmentImpl> get fragments {
1176-
return [
1177-
for (
1178-
SetterFragmentImpl? fragment = firstFragment;
1179-
fragment != null;
1180-
fragment = fragment.nextFragment
1181-
)
1182-
fragment,
1183-
];
1142+
return baseElement.fragments;
11841143
}
11851144

11861145
@override
@@ -1248,10 +1207,12 @@ class SubstitutedSuperFormalParameterElementImpl
12481207
super.baseElement as SuperFormalParameterElementImpl;
12491208

12501209
@override
1251-
SuperFormalParameterFragment get firstFragment => baseElement.firstFragment;
1210+
SuperFormalParameterFragmentImpl get firstFragment {
1211+
return baseElement.firstFragment;
1212+
}
12521213

12531214
@override
1254-
List<SuperFormalParameterFragment> get fragments {
1215+
List<SuperFormalParameterFragmentImpl> get fragments {
12551216
return baseElement.fragments;
12561217
}
12571218

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ class _Visitor extends GeneralizingElementVisitor2<void> {
9999
void _detachConstVariable(Object element) {
100100
if (element is VariableElementImpl) {
101101
for (var fragment in element.fragments) {
102-
fragment as VariableFragmentImpl;
103102
var initializer = fragment.constantInitializer;
104103
if (initializer is ExpressionImpl) {
105104
_detachNode(initializer);

0 commit comments

Comments
 (0)