Version 2.14.0-10.0.dev

Merge commit 'db2aceaa427c7f98686ac16da8e24123e023b737' into 'dev'
diff --git a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
index 2468615..e94f0f5 100644
--- a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
@@ -224,8 +224,8 @@
           continue;
           break;
         case SourceKind.LIBRARY:
-          var result = await driver.getResolvedLibrary(path);
-          if (result != null) {
+          var result = await driver.getResolvedLibrary2(path);
+          if (result is ResolvedLibraryResult) {
             for (var unit in result.units) {
               if (pathsToProcess.contains(unit.path) &&
                   !pathsProcessed.contains(unit.path)) {
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 65467c5..bf43bf5 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -176,8 +176,10 @@
         if (kind != SourceKind.LIBRARY) {
           continue;
         }
-        var library = await context.currentSession.getResolvedLibrary(path);
-        await _fixErrorsInLibrary(library);
+        var library = await context.currentSession.getResolvedLibrary2(path);
+        if (library is ResolvedLibraryResult) {
+          await _fixErrorsInLibrary(library);
+        }
       }
     }
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 397af5c..b8535bd 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -85,7 +85,10 @@
     if (element == libraryElement.definingCompilationUnit) {
       // Handle part-of directives in this library
       var libraryResult = await driver.currentSession
-          .getResolvedLibraryByElement(libraryElement);
+          .getResolvedLibraryByElement2(libraryElement);
+      if (libraryResult is! ResolvedLibraryResult) {
+        return changeBuilder.sourceChange;
+      }
       var definingUnitResult = libraryResult.units!.first;
       for (var result in libraryResult.units!) {
         if (result.isPart) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index e845848..60665b9 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -5,6 +5,8 @@
 // @dart = 2.9
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -35,7 +37,7 @@
 
     var testFile = convertPath('/home/test/lib/test.dart');
     addSource(testFile, '');
-    var result = await session.getResolvedLibrary(testFile);
+    var result = await session.getResolvedLibraryValid(testFile);
     var sets = manager.forLibrary(result.element);
     expect(sets, hasLength(2));
   }
@@ -46,7 +48,7 @@
     addSource('/home/test/pubspec.yaml', '');
     var testFile = convertPath('/home/test/lib/test.dart');
     addSource(testFile, '');
-    var result = await session.getResolvedLibrary(testFile);
+    var result = await session.getResolvedLibraryValid(testFile);
     var sets = manager.forLibrary(result.element);
     expect(sets, hasLength(0));
   }
@@ -67,3 +69,9 @@
 ''');
   }
 }
+
+extension on AnalysisSession {
+  Future<ResolvedLibraryResult> getResolvedLibraryValid(String path) async {
+    return await getResolvedLibrary2(path) as ResolvedLibraryResult;
+  }
+}
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index aed9fad..bfe3d95 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -3,6 +3,10 @@
   Use `AnalysisSession.getUnitElement2()` instead.
 * Deprecated `AnalysisSession.getResolvedUnit()`.
   Use `AnalysisSession.getResolvedUnit2()` instead.
+* Deprecated `AnalysisSession.getResolvedLibrary()`.
+  Use `AnalysisSession.getResolvedLibrary2()` instead.
+* Deprecated `AnalysisSession.getResolvedLibraryByElement()`.
+  Use `AnalysisSession.getResolvedLibraryByElement2()` instead.
 
 ## 1.4.0
 * Deprecated `TypeProvider.nonSubtypableClasses`.
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index ca07131..3c6107a 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -42,6 +42,12 @@
   List<AnalysisError> get errors;
 }
 
+/// The type of [InvalidResult] returned when the given URI cannot be resolved.
+///
+/// Clients may not extend, implement or mix-in this class.
+class CannotResolveUriResult
+    implements InvalidResult, SomeResolvedLibraryResult {}
+
 /// The declaration of an [Element].
 abstract class ElementDeclarationResult {
   /// The [Element] that this object describes.
@@ -86,13 +92,31 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class InvalidPathResult
-    implements InvalidResult, SomeResolvedUnitResult, SomeUnitElementResult {}
+    implements
+        InvalidResult,
+        SomeResolvedLibraryResult,
+        SomeResolvedUnitResult,
+        SomeUnitElementResult {}
 
 /// The base class for any invalid result.
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class InvalidResult {}
 
+/// The type of [InvalidResult] returned when the given element was not
+/// created by the requested session.
+///
+/// Clients may not extend, implement or mix-in this class.
+class NotElementOfThisSessionResult
+    implements InvalidResult, SomeResolvedLibraryResult {}
+
+/// The type of [InvalidResult] returned when the given file is not a library,
+/// but a part of a library.
+///
+/// Clients may not extend, implement or mix-in this class.
+class NotLibraryButPartResult
+    implements InvalidResult, SomeResolvedLibraryResult {}
+
 /// The type of [InvalidResult] returned when the given file path does not
 /// represent the corresponding URI.
 ///
@@ -102,7 +126,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class NotPathOfUriResult
-    implements InvalidResult, SomeResolvedUnitResult, SomeUnitElementResult {}
+    implements
+        InvalidResult,
+        SomeResolvedLibraryResult,
+        SomeResolvedUnitResult,
+        SomeUnitElementResult {}
 
 /// The result of building parsed AST(s) for the whole library.
 ///
@@ -155,7 +183,8 @@
 /// The result of building resolved AST(s) for the whole library.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ResolvedLibraryResult implements AnalysisResult {
+abstract class ResolvedLibraryResult
+    implements SomeResolvedLibraryResult, AnalysisResult {
   /// The element representing this library.
   LibraryElement? get element;
 
@@ -219,6 +248,14 @@
   VALID
 }
 
+/// The result of building resolved AST(s) for the whole library.
+///
+/// Clients may not extend, implement or mix-in this class.
+///
+/// There are existing implementations of this class.
+/// [ResolvedLibraryResult] represents a valid result.
+abstract class SomeResolvedLibraryResult {}
+
 /// The result of building a resolved AST for a single file. The errors returned
 /// include both syntactic and semantic errors.
 ///
@@ -255,3 +292,10 @@
   /// to need to be re-analyzed.
   String get signature;
 }
+
+/// The type of [InvalidResult] returned when the given URI corresponds to
+/// a library that is served from an external summary bundle.
+///
+/// Clients may not extend, implement or mix-in this class.
+class UriOfExternalLibraryResult
+    implements InvalidResult, SomeResolvedLibraryResult {}
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index ff10b22..b0f0f77 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -69,16 +69,30 @@
   ///
   /// Throw [ArgumentError] if the given [path] is not the defining compilation
   /// unit for a library (that is, is a part of a library).
+  @Deprecated('Use getResolvedLibrary2() instead')
   Future<ResolvedLibraryResult> getResolvedLibrary(String path);
 
   /// Return a future that will complete with information about the results of
+  /// resolving all of the files in the library with the given absolute,
+  /// normalized [path].
+  Future<SomeResolvedLibraryResult> getResolvedLibrary2(String path);
+
+  /// Return a future that will complete with information about the results of
   /// resolving all of the files in the library with the library [element].
   ///
   /// Throw [ArgumentError] if the [element] was not produced by this session.
+  @Deprecated('Use getResolvedLibraryByElement2() instead')
   Future<ResolvedLibraryResult> getResolvedLibraryByElement(
       LibraryElement element);
 
   /// Return a future that will complete with information about the results of
+  /// resolving all of the files in the library with the library [element].
+  ///
+  /// Throw [ArgumentError] if the [element] was not produced by this session.
+  Future<SomeResolvedLibraryResult> getResolvedLibraryByElement2(
+      LibraryElement element);
+
+  /// Return a future that will complete with information about the results of
   /// resolving the file with the given absolute, normalized [path].
   @Deprecated('Use getResolvedUnit2() instead')
   Future<ResolvedUnitResult> getResolvedUnit(String path);
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index ca35727..83112cd 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -155,7 +155,7 @@
   final _requestedFiles = <String, List<Completer<ResolvedUnitResult>>>{};
 
   /// The mapping from the files for which analysis was requested using
-  /// [getResolvedLibrary] to the [Completer]s to report the result.
+  /// [getResolvedLibrary2] to the [Completer]s to report the result.
   final _requestedLibraries =
       <String, List<Completer<ResolvedLibraryResult>>>{};
 
@@ -713,22 +713,56 @@
   /// state (including new states of the files previously reported using
   /// [changeFile]), prior to the next time the analysis state transitions
   /// to "idle".
-  Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
+  @Deprecated('Use getResolvedLibrary2() instead')
+  Future<ResolvedLibraryResult> getResolvedLibrary(String path) async {
     _throwIfNotAbsolutePath(path);
+
+    var result = await getResolvedLibrary2(path);
+
+    if (result is NotPathOfUriResult) {
+      return Future.value(); // bug?
+    }
+
+    if (result is NotLibraryButPartResult) {
+      throw ArgumentError('Is a part: $path');
+    }
+
+    return result as ResolvedLibraryResult;
+  }
+
+  /// Return a [Future] that completes with a [ResolvedLibraryResult] for the
+  /// Dart library file with the given [path].  If the file cannot be analyzed,
+  /// the [Future] completes with an [InvalidResult].
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// Invocation of this method causes the analysis state to transition to
+  /// "analyzing" (if it is not in that state already), the driver will produce
+  /// the resolution result for it, which is consistent with the current file
+  /// state (including new states of the files previously reported using
+  /// [changeFile]), prior to the next time the analysis state transitions
+  /// to "idle".
+  Future<SomeResolvedLibraryResult> getResolvedLibrary2(String path) {
+    if (!_isAbsolutePath(path)) {
+      return Future.value(
+        InvalidPathResult(),
+      );
+    }
+
     if (!_fsState.hasUri(path)) {
-      return Future.value();
+      return Future.value(
+        NotPathOfUriResult(),
+      );
     }
 
     FileState file = _fsState.getFileForPath(path);
 
-    if (file.isExternalLibrary) {
-      return Future.value(
-        ResolvedLibraryResultImpl.external(currentSession, file.uri),
-      );
-    }
-
     if (file.isPart) {
-      throw ArgumentError('Is a part: $path');
+      return Future.value(
+        NotLibraryButPartResult(),
+      );
     }
 
     // Schedule analysis.
@@ -752,6 +786,7 @@
   /// state (including new states of the files previously reported using
   /// [changeFile]), prior to the next time the analysis state transitions
   /// to "idle".
+  @Deprecated('Use getResolvedLibraryByUri2() instead')
   Future<ResolvedLibraryResult> getResolvedLibraryByUri(Uri uri) {
     var fileOr = _fsState.getFileForUri(uri);
     return fileOr.map(
@@ -770,6 +805,34 @@
     );
   }
 
+  /// Return a [Future] that completes with a [ResolvedLibraryResult] for the
+  /// Dart library file with the given [uri].  If the file cannot be analyzed,
+  /// the [Future] completes with an [InvalidResult].
+  ///
+  /// Invocation of this method causes the analysis state to transition to
+  /// "analyzing" (if it is not in that state already), the driver will produce
+  /// the resolution result for it, which is consistent with the current file
+  /// state (including new states of the files previously reported using
+  /// [changeFile]), prior to the next time the analysis state transitions
+  /// to "idle".
+  Future<SomeResolvedLibraryResult> getResolvedLibraryByUri2(Uri uri) {
+    var fileOr = _fsState.getFileForUri(uri);
+    return fileOr.map(
+      (file) async {
+        if (file == null) {
+          return CannotResolveUriResult();
+        }
+        if (file.isPart) {
+          return NotLibraryButPartResult();
+        }
+        return getResolvedLibrary2(file.path);
+      },
+      (externalLibrary) async {
+        return UriOfExternalLibraryResult();
+      },
+    );
+  }
+
   ApiSignature getResolvedUnitKeyByPath(String path) {
     _throwIfNotAbsolutePath(path);
     ApiSignature signature = getUnitKeyByPath(path);
@@ -808,7 +871,8 @@
   }
 
   /// Return a [Future] that completes with a [SomeResolvedUnitResult] for the
-  /// Dart file with the given [path].
+  /// Dart file with the given [path].  If the file cannot be analyzed,
+  /// the [Future] completes with an [InvalidResult].
   ///
   /// The [path] must be absolute and normalized.
   ///
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 7401cb1..d8e7821 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -63,7 +63,7 @@
     required DeclaredVariables declaredVariables,
     required SourceFactory sourceFactory,
     required this.externalSummaries,
-  })   : logger = logger,
+  })  : logger = logger,
         byteStore = byteStore,
         analysisSession = session {
     var synchronousSession =
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 9af60f9..1d7915d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -100,6 +100,7 @@
     return _driver.parseFileSync(path);
   }
 
+  @Deprecated('Use getResolvedLibrary2() instead')
   @override
   Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
     _checkConsistency();
@@ -107,6 +108,13 @@
   }
 
   @override
+  Future<SomeResolvedLibraryResult> getResolvedLibrary2(String path) {
+    _checkConsistency();
+    return _driver.getResolvedLibrary2(path);
+  }
+
+  @Deprecated('Use getResolvedLibraryByElement2() instead')
+  @override
   Future<ResolvedLibraryResult> getResolvedLibraryByElement(
       LibraryElement element) {
     _checkConsistency();
@@ -114,6 +122,21 @@
     return _driver.getResolvedLibraryByUri(element.source.uri);
   }
 
+  @override
+  Future<SomeResolvedLibraryResult> getResolvedLibraryByElement2(
+    LibraryElement element,
+  ) {
+    _checkConsistency();
+
+    if (element.session != this) {
+      return Future.value(
+        NotElementOfThisSessionResult(),
+      );
+    }
+
+    return _driver.getResolvedLibraryByUri2(element.source.uri);
+  }
+
   @Deprecated('Use getResolvedUnit2() instead')
   @override
   Future<ResolvedUnitResult> getResolvedUnit(String path) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index 235e67d..dbaaefd 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -36,22 +36,17 @@
   Future<ElementDeclarationResult?> getElementDeclaration(
       Element element) async {
     var libraryPath = element.library!.source.fullName;
-
-    // This should not happen in valid code, but sometimes we treat a file
-    // with a `part of` directive as a library, because there is no library
-    // that contains this part, or because it is imported as a library.
-    if (isPart(libraryPath)) {
-      return null;
-    }
-
     var resolvedLibrary = await _getResolvedLibrary(libraryPath);
-    return resolvedLibrary.getElementDeclaration(element);
+    return resolvedLibrary?.getElementDeclaration(element);
   }
 
   /// Return the resolved unit that declares the given [element].
   Future<ResolvedUnitResult?> getResolvedUnitByElement(Element element) async {
     var libraryPath = element.library!.source.fullName;
     var resolvedLibrary = await _getResolvedLibrary(libraryPath);
+    if (resolvedLibrary == null) {
+      return null;
+    }
 
     var unitPath = element.source!.fullName;
     return resolvedLibrary.units!.singleWhere((resolvedUnit) {
@@ -79,11 +74,13 @@
   }
 
   /// Return a newly resolved, or cached library with the given [path].
-  Future<ResolvedLibraryResult> _getResolvedLibrary(String path) async {
+  Future<ResolvedLibraryResult?> _getResolvedLibrary(String path) async {
     var result = _resolvedLibraries[path];
     if (result == null) {
-      result = await session.getResolvedLibrary(path);
-      _resolvedLibraries[path] = result;
+      var some = await session.getResolvedLibrary2(path);
+      if (some is ResolvedLibraryResult) {
+        result = _resolvedLibraries[path] = some;
+      }
     }
     return result;
   }
diff --git a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
index df022bf..a49f404 100644
--- a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
@@ -203,7 +203,7 @@
   }
 
   @override
-  Future<ResolvedLibraryResult> getResolvedLibrary(String path) async {
+  Future<SomeResolvedLibraryResult> getResolvedLibrary2(String path) async {
     return analysisContext.fileResolver.resolveLibrary(path: path);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
index 3eec88f..6570844 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/analysis/dependency/library_builder.dart';
 import 'package:analyzer/src/dart/analysis/dependency/node.dart';
@@ -137,7 +138,8 @@
 
   Future<List<CompilationUnit>> _resolveLibrary(String libraryPath) async {
     var session = contextFor(libraryPath).currentSession;
-    var resolvedLibrary = await session.getResolvedLibrary(libraryPath);
+    var resolvedLibrary = await session.getResolvedLibrary2(libraryPath);
+    resolvedLibrary as ResolvedLibraryResult;
     return resolvedLibrary.units!.map((ru) => ru.unit!).toList();
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index fd84578..c1dac7b 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1122,21 +1122,16 @@
     expect(allExceptions, isEmpty);
     expect(allResults, isEmpty);
 
-    var result = await driver.getResult(templatePath);
-    expect(result.state, ResultState.NOT_FILE_OF_URI);
-    expect(allExceptions, isEmpty);
-    expect(allResults, isEmpty);
-
     {
-      var elementResult = await driver.getUnitElement(templatePath);
-      expect(elementResult.state, ResultState.NOT_FILE_OF_URI);
+      var result = await driver.getResult(templatePath);
+      expect(result.state, ResultState.NOT_FILE_OF_URI);
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
     }
 
     {
-      var elementResult = await driver.getUnitElement2(templatePath);
-      expect(elementResult, isA<NotPathOfUriResult>());
+      var result = await driver.getUnitElement(templatePath);
+      expect(result.state, ResultState.NOT_FILE_OF_URI);
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
     }
@@ -1183,22 +1178,23 @@
     expect(allExceptions, isEmpty);
     expect(allResults, isEmpty);
 
-    var result = await driver.getResult2(templatePath);
-    expect(result, isA<NotPathOfUriResult>());
-    expect(allExceptions, isEmpty);
-    expect(allResults, isEmpty);
-
     {
-      // ignore: deprecated_member_use_from_same_package
-      var elementResult = await driver.getUnitElement(templatePath);
-      expect(elementResult.state, ResultState.NOT_FILE_OF_URI);
+      var result = await driver.getResolvedLibrary2(templatePath);
+      expect(result, isA<NotPathOfUriResult>());
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
     }
 
     {
-      var elementResult = await driver.getUnitElement2(templatePath);
-      expect(elementResult, isA<NotPathOfUriResult>());
+      var result = await driver.getResult2(templatePath);
+      expect(result, isA<NotPathOfUriResult>());
+      expect(allExceptions, isEmpty);
+      expect(allResults, isEmpty);
+    }
+
+    {
+      var result = await driver.getUnitElement2(templatePath);
+      expect(result, isA<NotPathOfUriResult>());
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
     }
@@ -1462,6 +1458,58 @@
     }, throwsArgumentError);
   }
 
+  test_getResolvedLibrary2() async {
+    var content = 'class A {}';
+    addTestFile(content);
+    var result = await driver.getResolvedLibrary2(testFile);
+    result as ResolvedLibraryResult;
+    expect(result.units, hasLength(1));
+    expect(result.units![0].path, testFile);
+    expect(result.units![0].content, content);
+    expect(result.units![0].unit!, isNotNull);
+    expect(result.units![0].errors, isEmpty);
+  }
+
+  test_getResolvedLibrary2_invalidPath_notAbsolute() async {
+    var result = await driver.getResolvedLibrary2('not_absolute.dart');
+    expect(result, isA<InvalidPathResult>());
+  }
+
+  test_getResolvedLibrary2_notLibraryButPart() async {
+    addTestFile('part of my;');
+    var result = await driver.getResolvedLibrary2(testFile);
+    expect(result, isA<NotLibraryButPartResult>());
+  }
+
+  test_getResolvedLibraryByUri2() async {
+    var content = 'class A {}';
+    addTestFile(content);
+
+    var uri = Uri.parse('package:test/test.dart');
+    var result = await driver.getResolvedLibraryByUri2(uri);
+    result as ResolvedLibraryResult;
+    expect(result.uri, uri);
+    expect(result.element!.source.fullName, testFile);
+    expect(result.units, hasLength(1));
+    expect(result.units![0].uri, uri);
+    expect(result.units![0].path, testFile);
+    expect(result.units![0].content, content);
+  }
+
+  test_getResolvedLibraryByUri2_notLibrary() async {
+    addTestFile('part of my;');
+
+    var uri = Uri.parse('package:test/test.dart');
+    var result = await driver.getResolvedLibraryByUri2(uri);
+    expect(result, isA<NotLibraryButPartResult>());
+  }
+
+  test_getResolvedLibraryByUri2_unresolvedUri() async {
+    var uri = Uri.parse('package:unknown/a.dart');
+    var result = await driver.getResolvedLibraryByUri2(uri);
+    expect(result, isA<CannotResolveUriResult>());
+  }
+
   test_getResult() async {
     String content = 'int f() => 42;';
     addTestFile(content, priority: true);
@@ -1483,7 +1531,7 @@
     expect(allResults, [result]);
   }
 
-  test_getResult2_notAbsolutePath() async {
+  test_getResult2_invalidPath_notAbsolute() async {
     var result = await driver.getResult2('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
@@ -2056,11 +2104,11 @@
 import 'package:test/b.dart';
 ''');
 
-    await driver.getResolvedLibrary(a);
+    await driver.getResolvedLibrary2(a);
     await driver.getUnitElement2(b);
   }
 
