Elements. Write 'hasNonFinalField' flag into text expectations.
I plan to compute it during linking, store into summary, and manifest.
Change-Id: Iae69629a02df9e700919a0f9a50143e213c122be
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/445804
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index c6e3849..7444953 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -229,43 +229,6 @@
}
@override
- @trackedDirectlyExpensive
- bool get hasNonFinalField {
- globalResultRequirements?.record_classElement_hasNonFinalField(
- element: this,
- );
-
- var classesToVisit = <InterfaceElementImpl>[];
- var visitedClasses = <InterfaceElementImpl>{};
- classesToVisit.add(this);
- while (classesToVisit.isNotEmpty) {
- var currentElement = classesToVisit.removeAt(0);
- if (visitedClasses.add(currentElement)) {
- // check fields
- for (var field in currentElement.fields) {
- if (!field.isFinal &&
- !field.isConst &&
- !field.isStatic &&
- !field.isSynthetic) {
- return true;
- }
- }
- // check mixins
- for (var mixinType in currentElement.mixins) {
- classesToVisit.add(mixinType.element);
- }
- // check super
- var supertype = currentElement.supertype;
- if (supertype != null) {
- classesToVisit.add(supertype.element);
- }
- }
- }
- // not found
- return false;
- }
-
- @override
@trackedIncludedInId
bool get isAbstract {
return hasModifier(Modifier.ABSTRACT);
@@ -4673,6 +4636,42 @@
];
}
+ @trackedDirectlyExpensive
+ bool get hasNonFinalField {
+ globalResultRequirements?.record_interfaceElement_hasNonFinalField(
+ element: this,
+ );
+
+ var classesToVisit = <InterfaceElementImpl>[];
+ var visitedClasses = <InterfaceElementImpl>{};
+ classesToVisit.add(this);
+ while (classesToVisit.isNotEmpty) {
+ var currentElement = classesToVisit.removeAt(0);
+ if (visitedClasses.add(currentElement)) {
+ // check fields
+ for (var field in currentElement.fields) {
+ if (!field.isFinal &&
+ !field.isConst &&
+ !field.isStatic &&
+ !field.isSynthetic) {
+ return true;
+ }
+ }
+ // check mixins
+ for (var mixinType in currentElement.mixins) {
+ classesToVisit.add(mixinType.element);
+ }
+ // check super
+ var supertype = currentElement.supertype;
+ if (supertype != null) {
+ classesToVisit.add(supertype.element);
+ }
+ }
+ }
+ // not found
+ return false;
+ }
+
InheritanceManager3 get inheritanceManager {
return library.session.inheritanceManager;
}
diff --git a/pkg/analyzer/lib/src/fine/requirements.dart b/pkg/analyzer/lib/src/fine/requirements.dart
index d247241..e9321e3 100644
--- a/pkg/analyzer/lib/src/fine/requirements.dart
+++ b/pkg/analyzer/lib/src/fine/requirements.dart
@@ -799,12 +799,6 @@
// TODO(scheglov): implement.
}
- void record_classElement_hasNonFinalField({
- required ClassElementImpl element,
- }) {
- // TODO(scheglov): implement.
- }
-
void record_fieldElement_getter({
required FieldElementImpl element,
String? name,
@@ -1071,6 +1065,12 @@
requirements.requestedConstructors[constructorName] = constructorId;
}
+ void record_interfaceElement_hasNonFinalField({
+ required InterfaceElementImpl element,
+ }) {
+ // TODO(scheglov): implement.
+ }
+
/// Record that all accessible extensions inside a [LibraryFragmentImpl]
/// are requested, which means dependency on all extensions exported
/// from [importedLibraries].
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index d4e42f6..49a6e5c 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -987,6 +987,7 @@
_sink.writeIf(e.isInterface, 'interface ');
_sink.writeIf(e.isFinal, 'final ');
_writeNotSimplyBounded(e);
+ _sink.writeIf(e.hasNonFinalField, 'hasNonFinalField ');
_sink.writeIf(e.isMixinClass, 'mixin ');
_sink.write('class ');
_sink.writeIf(e.isMixinApplication, 'alias ');
@@ -1009,6 +1010,7 @@
case MixinElementImpl():
_sink.writeIf(e.isBase, 'base ');
_writeNotSimplyBounded(e);
+ _sink.writeIf(e.hasNonFinalField, 'hasNonFinalField ');
_sink.write('mixin ');
}
diff --git a/pkg/analyzer/test/src/summary/elements/class_test.dart b/pkg/analyzer/test/src/summary/elements/class_test.dart
index 58e0e19..222bb2c 100644
--- a/pkg/analyzer/test/src/summary/elements/class_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/class_test.dart
@@ -340,7 +340,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -409,7 +409,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -478,7 +478,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -555,7 +555,7 @@
#F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -636,7 +636,7 @@
#F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -722,7 +722,7 @@
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
element: <testLibrary>::@class::C::@setter::f::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -811,7 +811,7 @@
#F11 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
element: <testLibrary>::@class::C::@setter::x::@def::1::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -935,7 +935,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1004,7 +1004,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1073,7 +1073,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1142,7 +1142,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1211,7 +1211,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1280,7 +1280,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1349,7 +1349,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1422,7 +1422,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1494,7 +1494,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1567,7 +1567,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7136,7 +7136,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
element: <testLibrary>::@class::C::@setter::i::@formalParameter::value
classes
- abstract class C
+ abstract hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7304,7 +7304,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7371,7 +7371,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7441,7 +7441,7 @@
#F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7524,7 +7524,7 @@
#F9 _ (nameOffset:39) (firstTokenOffset:35) (offset:39)
element: <testLibrary>::@class::C::@setter::foo::@def::1::@formalParameter::_
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7603,7 +7603,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
element: <testLibrary>::@class::C::@setter::i::@formalParameter::value
classes
- abstract class C
+ abstract hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -7985,7 +7985,7 @@
#F11 v (nameOffset:67) (firstTokenOffset:59) (offset:67)
element: <testLibrary>::@class::D::@getter::v
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
supertype: D
@@ -8071,7 +8071,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -8132,7 +8132,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -8193,7 +8193,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -8254,7 +8254,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -8329,7 +8329,7 @@
#F10 v (nameOffset:56) (firstTokenOffset:48) (offset:56)
element: <testLibrary>::@class::D::@getter::v
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
supertype: D
@@ -9408,7 +9408,7 @@
library
reference: <testLibrary>
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F0
fields
@@ -9437,7 +9437,7 @@
library
reference: <testLibrary>
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F0
fields
@@ -9523,7 +9523,7 @@
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
element: <testLibrary>::@class::C::@setter::2::@formalParameter::value
classes
- abstract class C
+ abstract hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -9608,7 +9608,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
typeParameters
@@ -9672,7 +9672,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
typeParameters
@@ -10234,7 +10234,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::a::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10300,7 +10300,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10452,7 +10452,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::a::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10513,7 +10513,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10574,7 +10574,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10644,7 +10644,7 @@
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
element: <testLibrary>::@class::C::@setter::j::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10729,7 +10729,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -10932,7 +10932,7 @@
reference: <testLibrary>::@class::A::@method::foo
firstFragment: #F3
returnType: int
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F4
supertype: A
@@ -11034,7 +11034,7 @@
firstFragment: #F4
returnType: int
variable: <testLibrary>::@class::A::@field::foo
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F5
supertype: A
@@ -15998,7 +15998,7 @@
#F19 p (nameOffset:123) (firstTokenOffset:123) (offset:123)
element: <testLibrary>::@class::D::@setter::t::@formalParameter::p
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -16028,7 +16028,7 @@
type: int
returnType: void
variable: <testLibrary>::@class::A::@field::t
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
supertype: A
@@ -16060,7 +16060,7 @@
type: double
returnType: void
variable: <testLibrary>::@class::B::@field::t
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F13
supertype: A
@@ -16071,7 +16071,7 @@
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F14
superConstructor: <testLibrary>::@class::A::@constructor::new
- class D
+ hasNonFinalField class D
reference: <testLibrary>::@class::D
firstFragment: #F15
supertype: C
@@ -20185,7 +20185,7 @@
synthetic new
reference: <testLibrary>::@class::M::@constructor::new
firstFragment: #F2
- class alias MixinApp
+ hasNonFinalField class alias MixinApp
reference: <testLibrary>::@class::MixinApp
firstFragment: #F3
supertype: Base
@@ -20661,7 +20661,7 @@
#F16 f (nameOffset:92) (firstTokenOffset:87) (offset:92)
element: <testLibrary>::@class::E::@method::f
classes
- class alias C
+ hasNonFinalField class alias C
reference: <testLibrary>::@class::C
firstFragment: #F1
supertype: D
@@ -20686,7 +20686,7 @@
synthetic new
reference: <testLibrary>::@class::D::@constructor::new
firstFragment: #F4
- class E
+ hasNonFinalField class E
reference: <testLibrary>::@class::E
firstFragment: #F5
fields
@@ -20928,7 +20928,7 @@
#F9 this.foo (nameOffset:41) (firstTokenOffset:36) (offset:41)
element: <testLibrary>::@class::C::@setter::bar::@formalParameter::foo
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
diff --git a/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart b/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
index d766bb1..c196cb9 100644
--- a/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
@@ -309,7 +309,7 @@
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
element: <testLibrary>::@class::A::@setter::foo::@def::1::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -1164,7 +1164,7 @@
firstFragment: #F1
superclassConstraints
Object
- mixin A
+ hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A::@def::1
firstFragment: #F2
superclassConstraints
@@ -1192,7 +1192,7 @@
type: dynamic
returnType: void
variable: <testLibrary>::@mixin::A::@def::1::@field::x
- mixin A
+ hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A::@def::2
firstFragment: #F7
superclassConstraints
diff --git a/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart b/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
index 27c70f6..2226768 100644
--- a/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
@@ -716,7 +716,7 @@
#F9 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
index 6aea5a8..2942fef 100644
--- a/pkg/analyzer/test/src/summary/elements/metadata_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -248,7 +248,7 @@
#F8 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@getter::a
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1765,7 +1765,7 @@
#F8 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@getter::a
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1869,7 +1869,7 @@
#F9 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@getter::a
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1985,7 +1985,7 @@
#F9 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@getter::a
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -4481,7 +4481,7 @@
#F14 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@getter::foo
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
diff --git a/pkg/analyzer/test/src/summary/elements/mixin_test.dart b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
index f18cad3..ed9c7cc 100644
--- a/pkg/analyzer/test/src/summary/elements/mixin_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
@@ -132,7 +132,7 @@
reference: <testLibrary>::@class::D::@constructor::new
firstFragment: #F8
mixins
- mixin M
+ hasNonFinalField mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F9
typeParameters
@@ -293,6 +293,65 @@
''');
}
+ test_mixin_field_inferredType() async {
+ var library = await buildLibrary('''
+mixin M {
+ var x = 0;
+}
+''');
+ checkElementText(library, r'''
+library
+ reference: <testLibrary>
+ fragments
+ #F0 <testLibraryFragment>
+ element: <testLibrary>
+ mixins
+ #F1 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
+ element: <testLibrary>::@mixin::M
+ fields
+ #F2 hasInitializer x (nameOffset:16) (firstTokenOffset:16) (offset:16)
+ element: <testLibrary>::@mixin::M::@field::x
+ getters
+ #F3 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+ element: <testLibrary>::@mixin::M::@getter::x
+ setters
+ #F4 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+ element: <testLibrary>::@mixin::M::@setter::x
+ formalParameters
+ #F5 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+ element: <testLibrary>::@mixin::M::@setter::x::@formalParameter::value
+ mixins
+ hasNonFinalField mixin M
+ reference: <testLibrary>::@mixin::M
+ firstFragment: #F1
+ superclassConstraints
+ Object
+ fields
+ hasInitializer x
+ reference: <testLibrary>::@mixin::M::@field::x
+ firstFragment: #F2
+ type: int
+ getter: <testLibrary>::@mixin::M::@getter::x
+ setter: <testLibrary>::@mixin::M::@setter::x
+ getters
+ synthetic x
+ reference: <testLibrary>::@mixin::M::@getter::x
+ firstFragment: #F3
+ returnType: int
+ variable: <testLibrary>::@mixin::M::@field::x
+ setters
+ synthetic x
+ reference: <testLibrary>::@mixin::M::@setter::x
+ firstFragment: #F4
+ formalParameters
+ #E0 requiredPositional value
+ firstFragment: #F5
+ type: int
+ returnType: void
+ variable: <testLibrary>::@mixin::M::@field::x
+''');
+ }
+
test_mixin_field_inferredType_final() async {
var library = await buildLibrary('''
mixin M {
diff --git a/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart b/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
index ab6ab37..cb7ed05 100644
--- a/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
@@ -49,7 +49,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -341,7 +341,7 @@
#F5 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@setter::foo::@formalParameter::value
mixins
- mixin M
+ hasNonFinalField mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
diff --git a/pkg/analyzer/test/src/summary/elements/offsets_test.dart b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
index 497a40b..5c8cf50 100644
--- a/pkg/analyzer/test/src/summary/elements/offsets_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
@@ -948,7 +948,7 @@
#F22 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:94)
element: <testLibrary>::@class::C::@setter::multiWithInit2::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1195,7 +1195,7 @@
#F42 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:409)
element: <testLibrary>::@class::C::@setter::commentAroundAnnotation2::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -2765,7 +2765,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::A::@setter::foo::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
diff --git a/pkg/analyzer/test/src/summary/elements/since_sdk_version_test.dart b/pkg/analyzer/test/src/summary/elements/since_sdk_version_test.dart
index c9a9260..73dc855 100644
--- a/pkg/analyzer/test/src/summary/elements/since_sdk_version_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/since_sdk_version_test.dart
@@ -114,7 +114,7 @@
#F5 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
element: dart:foo::@class::A::@setter::foo::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
diff --git a/pkg/analyzer/test/src/summary/elements/type_alias_test.dart b/pkg/analyzer/test/src/summary/elements/type_alias_test.dart
index 879b96a..5bb9aa8 100644
--- a/pkg/analyzer/test/src/summary/elements/type_alias_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/type_alias_test.dart
@@ -1777,7 +1777,7 @@
#F8 S (nameOffset:12) (firstTokenOffset:12) (offset:12)
element: #E0 S
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
diff --git a/pkg/analyzer/test/src/summary/elements/type_inference_test.dart b/pkg/analyzer/test/src/summary/elements/type_inference_test.dart
index 658875b..17ebcfc 100644
--- a/pkg/analyzer/test/src/summary/elements/type_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/type_inference_test.dart
@@ -622,7 +622,7 @@
#F24 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:128)
element: <testLibrary>::@setter::x::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -908,7 +908,7 @@
#F14 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
element: <testLibrary>::@setter::y::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1911,7 +1911,7 @@
#F11 F (nameOffset:12) (firstTokenOffset:0) (offset:12)
element: <testLibrary>::@typeAlias::F
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
supertype: D
@@ -2238,7 +2238,7 @@
#F13 v (nameOffset:83) (firstTokenOffset:69) (offset:83)
element: <testLibrary>::@class::D::@getter::v
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
typeParameters
@@ -3363,7 +3363,7 @@
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F8
- abstract class D
+ abstract hasNonFinalField class D
reference: <testLibrary>::@class::D
firstFragment: #F9
supertype: C
@@ -3467,7 +3467,7 @@
reference: <testLibrary>::@class::A::@method::call
firstFragment: #F3
returnType: double
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F4
fields
@@ -4012,7 +4012,7 @@
#F14 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
element: <testLibrary>::@class::B::@setter::a::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
@@ -4052,7 +4052,7 @@
type: T
returnType: void
variable: <testLibrary>::@class::A::@field::value
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F9
fields
@@ -4167,7 +4167,7 @@
#F19 mixin M (nameOffset:112) (firstTokenOffset:106) (offset:112)
element: <testLibrary>::@mixin::M
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
@@ -4207,7 +4207,7 @@
type: T
returnType: void
variable: <testLibrary>::@class::A::@field::value
- class alias B
+ hasNonFinalField class alias B
reference: <testLibrary>::@class::B
firstFragment: #F9
typeParameters
@@ -4239,7 +4239,7 @@
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::A::@constructor::new
substitution: {T: T}
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F13
fields
@@ -4318,7 +4318,7 @@
#F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
element: <testLibrary>::@class::A::@setter::f::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
@@ -5493,7 +5493,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
element: <testLibrary>::@class::C::@setter::t::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
typeParameters
@@ -5567,7 +5567,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
element: <testLibrary>::@class::C::@setter::t::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
typeParameters
diff --git a/pkg/analyzer/test/src/summary/elements/types_test.dart b/pkg/analyzer/test/src/summary/elements/types_test.dart
index 8db906a..baa276a 100644
--- a/pkg/analyzer/test/src/summary/elements/types_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/types_test.dart
@@ -727,7 +727,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -1063,7 +1063,7 @@
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F3
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F4
fields
@@ -1693,7 +1693,7 @@
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -2422,7 +2422,7 @@
#F9 f (nameOffset:74) (firstTokenOffset:69) (offset:74)
element: <testLibrary>::@function::f
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
typeParameters
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index a68abf6..2708e1e 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -948,7 +948,7 @@
#F18 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
element: <testLibrary>::@setter::t2::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -1116,7 +1116,7 @@
#F20 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:83)
element: <testLibrary>::@setter::t2::@formalParameter::value
classes
- class I
+ hasNonFinalField class I
reference: <testLibrary>::@class::I
firstFragment: #F1
fields
@@ -1287,7 +1287,7 @@
#F17 getC (nameOffset:56) (firstTokenOffset:54) (offset:56)
element: <testLibrary>::@function::getC
classes
- class I
+ hasNonFinalField class I
reference: <testLibrary>::@class::I
firstFragment: #F1
fields
@@ -1711,7 +1711,7 @@
#F19 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:105)
element: <testLibrary>::@setter::vBoth::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -2031,7 +2031,7 @@
#F71 newC (nameOffset:374) (firstTokenOffset:372) (offset:374)
element: <testLibrary>::@function::newC
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -2061,7 +2061,7 @@
type: int
returnType: void
variable: <testLibrary>::@class::A::@field::f
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
fields
@@ -2091,7 +2091,7 @@
type: A
returnType: void
variable: <testLibrary>::@class::B::@field::a
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F13
fields
@@ -2121,7 +2121,7 @@
type: B
returnType: void
variable: <testLibrary>::@class::C::@field::b
- class X
+ hasNonFinalField class X
reference: <testLibrary>::@class::X
firstFragment: #F19
fields
@@ -2848,7 +2848,7 @@
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
element: <testLibrary>::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -3062,7 +3062,7 @@
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
element: <testLibrary>::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -3228,7 +3228,7 @@
#F12 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
element: <testLibrary>::@class::B::@setter::t::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -3346,7 +3346,7 @@
#F14 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
element: <testLibrary>::@setter::x::@formalParameter::value
classes
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
@@ -3484,7 +3484,7 @@
#F16 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
element: <testLibrary>::@setter::x::@formalParameter::value
classes
- class I
+ hasNonFinalField class I
reference: <testLibrary>::@class::I
firstFragment: #F1
fields
@@ -3625,7 +3625,7 @@
#F13 f (nameOffset:57) (firstTokenOffset:55) (offset:57)
element: <testLibrary>::@function::f
classes
- class I
+ hasNonFinalField class I
reference: <testLibrary>::@class::I
firstFragment: #F1
fields
@@ -7857,7 +7857,7 @@
type: D
returnType: void
variable: <testLibrary>::@class::C::@field::d
- class D
+ hasNonFinalField class D
reference: <testLibrary>::@class::D
firstFragment: #F7
fields
@@ -7981,7 +7981,7 @@
firstFragment: #F4
returnType: D
variable: <testLibrary>::@class::C::@field::d
- class D
+ hasNonFinalField class D
reference: <testLibrary>::@class::D
firstFragment: #F5
fields
@@ -8235,7 +8235,7 @@
#F11 <null-name> (nameOffset:<null>) (firstTokenOffset:61) (offset:61)
element: <testLibrary>::@class::B::@setter::x::@formalParameter::<null-name>
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -8333,7 +8333,7 @@
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::A::@setter::f::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -8459,7 +8459,7 @@
#F25 _ (nameOffset:105) (firstTokenOffset:105) (offset:105)
element: <testLibrary>::@class::B::@setter::z::@formalParameter::_
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -8529,7 +8529,7 @@
type: int
returnType: void
variable: <testLibrary>::@class::A::@field::z
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F15
interfaces
@@ -8641,7 +8641,7 @@
#F12 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:63)
element: <testLibrary>::@class::B::@setter::x::@formalParameter::value
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -8671,7 +8671,7 @@
type: dynamic
returnType: void
variable: <testLibrary>::@class::A::@field::x
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
interfaces
@@ -8760,7 +8760,7 @@
#F12 _ (nameOffset:83) (firstTokenOffset:83) (offset:83)
element: <testLibrary>::@class::B::@setter::foo::@formalParameter::_
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -8917,7 +8917,7 @@
#F27 _ (nameOffset:108) (firstTokenOffset:108) (offset:108)
element: <testLibrary>::@class::B::@setter::z::@formalParameter::_
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
@@ -8999,7 +8999,7 @@
type: E
returnType: void
variable: <testLibrary>::@class::A::@field::z
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F16
typeParameters
@@ -9121,7 +9121,7 @@
#F12 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
element: <testLibrary>::@class::B::@setter::x::@formalParameter::value
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -9151,7 +9151,7 @@
type: dynamic
returnType: void
variable: <testLibrary>::@class::A::@field::x
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
interfaces
@@ -9239,7 +9239,7 @@
#F12 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
element: <testLibrary>::@class::B::@setter::x::@formalParameter::value
classes
- abstract class A
+ abstract hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -9269,7 +9269,7 @@
type: num
returnType: void
variable: <testLibrary>::@class::A::@field::x
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
interfaces
@@ -9413,7 +9413,7 @@
firstFragment: #F8
returnType: int
variable: <testLibrary>::@class::A::@field::z
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F9
interfaces
@@ -9596,7 +9596,7 @@
hasEnclosingTypeParameterReference: true
returnType: E
variable: <testLibrary>::@class::A::@field::z
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F10
typeParameters
@@ -10396,7 +10396,7 @@
type: String
returnType: void
variable: <testLibrary>::@class::B::@field::y
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F15
interfaces
@@ -10809,7 +10809,7 @@
type: int
returnType: void
variable: <testLibrary>::@class::B::@field::x
- class C
+ hasNonFinalField class C
reference: <testLibrary>::@class::C
firstFragment: #F10
interfaces
@@ -11234,7 +11234,7 @@
type: int
returnType: void
variable: <testLibrary>::@class::A::@field::z
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F12
interfaces
@@ -11798,7 +11798,7 @@
type: num
returnType: void
variable: <testLibrary>::@class::A::@field::x
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
interfaces
@@ -11994,7 +11994,7 @@
#F14 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
element: <testLibrary>::@class::A::@setter::t3::@formalParameter::value
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -13093,7 +13093,7 @@
#F10 a (nameOffset:50) (firstTokenOffset:50) (offset:50)
element: <testLibrary>::@class::B::@method::m::@formalParameter::a
classes
- class A
+ hasNonFinalField class A
reference: <testLibrary>::@class::A
firstFragment: #F1
fields
@@ -13123,7 +13123,7 @@
type: int
returnType: void
variable: <testLibrary>::@class::A::@field::m
- class B
+ hasNonFinalField class B
reference: <testLibrary>::@class::B
firstFragment: #F7
supertype: A