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;
       }
     }