-  test_getUnitElement2_notAbsolutePath() async {
+  test_getUnitElement2_invalidPath_notAbsolute() async {
     var result = await driver.getUnitElement2('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
index 71c8f83..6984d0e 100644
--- a/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/results/get_element_declaration_test.dart
@@ -455,8 +455,8 @@
     return library.getElementDeclaration(element);
   }
 
-  Future<ResolvedLibraryResult> _getResolvedLibrary(String path) {
+  Future<ResolvedLibraryResult> _getResolvedLibrary(String path) async {
     var session = contextFor(path).currentSession;
-    return session.getResolvedLibrary(path);
+    return await session.getResolvedLibrary2(path) as ResolvedLibraryResult;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 7812b9d..8b85e92 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -5,7 +5,9 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -51,6 +53,16 @@
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
 
+  void test_getResolvedLibrary2_notFileOfUri() async {
+    var relPath = 'dart/my/lib/a.dart';
+    newFile('$workspaceRootPath/bazel-bin/$relPath');
+
+    var path = convertPath('$workspaceRootPath/$relPath');
+    var session = contextFor(path).currentSession;
+    var result = await session.getResolvedLibrary2(path);
+    expect(result, isA<NotPathOfUriResult>());
+  }
+
   void test_getResolvedUnit2_notFileOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
@@ -103,6 +115,17 @@
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
 
+  void test_getUnitElement2_invalidPath_notAbsolute() async {
+    var file = newFile(
+      '$workspaceRootPath/dart/my/lib/a.dart',
+      content: 'class A {}',
+    );
+
+    var session = contextFor(file.path).currentSession;
+    var result = await session.getUnitElement2('not_absolute.dart');
+    expect(result, isA<InvalidPathResult>());
+  }
+
   void test_getUnitElement2_notPathOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
@@ -120,8 +143,7 @@
     );
 
     var session = contextFor(file.path).currentSession;
-    var result = await session.getUnitElement2(file.path);
-    result as UnitElementResult;
+    var result = await session.getUnitElementValid(file.path);
     expect(result.state, ResultState.VALID);
     expect(result.path, file.path);
     expect(result.element.types, hasLength(1));
@@ -481,7 +503,7 @@
 ''';
     newFile(b, content: bContent);
 
-    var resolvedLibrary = await session.getResolvedLibrary(a);
+    var resolvedLibrary = await session.getResolvedLibraryValid(a);
     expect(resolvedLibrary.session, session);
     expect(resolvedLibrary.path, a);
     expect(resolvedLibrary.uri, Uri.parse('package:test/a.dart'));
@@ -528,10 +550,22 @@
     expect(bNode.declaredElement!.name, 'B');
   }
 
+  test_getResolvedLibrary2_invalidPath_notAbsolute() async {
+    var result = await session.getResolvedLibrary2('not_absolute.dart');
+    expect(result, isA<InvalidPathResult>());
+  }
+
+  test_getResolvedLibrary2_notLibrary() async {
+    newFile(testPath, content: 'part of "a.dart";');
+
+    var result = await session.getResolvedLibrary2(testPath);
+    expect(result, isA<NotLibraryButPartResult>());
+  }
+
   test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
     newFile(testPath, content: '');
 
-    var resolvedLibrary = await session.getResolvedLibrary(testPath);
+    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
 
     expect(() {
       var intClass = resolvedLibrary.typeProvider.intType.element;
@@ -544,7 +578,7 @@
 int foo = 0;
 ''');
 
-    var resolvedLibrary = await session.getResolvedLibrary(testPath);
+    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
     var unitElement = resolvedLibrary.element!.definingCompilationUnit;
 
     var fooElement = unitElement.topLevelVariables[0];
@@ -570,7 +604,7 @@
 part 'c.dart';
 ''');
 
-    var resolvedLibrary = await session.getResolvedLibrary(testPath);
+    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
 
     expect(resolvedLibrary.units, hasLength(3));
     expect(
@@ -587,14 +621,16 @@
     );
   }
 
+  @deprecated
   test_getResolvedLibrary_notLibrary() async {
     newFile(testPath, content: 'part of "a.dart";');
 
-    expect(() {
-      session.getResolvedLibrary(testPath);
+    expect(() async {
+      await session.getResolvedLibrary(testPath);
     }, throwsArgumentError);
   }
 
+  @deprecated
   test_getResolvedLibraryByElement() async {
     newFile(testPath, content: '');
 
@@ -608,6 +644,32 @@
     expect(resolvedLibrary.units![0].unit!.declaredElement, isNotNull);
   }
 
+  test_getResolvedLibraryByElement2() async {
+    newFile(testPath, content: '');
+
+    var element = await session.getLibraryByUri('package:test/test.dart');
+
+    var result = await session.getResolvedLibraryByElementValid(element);
+    expect(result.session, session);
+    expect(result.path, testPath);
+    expect(result.uri, Uri.parse('package:test/test.dart'));
+    expect(result.units, hasLength(1));
+    expect(result.units![0].unit!.declaredElement, isNotNull);
+  }
+
+  test_getResolvedLibraryByElement2_differentSession() async {
+    newFile(testPath, content: '');
+
+    var element = await session.getLibraryByUri('package:test/test.dart');
+
+    var aaaSession =
+        contextCollection.contextFor(aaaContextPath).currentSession;
+
+    var result = await aaaSession.getResolvedLibraryByElement2(element);
+    expect(result, isA<NotElementOfThisSessionResult>());
+  }
+
+  @deprecated
   test_getResolvedLibraryByElement_differentSession() async {
     newFile(testPath, content: '');
 
@@ -690,8 +752,7 @@
 class B {}
 ''');
 
-    var unitResult = await session.getUnitElement2(testPath);
-    unitResult as UnitElementResult;
+    var unitResult = await session.getUnitElementValid(testPath);
     expect(unitResult.session, session);
     expect(unitResult.path, testPath);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
@@ -705,3 +766,18 @@
     expect(session.resourceProvider, resourceProvider);
   }
 }
