Elements. Simplify FieldFragmentImpl creation.
Change-Id: Ic69ded5b9edf747b0bfcb5b90d093fbb85113b8d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/435721
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 765e37d..b899547 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -868,7 +868,6 @@
var holder = _EnclosingContext(
instanceElementBuilder: null,
fragment: fragment,
- constFieldsForFinalInstance: true,
);
_withEnclosing(holder, () {
node.typeParameters?.accept(this);
@@ -1011,7 +1010,6 @@
var holder = _EnclosingContext(
instanceElementBuilder: null,
fragment: fragment,
- constFieldsForFinalInstance: true,
);
// Build fields for all enum constants.
@@ -1279,24 +1277,6 @@
name2: _getFragmentName(nameToken),
nameOffset: nameOffset,
);
- if (variable.initializer case var initializer?) {
- if (node.fields.isConst) {
- fragment = FieldFragmentImpl(
- name2: _getFragmentName(nameToken),
- nameOffset: nameOffset,
- )..constantInitializer = initializer;
- } else if (_enclosingContext.constFieldsForFinalInstance) {
- if (node.fields.isFinal && !node.isStatic) {
- var constElement = FieldFragmentImpl(
- name2: _getFragmentName(nameToken),
- nameOffset: nameOffset,
- )..constantInitializer = initializer;
- fragment = constElement;
- _libraryBuilder.finalInstanceFields.add(constElement);
- }
- }
- }
-
fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
fragment.hasInitializer = variable.initializer != null;
fragment.isAbstract = node.abstractKeyword != null;
@@ -1311,6 +1291,15 @@
_setCodeRange(fragment, variable);
_setDocumentation(fragment, node);
+ if (variable.initializer case var initializer?) {
+ if (node.fields.isConst) {
+ fragment.constantInitializer = initializer;
+ } else if (node.fields.isFinal && !node.isStatic) {
+ fragment.constantInitializer = initializer;
+ _libraryBuilder.finalInstanceFields.add(fragment);
+ }
+ }
+
if (node.fields.type == null) {
fragment.hasImplicitType = true;
}
@@ -2213,10 +2202,6 @@
final List<TypeAliasFragmentImpl> _typeAliases = [];
final List<TypeParameterFragmentImpl> _typeParameters = [];
- /// A class can have `const` constructors, and if it has we need values
- /// of final instance fields.
- final bool constFieldsForFinalInstance;
-
/// Not all optional formal parameters can have default values.
/// For example, formal parameters of methods can, but formal parameters
/// of function types - not. This flag specifies if we should create
@@ -2226,7 +2211,6 @@
_EnclosingContext({
required this.instanceElementBuilder,
required this.fragment,
- this.constFieldsForFinalInstance = false,
this.hasDefaultFormalParameters = false,
});
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index b3a5e8b..95b59e3 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -27,7 +27,6 @@
import 'package:analyzer/src/util/performance/operation_performance.dart';
import 'package:analyzer/src/utilities/extensions/collection.dart';
import 'package:analyzer/src/utilities/extensions/element.dart';
-import 'package:analyzer/src/utilities/extensions/object.dart';
class DefiningLinkingUnit extends LinkingUnit {
DefiningLinkingUnit({required super.node, required super.element});
@@ -300,22 +299,23 @@
}
void replaceConstFieldsIfNoConstConstructor() {
- var withConstConstructors = Set<ClassFragmentImpl>.identity();
- for (var classFragment in element.topLevelElements) {
- if (classFragment is! ClassFragmentImpl) continue;
- if (classFragment.isMixinApplication) continue;
- if (classFragment.isAugmentation) continue;
- var hasConst = classFragment.element.constructors.any((e) => e.isConst);
- if (hasConst) {
- withConstConstructors.add(classFragment);
+ var hasConstConstructorCache = <InterfaceElement, bool>{};
+
+ bool hasConstConstructor(Element element) {
+ if (element is InterfaceElement) {
+ var result = hasConstConstructorCache[element];
+ if (result == null) {
+ result = element.constructors.any((e) => e.isConst);
+ hasConstConstructorCache[element] = result;
+ }
+ return result;
}
+ return false;
}
for (var fieldFragment in finalInstanceFields) {
- var enclosing = fieldFragment.enclosingElement3;
- var element = enclosing.ifTypeOrNull<ClassFragmentImpl>()?.element;
- if (element == null) continue;
- if (!withConstConstructors.contains(element.firstFragment)) {
+ var enclosingElement = fieldFragment.enclosingFragment.element;
+ if (!hasConstConstructor(enclosingElement)) {
fieldFragment.constantInitializer = null;
}
}