Skip to content

Commit 5fcf3cf

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Deprecate supertype, mixins, and interfaces on InterfaceFragment
Deprecate the `supertype`, `mixins`, and `interfaces` getters on `InterfaceFragment`. This information more accurately belongs on the `InterfaceElement`, which represents the fully merged view of a class, rather than on a single fragment declaration. This change is part of an ongoing effort to consolidate class hierarchy information at the element level. All internal call sites have been updated to use the corresponding getters on `InterfaceElement`. As part of this refactoring, the `isValidMixin` logic has also been moved from `ClassFragmentImpl` to `ClassElementImpl` to align with this principle. Change-Id: Ia919eaa6328451d186e9f67e2c1bb8605856f109 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/445561 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent 2e55343 commit 5fcf3cf

File tree

8 files changed

+36
-32
lines changed

8 files changed

+36
-32
lines changed

pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2752,8 +2752,8 @@ class InScopeCompletionPass extends SimpleAstVisitor<void> {
27522752
offset <= node.argumentList.offset) {
27532753
var container = constructor.parent;
27542754
var superType = switch (container) {
2755-
ClassDeclaration() => container.declaredFragment?.supertype,
2756-
EnumDeclaration() => container.declaredFragment?.supertype,
2755+
ClassDeclaration() => container.declaredFragment?.element.supertype,
2756+
EnumDeclaration() => container.declaredFragment?.element.supertype,
27572757
_ => null,
27582758
};
27592759
if (superType != null) {

pkg/analyzer/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
Use `DeclaredVariablePattern.declaredFragment` instead.
1010
* Deprecate `VariableDeclaration.declaredElement` and `VariableDeclaration.declaredElement2`.
1111
Use `VariableDeclaration.declaredFragment` instead.
12+
* Deprecate `InterfaceFragment.interfaces`, use `InterfaceElement.interfaces` instead.
13+
* Deprecate `InterfaceFragment.mixins`, use `InterfaceElement.mixins` instead.
14+
* Deprecate `InterfaceFragment.supertype`, use `InterfaceElement.supertype` instead.
1215

1316
## 8.1.1
1417
* Fix for `EnumSet` usage when compiled to JavaScript.

pkg/analyzer/api.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3780,11 +3780,11 @@ package:analyzer/dart/element/element.dart:
37803780
constructors (getter: List<ConstructorFragment>)
37813781
constructors2 (getter: List<ConstructorFragment>, deprecated)
37823782
element (getter: InterfaceElement)
3783-
interfaces (getter: List<InterfaceType>)
3784-
mixins (getter: List<InterfaceType>)
3783+
interfaces (getter: List<InterfaceType>, deprecated)
3784+
mixins (getter: List<InterfaceType>, deprecated)
37853785
nextFragment (getter: InterfaceFragment?)
37863786
previousFragment (getter: InterfaceFragment?)
3787-
supertype (getter: InterfaceType?)
3787+
supertype (getter: InterfaceType?, deprecated)
37883788
JoinPatternVariableElement (class extends Object implements PatternVariableElement):
37893789
new (constructor: JoinPatternVariableElement Function())
37903790
firstFragment (getter: JoinPatternVariableFragment)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2516,13 +2516,15 @@ abstract class InterfaceFragment implements InstanceFragment {
25162516
InterfaceElement get element;
25172517

25182518
/// The interfaces that are implemented by this fragment.
2519+
@Deprecated('Use InterfaceElement.interfaces instead')
25192520
List<InterfaceType> get interfaces;
25202521

25212522
/// The mixins that are applied by this fragment.
25222523
///
25232524
/// [ClassFragment] and [EnumFragment] can have mixins.
25242525
///
25252526
/// [MixinFragment] cannot have mixins, so the empty list is returned.
2527+
@Deprecated('Use InterfaceElement.mixins instead')
25262528
List<InterfaceType> get mixins;
25272529

25282530
@override
@@ -2532,6 +2534,7 @@ abstract class InterfaceFragment implements InstanceFragment {
25322534
InterfaceFragment? get previousFragment;
25332535

25342536
/// The superclass declared by this fragment.
2537+
@Deprecated('Use InterfaceElement.supertype instead')
25352538
InterfaceType? get supertype;
25362539
}
25372540

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,18 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
417417

418418
@override
419419
@trackedIncludedInId
420-
bool get isValidMixin => firstFragment.isValidMixin;
420+
bool get isValidMixin {
421+
var supertype = this.supertype;
422+
if (supertype != null && !supertype.isDartCoreObject) {
423+
return false;
424+
}
425+
for (var constructor in constructors) {
426+
if (!constructor.isSynthetic && !constructor.isFactory) {
427+
return false;
428+
}
429+
}
430+
return true;
431+
}
421432

422433
@override
423434
ElementKind get kind => ElementKind.CLASS;
@@ -633,19 +644,6 @@ class ClassFragmentImpl extends InterfaceFragmentImpl
633644

634645
bool get isExhaustive => isSealed;
635646

636-
bool get isValidMixin {
637-
var supertype = this.supertype;
638-
if (supertype != null && !supertype.isDartCoreObject) {
639-
return false;
640-
}
641-
for (var constructor in constructors) {
642-
if (!constructor.isSynthetic && !constructor.isFactory) {
643-
return false;
644-
}
645-
}
646-
return true;
647-
}
648-
649647
@override
650648
ClassFragmentImpl? get nextFragment {
651649
return super.nextFragment as ClassFragmentImpl?;
@@ -4998,10 +4996,11 @@ abstract class InterfaceFragmentImpl extends InstanceFragmentImpl
49984996
@override
49994997
InterfaceElementImpl get element;
50004998

4999+
@Deprecated('Use InterfaceElement.interfaces instead')
50015000
@override
50025001
List<InterfaceTypeImpl> get interfaces => element.interfaces;
50035002

5004-
5003+
@Deprecated('Use InterfaceElement.mixins instead')
50055004
@override
50065005
List<InterfaceTypeImpl> get mixins => element.mixins;
50075006

@@ -5015,6 +5014,7 @@ abstract class InterfaceFragmentImpl extends InstanceFragmentImpl
50155014
return super.previousFragment as InterfaceFragmentImpl?;
50165015
}
50175016

5017+
@Deprecated('Use InterfaceElement.supertype instead')
50185018
@override
50195019
InterfaceTypeImpl? get supertype => element.supertype;
50205020

@@ -7652,6 +7652,7 @@ class MixinFragmentImpl extends InterfaceFragmentImpl
76527652
/// given [offset] in the file that contains the declaration of this element.
76537653
MixinFragmentImpl({required super.name});
76547654

7655+
@Deprecated('Use InterfaceElement.mixins instead')
76557656
@override
76567657
List<InterfaceTypeImpl> get mixins => const [];
76577658

@@ -7668,6 +7669,7 @@ class MixinFragmentImpl extends InterfaceFragmentImpl
76687669
return element.superclassConstraints;
76697670
}
76707671

7672+
@Deprecated('Use InterfaceElement.supertype instead')
76717673
@override
76727674
InterfaceTypeImpl? get supertype => null;
76737675

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4303,8 +4303,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
43034303

43044304
var mixinSupertype = mixinElement.supertype;
43054305
if (mixinSupertype == null || mixinSupertype.isDartCoreObject) {
4306-
// TODO(scheglov): don't use firstFragment
4307-
var mixins = mixinElement.firstFragment.mixins;
4306+
var mixins = mixinElement.mixins;
43084307
if (mixins.isEmpty ||
43094308
mixinElement.isMixinApplication && mixins.length < 2) {
43104309
return false;
@@ -4588,7 +4587,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
45884587
return;
45894588
}
45904589
// prepare super
4591-
var superType = fragment.supertype;
4590+
var superType = fragment.element.supertype;
45924591
if (superType == null) {
45934592
return;
45944593
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ class LibraryBuilder {
380380
case ClassFragmentImpl():
381381
var element = interfaceFragment.element;
382382
if (!element.isDartCoreObject) {
383-
if (interfaceFragment.supertype == null) {
383+
if (element.supertype == null) {
384384
shouldResetClassHierarchies = true;
385385
element.supertype = objectType;
386386
}

pkg/linter/lib/src/rules/analyzer_public_api.dart

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,13 @@ class _Visitor extends SimpleAstVisitor<void> {
161161
for (var typeParameter in typeParameters) {
162162
_checkTypeParameter(typeParameter, fragment: fragment);
163163
}
164-
if (fragment case InterfaceFragment(
165-
:var supertype,
166-
:var interfaces,
167-
:var mixins,
168-
)) {
169-
_checkType(supertype, fragment: fragment);
170-
for (var t in interfaces) {
164+
if (fragment is InterfaceFragment) {
165+
var element = fragment.element;
166+
_checkType(element.supertype, fragment: fragment);
167+
for (var t in element.interfaces) {
171168
_checkType(t, fragment: fragment);
172169
}
173-
for (var t in mixins) {
170+
for (var t in element.mixins) {
174171
_checkType(t, fragment: fragment);
175172
}
176173
}

0 commit comments

Comments
 (0)