Parts. Move changes to prepare for removing deprecated 'enclosingElement'.

Change-Id: I79804b8907627e54d993a905c62ffc36e6d348b9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/384963
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index e575e3fe..4f7423e 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -291,7 +291,7 @@
   var path = <Element>[];
 
   if (element is engine.PrefixElement) {
-    element = element.enclosingElement.definingCompilationUnit;
+    element = element.enclosingElement3;
   }
 
   for (var e in element.withAncestors) {
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 40bc01b..292da89 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -2316,6 +2316,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class PrefixElement implements _ExistingElement {
   /// The library, or library augmentation that encloses this element.
+  @Deprecated('Use enclosingElement3 instead')
   @override
   LibraryOrAugmentationElement get enclosingElement;
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index f0ccc82..32233ed 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1060,7 +1060,7 @@
   }
 
   @override
-  AnalysisSession get session => enclosingElement.session;
+  AnalysisSession get session => library.session;
 
   @override
   List<SetterFragment> get setters => accessors
@@ -1455,7 +1455,7 @@
 
   @override
   Element2? get enclosingElement2 =>
-      (firstFragment._enclosingElement as InstanceFragment).element;
+      (firstFragment._enclosingElement3 as InstanceFragment).element;
 
   @override
   bool get isConst => firstFragment.isConst;
@@ -2266,7 +2266,7 @@
 
   @override
   AnalysisContext get context {
-    return _enclosingElement!.context;
+    return library!.context;
   }
 
   @override
@@ -2294,7 +2294,7 @@
 
   @override
   Element2? get enclosingElement2 {
-    var candidate = _enclosingElement;
+    var candidate = _enclosingElement3;
     if (candidate is CompilationUnitElementImpl ||
         candidate is AugmentableElement) {
       throw UnsupportedError('Cannot get an enclosingElement2 for a fragment');
@@ -2313,7 +2313,7 @@
   /// Return the enclosing unit element (which might be the same as `this`), or
   /// `null` if this element is not contained in any compilation unit.
   CompilationUnitElementImpl get enclosingUnit {
-    return _enclosingElement!.enclosingUnit;
+    return _enclosingElement3!.enclosingUnit;
   }
 
   @override
@@ -2922,6 +2922,13 @@
 
   @override
   E? thisOrAncestorOfType2<E extends Element2>() {
+    if (E == LibraryElement2 || E == LibraryElementImpl) {
+      if (enclosingElement3 case LibraryElementImpl library) {
+        return library as E;
+      }
+      return thisOrAncestorOfType<CompilationUnitElementImpl>()?.library as E?;
+    }
+
     Element2 element = this;
     while (element is! E) {
       var ancestor = element.enclosingElement2;
@@ -3798,7 +3805,7 @@
 
   @override
   Element2? get enclosingElement2 =>
-      (firstFragment._enclosingElement as InstanceFragment).element;
+      (firstFragment._enclosingElement3 as InstanceFragment).element;
 
   @override
   GetterElement? get getter => firstFragment.getter?.element as GetterElement?;
@@ -3926,7 +3933,7 @@
 
   @override
   Element2? get enclosingElement2 =>
-      (firstFragment._enclosingElement as Fragment).element;
+      (firstFragment._enclosingElement3 as Fragment).element;
 
   @override
   // TODO(augmentations): Implement the merge of formal parameters.
@@ -7264,7 +7271,7 @@
 
   @override
   Element2? get enclosingElement2 =>
-      (firstFragment._enclosingElement as InstanceFragment).element;
+      (firstFragment._enclosingElement3 as InstanceFragment).element;
 
   @override
   bool get isOperator => firstFragment.isOperator;
@@ -9084,7 +9091,7 @@
   TopLevelFunctionElement get baseElement => this;
 
   @override
-  Element2? get enclosingElement2 => firstFragment._enclosingElement?.library2;
+  Element2? get enclosingElement2 => firstFragment._enclosingElement3?.library2;
 
   @override
   bool get isDartCoreIdentical => firstFragment.isDartCoreIdentical;
@@ -9744,7 +9751,7 @@
 
   @override
   Element2? get enclosingElement2 =>
-      (firstFragment._enclosingElement as Fragment).element;
+      (firstFragment._enclosingElement3 as Fragment).element;
 
   @override
   ElementKind get kind => ElementKind.TYPE_PARAMETER;
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index a73a9b6..5ae5c94 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -125,6 +125,7 @@
     constructor.isConst = isConst;
     constructor.parameters = _requiredParameters(argumentTypes);
     constructor.enclosingElement = definingClass;
+    constructor.enclosingElement3 = definingClass;
     if (!constructor.isSynthetic) {
       constructor.constantInitializers = <ConstructorInitializer>[];
     }
@@ -228,6 +229,7 @@
       List<ParameterElement> parameters) {
     MethodElementImpl method = MethodElementImpl(methodName, 0);
     method.enclosingElement = enclosingElement;
+    method.enclosingElement3 = enclosingElement;
     method.parameters = parameters;
     method.returnType = returnType;
     return method;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 420deb8..f92c38b 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1296,7 +1296,7 @@
     for (var import in containerUnit.libraryImports_unresolved) {
       var prefixElement = import.prefix?.element;
       if (prefixElement is PrefixElementImpl) {
-        prefixElement.enclosingElement = containerLibrary;
+        prefixElement.enclosingElement = containerUnit;
         prefixElement.enclosingElement3 = containerUnit;
       }
     }
@@ -1564,6 +1564,7 @@
         } else {
           property = TopLevelVariableElementImpl(name, -1)
             ..enclosingElement = enclosingElement
+            ..enclosingElement3 = enclosingElement
             ..reference = reference
             ..isSynthetic = true;
           reference.element ??= property;
@@ -1575,6 +1576,7 @@
         } else {
           property = FieldElementImpl(name, -1)
             ..enclosingElement = enclosingElement
+            ..enclosingElement3 = enclosingElement
             ..reference = reference
             ..isStatic = accessor.isStatic
             ..isSynthetic = true;
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 6843c2d..91a07da 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -92,11 +92,9 @@
     var unitReader = SummaryDataReader(unitInfoBytes);
     var unitInfo = _InfoUnit(_infoDeclarationStore, unitReader);
 
-    var enclosing = unitElement.enclosingElement;
-    if (enclosing is LibraryElementImpl) {
-      if (identical(enclosing.definingCompilationUnit, unitElement)) {
-        _applyToLibrary(enclosing, unitInfo);
-      }
+    var libraryElement = unitElement.library;
+    if (identical(libraryElement.definingCompilationUnit, unitElement)) {
+      _applyToLibrary(libraryElement, unitInfo);
     }
 
     unitElement.setCodeRange(unitInfo.codeOffset, unitInfo.codeLength);
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index e7dde2f..502ca30 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -22,7 +22,7 @@
     this._linker,
     this._unitElement,
     this._libraryBuilder,
-  ) : _containerScope = _unitElement.enclosingElement.scope {
+  ) : _containerScope = _unitElement.scope {
     _scope = _containerScope;
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index acfb791..184fc4f 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -43,7 +43,7 @@
         unit.extensionTypes.forEach(_resolveInterfaceFields);
         unit.mixins.forEach(_resolveInterfaceFields);
 
-        _scope = unit.enclosingElement.scope;
+        _scope = unit.scope;
         unit.topLevelVariables.forEach(_resolveVariable);
       }
     }
@@ -140,7 +140,7 @@
         unit.extensionTypes.forEach(_addClassElementFields);
         unit.mixins.forEach(_addClassElementFields);
 
-        _scope = unit.enclosingElement.scope;
+        _scope = unit.scope;
         unit.topLevelVariables.forEach(_addVariableNode);
       }
     }
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index d03cba2..a704a7a 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -136,7 +136,6 @@
     element.isAbstract = isAbstract;
     element.isAugmentation = isAugmentation;
     element.isSealed = isSealed;
-    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.enclosingElement3 = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.supertype = superType ?? typeProvider.objectType;
@@ -169,7 +168,6 @@
     required List<ConstFieldElementImpl> constants,
   }) {
     var element = EnumElementImpl(name, 0);
-    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.enclosingElement3 = testLibrary.definingCompilationUnit;
     element.fields = constants;
     return element;
@@ -191,7 +189,6 @@
     var element = ExtensionElementImpl(name, 0);
     element.augmented.extendedType = extendedType;
     element.isAugmentation = isAugmentation;
-    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.enclosingElement3 = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.methods = methods;
@@ -206,7 +203,6 @@
     List<InterfaceType> interfaces = const [],
   }) {
     var element = ExtensionTypeElementImpl(name, -1);
-    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.enclosingElement3 = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.interfaces = interfaces;
@@ -417,7 +413,6 @@
   }) {
     var element = MixinElementImpl(name, 0);
     element.isAugmentation = isAugmentation;
-    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.enclosingElement3 = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.superclassConstraints = constraints ?? [typeProvider.objectType];
@@ -571,7 +566,6 @@
     required DartType aliasedType,
   }) {
     var element = TypeAliasElementImpl(name, 0);
-    element.enclosingElement = testLibrary.definingCompilationUnit;
     element.enclosingElement3 = testLibrary.definingCompilationUnit;
     element.typeParameters = typeParameters;
     element.aliasedType = aliasedType;
diff --git a/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart b/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
index dafde51..7baeadd 100644
--- a/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
@@ -667,18 +667,10 @@
       DartType implementsTypeArgument,
       String expectedConstraint,
     ) {
-      var library = library_(
-        uriStr: 'package:test/test.dart',
-        analysisContext: analysisContext,
-        analysisSession: analysisContext.analysisSession,
-        typeSystem: typeSystem,
-      );
-
       // class A<T> {}
       var A = class_(name: 'A', typeParameters: [
         typeParameter('T'),
       ]);
-      A.enclosingElement = library.definingCompilationUnit;
 
       // class B<T> extends A<T> {}
       var B_T = typeParameter('T');
@@ -688,7 +680,6 @@
         typeParameters: [B_T],
         superType: interfaceTypeNone(A, typeArguments: [B_T_none]),
       );