+
+extension on AnalysisSession {
+  Future<UnitElementResult> getUnitElementValid(String path) async {
+    return await getUnitElement2(path) as UnitElementResult;
+  }
+
+  Future<ResolvedLibraryResult> getResolvedLibraryValid(String path) async {
+    return await getResolvedLibrary2(path) as ResolvedLibraryResult;
+  }
+
+  Future<ResolvedLibraryResult> getResolvedLibraryByElementValid(
+      LibraryElement element) async {
+    return await getResolvedLibraryByElement2(element) as ResolvedLibraryResult;
+  }
+}
diff --git a/pkg/nnbd_migration/lib/migration_cli.dart b/pkg/nnbd_migration/lib/migration_cli.dart
index 0590138..e90259e 100644
--- a/pkg/nnbd_migration/lib/migration_cli.dart
+++ b/pkg/nnbd_migration/lib/migration_cli.dart
@@ -1072,8 +1072,8 @@
           continue;
           break;
         case SourceKind.LIBRARY:
-          var result = await driver.getResolvedLibrary(path);
-          if (result != null) {
+          var result = await driver.getResolvedLibrary2(path);
+          if (result is ResolvedLibraryResult) {
             for (var unit in result.units) {
               if (!pathsProcessed.contains(unit.path)) {
                 await process(unit);
diff --git a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
index 39c2926..75bdd5b 100644
--- a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
@@ -96,8 +96,8 @@
     for (var filePath in sources) {
       progressBar.tick();
       var session = driverProvider.getAnalysisSession(filePath);
-      if (!session.getFile(filePath).isPart) {
-        var result = await session.getResolvedLibrary(filePath);
+      var result = await session.getResolvedLibrary2(filePath);
+      if (result is ResolvedLibraryResult) {
         for (var unitResult in result.units) {
           var sourceInfo =
               sourceInfoMap[unitResult.unit.declaredElement.source];
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 7f5df1c..70abd3d5 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 import 'package:test/test.dart';
@@ -62,8 +63,9 @@
         removeViaComments: removeViaComments,
         warnOnWeakCode: warnOnWeakCode);
     for (var path in input.keys) {
-      if (!(session.getFile(path)).isPart) {
-        for (var unit in (await session.getResolvedLibrary(path)).units) {
+      var resolvedLibrary = await session.getResolvedLibrary2(path);
+      if (resolvedLibrary is ResolvedLibraryResult) {
+        for (var unit in resolvedLibrary.units) {
           migration.prepareInput(unit);
         }
       }
@@ -71,16 +73,18 @@
     expect(migration.unmigratedDependencies, isEmpty);
     _betweenStages();
     for (var path in input.keys) {
-      if (!(session.getFile(path)).isPart) {
-        for (var unit in (await session.getResolvedLibrary(path)).units) {
+      var resolvedLibrary = await session.getResolvedLibrary2(path);
+      if (resolvedLibrary is ResolvedLibraryResult) {
+        for (var unit in resolvedLibrary.units) {
           migration.processInput(unit);
         }
       }
     }
     _betweenStages();
     for (var path in input.keys) {
-      if (!(session.getFile(path)).isPart) {
-        for (var unit in (await session.getResolvedLibrary(path)).units) {
+      var resolvedLibrary = await session.getResolvedLibrary2(path);
+      if (resolvedLibrary is ResolvedLibraryResult) {
+        for (var unit in resolvedLibrary.units) {
           migration.finalizeInput(unit);
         }
       }
diff --git a/tools/VERSION b/tools/VERSION
index 1916272..bcb0d00 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 9
+PRERELEASE 10
 PRERELEASE_PATCH 0
\ No newline at end of file