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