-      B.enclosingElement = library.definingCompilationUnit;
 
       // class Cx extends A<> implements B<> {}
       var C = class_(
@@ -704,7 +695,6 @@
           )
         ],
       );
-      C.enclosingElement = library.definingCompilationUnit;
 
       _checkMatch(
         [T],
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 6fda2ee..2f573c9 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -4356,7 +4356,7 @@
   topLevelVariables
     const x
       reference: <none>
-      type: InvalidType
+      type: int
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@topLevelVariable::x
       getter: <none>
   getters
@@ -4401,7 +4401,7 @@
   topLevelVariables
     const x
       reference: <none>
-      type: InvalidType
+      type: int
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@topLevelVariable::x
       getter: <none>
   getters
@@ -4452,12 +4452,12 @@
   topLevelVariables
     const x
       reference: <none>
-      type: InvalidType
+      type: int
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@topLevelVariable::x
       getter: <none>
     const y
       reference: <none>
-      type: InvalidType
+      type: int
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@topLevelVariable::y
       getter: <none>
   getters
@@ -4504,7 +4504,7 @@
   topLevelVariables
     const x
       reference: <none>
-      type: InvalidType
+      type: Type
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@topLevelVariable::x
       getter: <none>
   getters
@@ -4965,7 +4965,7 @@
           name: PrefixedIdentifier
             prefix: SimpleIdentifier
               token: prefix0 @78
-              staticElement: <null>
+              staticElement: <testLibrary>::@fragment::package:test/test.macro.dart::@prefix::prefix0
               staticType: null
             period: . @85
             identifier: SimpleIdentifier
@@ -4977,7 +4977,7 @@
           arguments: ArgumentList
             leftParenthesis: ( @87
             rightParenthesis: ) @88
-          element: package:test/a.dart::<fragment>::@class::A
+          element: package:test/a.dart::<fragment>::@class::A::@constructor::new
       returnType: void
 ''');
   }
@@ -5074,7 +5074,7 @@
           name: PrefixedIdentifier
             prefix: SimpleIdentifier
               token: prefix0 @78
-              staticElement: <null>
+              staticElement: <testLibrary>::@fragment::package:test/test.macro.dart::@prefix::prefix0
               staticType: null
             period: . @85
             identifier: SimpleIdentifier
@@ -5086,7 +5086,7 @@
           arguments: ArgumentList
             leftParenthesis: ( @87
             rightParenthesis: ) @88
-          element: package:test/a.dart::<fragment>::@class::A
+          element: package:test/a.dart::<fragment>::@class::A::@constructor::new
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@accessor::foo
 ''');
   }
