Skip to content

Commit 37ac8e4

Browse files
scheglovCommit Queue
authored andcommitted
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 <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent dce956e commit 37ac8e4

15 files changed

+227
-167
lines changed

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

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -228,43 +228,6 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
228228
return constructors.any((c) => !c.isFactory && c.isConst);
229229
}
230230

231-
@override
232-
@trackedDirectlyExpensive
233-
bool get hasNonFinalField {
234-
globalResultRequirements?.record_classElement_hasNonFinalField(
235-
element: this,
236-
);
237-
238-
var classesToVisit = <InterfaceElementImpl>[];
239-
var visitedClasses = <InterfaceElementImpl>{};
240-
classesToVisit.add(this);
241-
while (classesToVisit.isNotEmpty) {
242-
var currentElement = classesToVisit.removeAt(0);
243-
if (visitedClasses.add(currentElement)) {
244-
// check fields
245-
for (var field in currentElement.fields) {
246-
if (!field.isFinal &&
247-
!field.isConst &&
248-
!field.isStatic &&
249-
!field.isSynthetic) {
250-
return true;
251-
}
252-
}
253-
// check mixins
254-
for (var mixinType in currentElement.mixins) {
255-
classesToVisit.add(mixinType.element);
256-
}
257-
// check super
258-
var supertype = currentElement.supertype;
259-
if (supertype != null) {
260-
classesToVisit.add(supertype.element);
261-
}
262-
}
263-
}
264-
// not found
265-
return false;
266-
}
267-
268231
@override
269232
@trackedIncludedInId
270233
bool get isAbstract {
@@ -4673,6 +4636,42 @@ abstract class InterfaceElementImpl extends InstanceElementImpl
46734636
];
46744637
}
46754638

4639+
@trackedDirectlyExpensive
4640+
bool get hasNonFinalField {
4641+
globalResultRequirements?.record_interfaceElement_hasNonFinalField(
4642+
element: this,
4643+
);
4644+
4645+
var classesToVisit = <InterfaceElementImpl>[];
4646+
var visitedClasses = <InterfaceElementImpl>{};
4647+
classesToVisit.add(this);
4648+
while (classesToVisit.isNotEmpty) {
4649+
var currentElement = classesToVisit.removeAt(0);
4650+
if (visitedClasses.add(currentElement)) {
4651+
// check fields
4652+
for (var field in currentElement.fields) {
4653+
if (!field.isFinal &&
4654+
!field.isConst &&
4655+
!field.isStatic &&
4656+
!field.isSynthetic) {
4657+
return true;
4658+
}
4659+
}
4660+
// check mixins
4661+
for (var mixinType in currentElement.mixins) {
4662+
classesToVisit.add(mixinType.element);
4663+
}
4664+
// check super
4665+
var supertype = currentElement.supertype;
4666+
if (supertype != null) {
4667+
classesToVisit.add(supertype.element);
4668+
}
4669+
}
4670+
}
4671+
// not found
4672+
return false;
4673+
}
4674+
46764675
InheritanceManager3 get inheritanceManager {
46774676
return library.session.inheritanceManager;
46784677
}

pkg/analyzer/lib/src/fine/requirements.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -799,12 +799,6 @@ class RequirementsManifest {
799799
// TODO(scheglov): implement.
800800
}
801801

802-
void record_classElement_hasNonFinalField({
803-
required ClassElementImpl element,
804-
}) {
805-
// TODO(scheglov): implement.
806-
}
807-
808802
void record_fieldElement_getter({
809803
required FieldElementImpl element,
810804
String? name,
@@ -1071,6 +1065,12 @@ class RequirementsManifest {
10711065
requirements.requestedConstructors[constructorName] = constructorId;
10721066
}
10731067

1068+
void record_interfaceElement_hasNonFinalField({
1069+
required InterfaceElementImpl element,
1070+
}) {
1071+
// TODO(scheglov): implement.
1072+
}
1073+
10741074
/// Record that all accessible extensions inside a [LibraryFragmentImpl]
10751075
/// are requested, which means dependency on all extensions exported
10761076
/// from [importedLibraries].

pkg/analyzer/test/src/summary/element_text.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,7 @@ class _Element2Writer extends _AbstractElementWriter {
987987
_sink.writeIf(e.isInterface, 'interface ');
988988
_sink.writeIf(e.isFinal, 'final ');
989989
_writeNotSimplyBounded(e);
990+
_sink.writeIf(e.hasNonFinalField, 'hasNonFinalField ');
990991
_sink.writeIf(e.isMixinClass, 'mixin ');
991992
_sink.write('class ');
992993
_sink.writeIf(e.isMixinApplication, 'alias ');
@@ -1009,6 +1010,7 @@ class _Element2Writer extends _AbstractElementWriter {
10091010
case MixinElementImpl():
10101011
_sink.writeIf(e.isBase, 'base ');
10111012
_writeNotSimplyBounded(e);
1013+
_sink.writeIf(e.hasNonFinalField, 'hasNonFinalField ');
10121014
_sink.write('mixin ');
10131015
}
10141016

0 commit comments

Comments
 (0)