Version 2.18.0-117.0.dev

Merge commit 'a251cd9b1e79fa927f1280014be73a317cbad951' into 'dev'
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 7f8d2e5..23790f4 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -262,7 +262,7 @@
   var path = <Element>[];
 
   if (element is engine.PrefixElement) {
-    element = element.enclosingElement.definingCompilationUnit;
+    element = element.enclosingElement2.definingCompilationUnit;
   }
 
   var withNullability = element.library?.isNonNullableByDefault ?? false;
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 4462b02..4396c0f 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -3,6 +3,7 @@
 * Deprecated `ResourceProviderMixin.newFile2`, use `newFile` instead.
 * Deprecated `ResourceProviderMixin.newAnalysisOptionsYamlFile2`, use `newAnalysisOptionsYamlFile` instead.
 * Deprecated `DartType.resolveToBound`, use `TypeSystem.resolveToBound` instead.
+* Deprecated `LibraryElement.getImportsWithPrefix`, use `PrefixElement.imports` instead.
 
 ## 4.0.0
 * Removed deprecated `UriKind` and `Source.uriKind`.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 1ac9cdd..6ed4c00 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1397,6 +1397,7 @@
 
   /// Return a list containing all of the imports that share the given [prefix],
   /// or an empty array if there are no such imports.
+  @Deprecated('Use PrefixElement.imports instead')
   List<ImportElement> getImportsWithPrefix(PrefixElement prefix);
 
   /// Return the class defined in this library that has the given [name], or
@@ -1658,6 +1659,9 @@
   @experimental
   LibraryOrAugmentationElement get enclosingElement2;
 
+  /// Return the imports that share this prefix.
+  List<ImportElement> get imports;
+
   @override
   String get name;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index b7fddeb..4fc7f27 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -47,7 +47,7 @@
 class ExternalLibrary {
   final Uri uri;
 
-  ExternalLibrary(this.uri);
+  ExternalLibrary._(this.uri);
 }
 
 /// [FileContentOverlay] is used to temporary override content of files.
@@ -232,20 +232,9 @@
 
   LibraryCycle? get internal_libraryCycle => _libraryCycle;
 
-  /// Return `true` if the file is a stub created for a library in the provided
-  /// external summary store.
-  bool get isExternalLibrary {
-    return _fsState.externalSummaries != null &&
-        _fsState.externalSummaries!.hasLinkedLibrary(uriStr);
-  }
-
   /// Return `true` if the file does not have a `library` directive, and has a
   /// `part of` directive, so is probably a part.
   bool get isPart {
-    if (_fsState.externalSummaries != null &&
-        _fsState.externalSummaries!.hasUnlinkedUnit(uriStr)) {
-      return _fsState.externalSummaries!.isPartUnit(uriStr);
-    }
     return !_unlinked2!.hasLibraryDirective && _unlinked2!.hasPartOfDirective;
   }
 
@@ -872,10 +861,11 @@
   Either2<FileState?, ExternalLibrary> getFileForUri(Uri uri) {
     // If the external store has this URI, create a stub file for it.
     // We are given all required unlinked and linked summaries for it.
+    final externalSummaries = this.externalSummaries;
     if (externalSummaries != null) {
       String uriStr = uri.toString();
-      if (externalSummaries!.hasLinkedLibrary(uriStr)) {
-        return Either2.t2(ExternalLibrary(uri));
+      if (externalSummaries.hasLinkedLibrary(uriStr)) {
+        return Either2.t2(ExternalLibrary._(uri));
       }
     }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 524586d..cc15afe 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -8891,8 +8891,7 @@
   bool get isDeferred {
     Element? element = _prefix.staticElement;
     if (element is PrefixElement) {
-      List<ImportElement> imports =
-          element.enclosingElement.getImportsWithPrefix(element);
+      List<ImportElement> imports = element.imports;
       if (imports.length != 1) {
         return false;
       }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 94e99c7..370ca14 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4021,9 +4021,10 @@
     return null;
   }
 
+  @Deprecated('Use PrefixElement.imports instead')
   @override
-  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) {
-    return getImportsWithPrefixFromImports(prefixElement, imports);
+  List<ImportElement> getImportsWithPrefix(PrefixElement prefix) {
+    return prefix.imports;
   }
 
   @override
@@ -4119,18 +4120,6 @@
     return prefixes.toList(growable: false);
   }
 
-  static List<ImportElement> getImportsWithPrefixFromImports(
-      PrefixElement prefixElement, List<ImportElement> imports) {
-    int count = imports.length;
-    List<ImportElement> importList = <ImportElement>[];
-    for (int i = 0; i < count; i++) {
-      if (identical(imports[i].prefix, prefixElement)) {
-        importList.add(imports[i]);
-      }
-    }
-    return importList;
-  }
-
   static ClassElement? getTypeFromParts(
       String className,
       CompilationUnitElement definingCompilationUnit,
@@ -5104,13 +5093,21 @@
   @override
   String get displayName => name;
 
+  @Deprecated('Use enclosingElement2 instead')
   @override
   LibraryElement get enclosingElement =>
       super.enclosingElement as LibraryElement;
 
   @override
-  LibraryOrAugmentationElementImpl get enclosingElement2 =>
-      super.enclosingElement as LibraryOrAugmentationElementImpl;
+  LibraryOrAugmentationElement get enclosingElement2 =>
+      super.enclosingElement as LibraryOrAugmentationElement;
+
+  @override
+  List<ImportElement> get imports {
+    return enclosingElement2.imports
+        .where((import) => identical(import.prefix, this))
+        .toList();
+  }
 
   @override
   ElementKind get kind => ElementKind.PREFIX;
@@ -5121,7 +5118,7 @@
   }
 
   @override
-  Scope get scope => _scope ??= PrefixScope(enclosingElement, this);
+  Scope get scope => _scope ??= PrefixScope(enclosingElement2, this);
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitPrefixElement(this);
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index bf0f7e8..e8c8698 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -133,7 +133,7 @@
 }
 
 class PrefixScope implements Scope {
-  final LibraryElement _library;
+  final LibraryOrAugmentationElement _library;
   final Map<String, Element> _getters = {};
   final Map<String, Element> _setters = {};
   final Set<ExtensionElement> _extensions = {};
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 8fdaa1a..44f0869 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -654,7 +654,7 @@
     // Note: prefix?.bar is reported as an error in ElementResolver.
 
     if (name == FunctionElement.LOAD_LIBRARY_NAME) {
-      var imports = _definingLibrary.getImportsWithPrefix(prefix);
+      var imports = prefix.imports;
       if (imports.length == 1 && imports[0].isDeferred) {
         var importedLibrary = imports[0].importedLibrary;
         var element = importedLibrary?.loadLibraryFunction;
diff --git a/tools/VERSION b/tools/VERSION
index 5b795aa..21165ce 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 116
+PRERELEASE 117
 PRERELEASE_PATCH 0
\ No newline at end of file