@@ -5141,7 +5141,7 @@
           name: PrefixedIdentifier
             prefix: SimpleIdentifier
               token: prefix0 @78
-              staticElement: <null>
+              staticElement: <testLibrary>::@fragment::package:test/test.macro.dart::@prefix::prefix0
               staticType: null
             period: . @85
             identifier: SimpleIdentifier
@@ -5153,7 +5153,7 @@
           arguments: ArgumentList
             leftParenthesis: ( @87
             rightParenthesis: ) @88
-          element: package:test/a.dart::<fragment>::@class::A
+          element: package:test/a.dart::<fragment>::@class::A::@constructor::new
       parameters
         requiredPositional _
           reference: <none>
@@ -5212,16 +5212,16 @@
               name: PrefixedIdentifier
                 prefix: SimpleIdentifier
                   token: prefix0 @86
-                  staticElement: <null>
+                  staticElement: <testLibrary>::@fragment::package:test/test.macro.dart::@prefix::prefix0
                   staticType: null
                 period: . @93
                 identifier: SimpleIdentifier
                   token: a @94
-                  staticElement: <null>
+                  staticElement: package:test/a.dart::<fragment>::@getter::a
                   staticType: null
-                staticElement: <null>
+                staticElement: package:test/a.dart::<fragment>::@getter::a
                 staticType: null
-              element: <null>
+              element: package:test/a.dart::<fragment>::@getter::a
       firstFragment: <testLibrary>::@fragment::package:test/test.macro.dart::@accessor::foo
 ''');
   }