diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 41cb540..9e758b6 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -331,7 +331,7 @@
         return null;
       }
 
-      var unitElementResult = await driver.getUnitElement2(file);
+      var unitElementResult = await driver.getUnitElement(file);
       if (unitElementResult is! UnitElementResult) {
         return null;
       }
@@ -414,7 +414,7 @@
     }
 
     return driver
-        .getResult2(path, sendCachedToStream: sendCachedToStream)
+        .getResult(path, sendCachedToStream: sendCachedToStream)
         .then((value) => value is ResolvedUnitResult ? value : null)
         .catchError((e, st) {
       instrumentationService.logException(e, st);
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 01ab4cf..6988248 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -26,7 +26,7 @@
       this.code, this.offset, this.contextPath, this.contextOffset);
 
   Future<RuntimeCompletionResult> compute() async {
-    var contextResult = await analysisDriver.getResult2(contextPath);
+    var contextResult = await analysisDriver.getResult(contextPath);
     if (contextResult is! ResolvedUnitResult) {
       return RuntimeCompletionResult([], []);
     }
@@ -64,7 +64,7 @@
     // Update the context file content to include the code being completed.
     // Then resolve it, and restore the file to its initial state.
     var targetResult = await _withContextFileContent(targetCode, () async {
-      return await analysisDriver.getResult2(contextPath);
+      return await analysisDriver.getResult(contextPath);
     });
     if (targetResult is! ResolvedUnitResult) {
       return RuntimeCompletionResult([], []);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
index 9372068..d832d06 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -36,7 +36,7 @@
     final docIdentifier = server.getVersionedDocumentIdentifier(path);
 
     var driver = server.getAnalysisDriver(path);
-    final result = await driver?.parseFile2(path);
+    final result = driver?.parseFileSync(path);
 
     if (cancellationToken.isCancellationRequested) {
       return error(ErrorCodes.RequestCancelled, 'Request was cancelled');
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 7098d09..d33a96e 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -265,7 +265,7 @@
   /// analyzed in one of the analysis drivers to which the file was added,
   /// otherwise in the first driver, otherwise `null` is returned.
   LineInfo? getLineInfo(String path) {
-    var result = getAnalysisDriver(path)?.getFileSync2(path);
+    var result = getAnalysisDriver(path)?.getFileSync(path);
     return result is FileResult ? result.lineInfo : null;
   }
 
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 629d626..0d4629c 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -243,7 +243,7 @@
           raw: true);
       return;
     }
-    var result = await driver.getResult2(filePath);
+    var result = await driver.getResult(filePath);
     if (result is ResolvedUnitResult) {
       var writer = AstWriter(buf);
       result.unit.accept(writer);
@@ -833,7 +833,7 @@
           raw: true);
       return;
     }
-    var result = await driver.getResult2(filePath);
+    var result = await driver.getResult(filePath);
     CompilationUnitElement? compilationUnitElement;
     if (result is ResolvedUnitResult) {
       compilationUnitElement = result.unit.declaredElement;
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 3db384d..bffa9fc 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -2161,7 +2161,7 @@
   print(otherName);
 }
 ''');
-    server.getAnalysisDriver(testFile)!.getResult2(testFile);
+    server.getAnalysisDriver(testFile)!.getResult(testFile);
     // send the second request, with the same kind, file and offset
     await waitForTasksFinished();
     result = await getRefactoringResult(() {
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 708c0a8..07feae1 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -328,7 +328,7 @@
 ''').path;
 
     var coreLibResult = await driverFor(testFilePath)
-        .getLibraryByUri2('dart:core') as LibraryElementResult;
+        .getLibraryByUri('dart:core') as LibraryElementResult;
     var intElement = coreLibResult.element.getType('int')!;
 
     var matches = await searchEngine.searchReferences(intElement);
@@ -427,7 +427,7 @@
       var contextRoot = driver.analysisContext!.contextRoot;
       for (var file in contextRoot.analyzedFiles()) {
         if (file.endsWith('.dart')) {
-          await driver.getUnitElement2(file);
+          await driver.getUnitElement(file);
         }
       }
     }
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 5d2932b..f0dc96e 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.8.0-dev
+* Deprecations and renames for `getXyz` methods in `AnalysisDriver`.
+* Removed uppercase named constants from `double` in mock SDK.
+
 ## 2.7.0
 * Updated `ConstructorElement.displayName` to either `Class` or `Class.constructor`.
 * Deprecated `InterfaceType.getSmartLeastUpperBound`, use `TypeSystem.leastUpperBound` instead.
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index a839b73..6bf41b7 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -340,8 +340,7 @@
 /// The result of building the element model for a single file.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class UnitElementResult
-    implements SomeUnitElementResult, AnalysisResult {
+abstract class UnitElementResult implements SomeUnitElementResult, FileResult {
   /// The element of the file.
   CompilationUnitElement get element;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 557a2e8..32ea11f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -139,11 +139,11 @@
   final _priorityFiles = <String>{};
 
   /// The mapping from the files for which analysis was requested using
-  /// [getResult2] to the [Completer]s to report the result.
+  /// [getResult] to the [Completer]s to report the result.
   final _requestedFiles = <String, List<Completer<ResolvedUnitResult>>>{};
 
   /// The mapping from the files for which analysis was requested using
-  /// [getResolvedLibrary2] to the [Completer]s to report the result.
+  /// [getResolvedLibrary] to the [Completer]s to report the result.
   final _requestedLibraries =
       <String, List<Completer<ResolvedLibraryResult>>>{};
 
@@ -159,7 +159,7 @@
   final _referencingNameTasks = <_FilesReferencingNameTask>[];
 
   /// The mapping from the files for which errors were requested using
-  /// [getErrors2] to the [Completer]s to report the result.
+  /// [getErrors] to the [Completer]s to report the result.
   final _errorsRequestedFiles = <String, List<Completer<ErrorsResult>>>{};
 
   /// The requests from [_errorsRequestedFiles] for files which were found to
@@ -172,18 +172,18 @@
       <String, List<Completer<AnalysisDriverUnitIndex>>>{};
 
   /// The mapping from the files for which the unit element was requested using
-  /// [getUnitElement2] to the [Completer]s to report the result.
+  /// [getUnitElement] to the [Completer]s to report the result.
   final _unitElementRequestedFiles =
       <String, List<Completer<UnitElementResult>>>{};
 
   /// The mapping from the files for which the unit element was requested using
-  /// [getUnitElement2], and which were found to be parts without known
+  /// [getUnitElement], and which were found to be parts without known
   /// libraries, to the [Completer]s to report the result.
   final _unitElementRequestedParts =
       <String, List<Completer<UnitElementResult>>>{};
 
   /// The mapping from the files for which analysis was requested using
-  /// [getResult2], and which were found to be parts without known libraries,
+  /// [getResult], and which were found to be parts without known libraries,
   /// to the [Completer]s to report the result.
   final _requestedParts = <String, List<Completer<ResolvedUnitResult>>>{};
 
@@ -382,7 +382,7 @@
   /// the analysis state transitions to "idle".
   ///
   /// [ResolvedUnitResult]s are produced for:
-  /// 1. Files requested using [getResult2].
+  /// 1. Files requested using [getResult].
   /// 2. Files passed to [addFile] which are also in [priorityFiles].
   ///
   /// [ErrorsResult]s are produced for:
@@ -398,7 +398,7 @@
   /// client does not change the state of the files.
   ///
   /// Results might be produced even for files that have never been added
-  /// using [addFile], for example when [getResult2] was called for a file.
+  /// using [addFile], for example when [getResult] was called for a file.
   Stream<Object> get results => _onResults;
 
   /// Return the search support for the driver.
@@ -494,7 +494,7 @@
   /// transitions to "idle".
   ///
   /// Invocation of this method will not prevent a [Future] returned from
-  /// [getResult2] from completing with a result, but the result is not
+  /// [getResult] from completing with a result, but the result is not
   /// guaranteed to be consistent with the new current file state after this
   /// [changeFile] invocation.
   void changeFile(String path) {
@@ -593,7 +593,7 @@
   ///
   /// This method does not use analysis priorities, and must not be used in
   /// interactive analysis, such as Analysis Server or its plugins.
-  Future<SomeErrorsResult> getErrors2(String path) async {
+  Future<SomeErrorsResult> getErrors(String path) async {
     if (!_isAbsolutePath(path)) {
       return Future.value(
         InvalidPathResult(),
@@ -614,6 +614,18 @@
     return completer.future;
   }
 
+  /// Return a [Future] that completes with the [ErrorsResult] for the Dart
+  /// file with the given [path].
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// This method does not use analysis priorities, and must not be used in
+  /// interactive analysis, such as Analysis Server or its plugins.
+  @Deprecated('Use getErrors() instead')
+  Future<SomeErrorsResult> getErrors2(String path) async {
+    return getErrors(path);
+  }
+
   /// Return a [Future] that completes with the list of added files that
   /// define a class member with the given [name].
   Future<List<String>> getFilesDefiningClassMemberName(String name) {
@@ -637,7 +649,7 @@
   /// Return the [FileResult] for the Dart file with the given [path].
   ///
   /// The [path] must be absolute and normalized.
-  SomeFileResult getFileSync2(String path) {
+  SomeFileResult getFileSync(String path) {
     if (!_isAbsolutePath(path)) {
       return InvalidPathResult();
     }
@@ -647,6 +659,14 @@
         _currentSession, path, file.uri, file.lineInfo, file.isPart);
   }
 
+  /// Return the [FileResult] for the Dart file with the given [path].
+  ///
+  /// The [path] must be absolute and normalized.
+  @Deprecated('Use getFileSync() instead')
+  SomeFileResult getFileSync2(String path) {
+    return getFileSync(path);
+  }
+
   /// Return a [Future] that completes with the [AnalysisDriverUnitIndex] for
   /// the file with the given [path], or with `null` if the file cannot be
   /// analyzed.
@@ -669,7 +689,7 @@
   /// Return a [Future] that completes with [LibraryElementResult] for the given
   /// [uri], which is either resynthesized from the provided external summary
   /// store, or built for a file to which the given [uri] is resolved.
-  Future<SomeLibraryElementResult> getLibraryByUri2(String uri) async {
+  Future<SomeLibraryElementResult> getLibraryByUri(String uri) async {
     var uriObj = Uri.parse(uri);
     var fileOr = _fsState.getFileForUri(uriObj);
     return fileOr.map(
@@ -682,7 +702,7 @@
           return NotLibraryButPartResult();
         }
 
-        var unitResult = await getUnitElement2(file.path);
+        var unitResult = await getUnitElement(file.path);
         if (unitResult is UnitElementResult) {
           return LibraryElementResultImpl(unitResult.element.library);
         }
@@ -704,26 +724,18 @@
     );
   }
 
-  /// Return a [ParsedLibraryResult] for the library with the given [path].
-  ///
-  /// Throw [ArgumentError] if the given [path] is not the defining compilation
-  /// unit for a library (that is, is a part of a library).
-  ///
-  /// The [path] must be absolute and normalized.
-  ParsedLibraryResult getParsedLibrary(String path) {
-    var result = getParsedLibrary2(path);
-
-    if (result is NotLibraryButPartResult) {
-      throw ArgumentError('Is a part: $path');
-    }
-
-    return result as ParsedLibraryResult;
+  /// Return a [Future] that completes with [LibraryElementResult] for the given
+  /// [uri], which is either resynthesized from the provided external summary
+  /// store, or built for a file to which the given [uri] is resolved.
+  @Deprecated('Use getLibraryByUri() instead')
+  Future<SomeLibraryElementResult> getLibraryByUri2(String uri) async {
+    return getLibraryByUri(uri);
   }
 
   /// Return a [ParsedLibraryResult] for the library with the given [path].
   ///
   /// The [path] must be absolute and normalized.
-  SomeParsedLibraryResult getParsedLibrary2(String path) {
+  SomeParsedLibraryResult getParsedLibrary(String path) {
     if (!_isAbsolutePath(path)) {
       return InvalidPathResult();
     }
@@ -741,7 +753,7 @@
     var units = <ParsedUnitResult>[];
     for (var unitFile in file.libraryFiles) {
       var unitPath = unitFile.path;
-      var unitResult = parseFileSync2(unitPath);
+      var unitResult = parseFileSync(unitPath);
       if (unitResult is! ParsedUnitResult) {
         return UnspecifiedInvalidResult();
       }
@@ -752,7 +764,7 @@
   }
 
   /// Return a [ParsedLibraryResult] for the library with the given [uri].
-  SomeParsedLibraryResult getParsedLibraryByUri2(Uri uri) {
+  SomeParsedLibraryResult getParsedLibraryByUri(Uri uri) {
     var fileOr = _fsState.getFileForUri(uri);
     return fileOr.map(
       (file) {
@@ -784,7 +796,7 @@
   /// 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) {
+  Future<SomeResolvedLibraryResult> getResolvedLibrary(String path) {
     if (!_isAbsolutePath(path)) {
       return Future.value(
         InvalidPathResult(),
@@ -824,7 +836,7 @@
   /// 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) {
+  Future<SomeResolvedLibraryResult> getResolvedLibraryByUri(Uri uri) {
     var fileOr = _fsState.getFileForUri(uri);
     return fileOr.map(
       (file) async {
@@ -834,7 +846,7 @@
         if (file.isPart) {
           return NotLibraryButPartResult();
         }
-        return getResolvedLibrary2(file.path);
+        return getResolvedLibrary(file.path);
       },
       (externalLibrary) async {
         return UriOfExternalLibraryResult();
@@ -859,7 +871,7 @@
   /// 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<SomeResolvedUnitResult> getResult2(String path,
+  Future<SomeResolvedUnitResult> getResult(String path,
       {bool sendCachedToStream = false}) {
     if (!_isAbsolutePath(path)) {
       return Future.value(
@@ -893,9 +905,32 @@
     return completer.future;
   }
 
+  /// Return a [Future] that completes with a [SomeResolvedUnitResult] for the
+  /// 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.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// If the driver has the cached analysis result for the file, it is returned.
+  /// If [sendCachedToStream] is `true`, then the result is also reported into
+  /// the [results] stream, just as if it were freshly computed.
+  ///
+  /// Otherwise causes the analysis state to transition to "analyzing" (if it is
+  /// not in that state already), the driver will produce the analysis 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".
+  @Deprecated('Use getResult() instead')
+  Future<SomeResolvedUnitResult> getResult2(String path,
+      {bool sendCachedToStream = false}) {
+    return getResult(path);
+  }
+
   /// Return a [Future] that completes with the [SomeUnitElementResult]
   /// for the file with the given [path].
-  Future<SomeUnitElementResult> getUnitElement2(String path) {
+  Future<SomeUnitElementResult> getUnitElement(String path) {
     if (!_isAbsolutePath(path)) {
       return Future.value(
         InvalidPathResult(),
@@ -943,6 +978,7 @@
   /// The parsing is performed in the method itself, and the result is not
   /// produced through the [results] stream (just because it is not a fully
   /// resolved unit).
+  @Deprecated('Use parseFileSync() instead')
   Future<SomeParsedUnitResult> parseFile2(String path) async {
     return parseFileSync2(path);
   }
@@ -956,7 +992,7 @@
   /// The parsing is performed in the method itself, and the result is not
   /// produced through the [results] stream (just because it is not a fully
   /// resolved unit).
-  SomeParsedUnitResult parseFileSync2(String path) {
+  SomeParsedUnitResult parseFileSync(String path) {
     if (!_isAbsolutePath(path)) {
       return InvalidPathResult();
     }
@@ -968,6 +1004,20 @@
         file.content, file.lineInfo, file.isPart, unit, listener.errors);
   }
 
+  /// Return a [ParsedUnitResult] for the file with the given [path].
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// The parsing is performed in the method itself, and the result is not
+  /// produced through the [results] stream (just because it is not a fully
+  /// resolved unit).
+  @Deprecated('Use parseFileSync() instead')
+  SomeParsedUnitResult parseFileSync2(String path) {
+    return parseFileSync(path);
+  }
+
   @override
   Future<void> performWork() async {
     if (_fileTracker.verifyChangedFilesIfNeeded()) {
@@ -1450,6 +1500,8 @@
         currentSession,
         path,
         file.uri,
+        file.lineInfo,
+        file.isPart,
         library.transitiveSignature,
         element,
       );
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index e89beb5..5f03c26 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -249,7 +249,7 @@
   TypeSystemImpl get typeSystem => libraryElement.typeSystem as TypeSystemImpl;
 }
 
-class UnitElementResultImpl extends AnalysisResultImpl
+class UnitElementResultImpl extends FileResultImpl
     implements UnitElementResult {
   @override
   final String signature;
@@ -258,8 +258,8 @@
   final CompilationUnitElement element;
 
   UnitElementResultImpl(AnalysisSession session, String path, Uri uri,
-      this.signature, this.element)
-      : super(session, path, uri);
+      LineInfo lineInfo, bool isPart, this.signature, this.element)
+      : super(session, path, uri, lineInfo, isPart);
 
   @Deprecated('Check for specific Result subtypes instead')
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 9a79ce1..4e0449b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -54,7 +54,7 @@
     List<String> files = await _driver.getFilesDefiningClassMemberName(name);
     for (String file in files) {
       if (searchedFiles.add(file, this)) {
-        var unitResult = await _driver.getUnitElement2(file);
+        var unitResult = await _driver.getUnitElement(file);
         if (unitResult is UnitElementResult) {
           unitResult.element.classes.forEach(addElements);
           unitResult.element.mixins.forEach(addElements);
@@ -175,7 +175,7 @@
 
     List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
     for (FileState file in knownFiles) {
-      var unitResult = await _driver.getUnitElement2(file.path);
+      var unitResult = await _driver.getUnitElement(file.path);
       if (unitResult is UnitElementResult) {
         CompilationUnitElement unitElement = unitResult.element;
         unitElement.accessors.forEach(addElement);
@@ -284,7 +284,7 @@
   }
 
   Future<CompilationUnitElement?> _getUnitElement(String file) async {
-    var result = await _driver.getUnitElement2(file);
+    var result = await _driver.getUnitElement(file);
     return result is UnitElementResult ? result.element : null;
   }
 
@@ -391,7 +391,7 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      var unitResult = await _driver.getResult2(unitPath);
+      var unitResult = await _driver.getResult(unitPath);
       if (unitResult is ResolvedUnitResult) {
         var visitor = _ImportElementReferencesVisitor(element, unitElement);
         unitResult.unit.accept(visitor);
@@ -411,7 +411,7 @@
     List<SearchResult> results = <SearchResult>[];
     for (CompilationUnitElement unitElement in element.units) {
       String unitPath = unitElement.source.fullName;
-      var unitResult = await _driver.getResult2(unitPath);
+      var unitResult = await _driver.getResult(unitPath);
       if (unitResult is ResolvedUnitResult) {
         CompilationUnit unit = unitResult.unit;
         for (Directive directive in unit.directives) {
@@ -441,7 +441,7 @@
     }
 
     // Prepare the unit.
-    var unitResult = await _driver.getResult2(path);
+    var unitResult = await _driver.getResult(path);
     if (unitResult is! ResolvedUnitResult) {
       return const <SearchResult>[];
     }
@@ -494,7 +494,7 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      var unitResult = await _driver.getResult2(unitPath);
+      var unitResult = await _driver.getResult(unitPath);
       if (unitResult is ResolvedUnitResult) {
         var visitor = _LocalReferencesVisitor(element, unitElement);
         unitResult.unit.accept(visitor);
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 5bc5a9c..319ddc6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -57,7 +57,7 @@
   @override
   Future<SomeErrorsResult> getErrors(String path) {
     _checkConsistency();
-    return _driver.getErrors2(path);
+    return _driver.getErrors(path);
   }
 
   @Deprecated('Use getErrors() instead')
@@ -69,7 +69,7 @@
   @override
   SomeFileResult getFile(String path) {
     _checkConsistency();
-    return _driver.getFileSync2(path);
+    return _driver.getFileSync(path);
   }
 
   @Deprecated('Use getFile() instead')
@@ -81,7 +81,7 @@
   @override
   Future<SomeLibraryElementResult> getLibraryByUri(String uri) {
     _checkConsistency();
-    return _driver.getLibraryByUri2(uri);
+    return _driver.getLibraryByUri(uri);
   }
 
   @Deprecated('Use getLibraryByUri() instead')
@@ -93,7 +93,7 @@
   @override
   SomeParsedLibraryResult getParsedLibrary(String path) {
     _checkConsistency();
-    return _driver.getParsedLibrary2(path);
+    return _driver.getParsedLibrary(path);
   }
 
   @Deprecated('Use getParsedLibrary() instead')
@@ -110,7 +110,7 @@
       return NotElementOfThisSessionResult();
     }
 
-    return _driver.getParsedLibraryByUri2(element.source.uri);
+    return _driver.getParsedLibraryByUri(element.source.uri);
   }
 
   @Deprecated('Use getParsedLibraryByElement() instead')
@@ -122,7 +122,7 @@
   @override
   SomeParsedUnitResult getParsedUnit(String path) {
     _checkConsistency();
-    return _driver.parseFileSync2(path);
+    return _driver.parseFileSync(path);
   }
 
   @Deprecated('Use getParsedUnit() instead')
@@ -134,7 +134,7 @@
   @override
   Future<SomeResolvedLibraryResult> getResolvedLibrary(String path) {
     _checkConsistency();
-    return _driver.getResolvedLibrary2(path);
+    return _driver.getResolvedLibrary(path);
   }
 
   @Deprecated('Use getResolvedLibrary() instead')
@@ -155,7 +155,7 @@
       );
     }
 
-    return _driver.getResolvedLibraryByUri2(element.source.uri);
+    return _driver.getResolvedLibraryByUri(element.source.uri);
   }
 
   @Deprecated('Use getResolvedLibraryByElement() instead')
@@ -169,7 +169,7 @@
   @override
   Future<SomeResolvedUnitResult> getResolvedUnit(String path) {
     _checkConsistency();
-    return _driver.getResult2(path);
+    return _driver.getResult(path);
   }
 
   @Deprecated('Use getResolvedUnit() instead')
@@ -181,7 +181,7 @@
   @override
   Future<SomeUnitElementResult> getUnitElement(String path) {
     _checkConsistency();
-    return _driver.getUnitElement2(path);
+    return _driver.getUnitElement(path);
   }
 
   @Deprecated('Use getUnitElement() instead')
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 994bd26..198b6a8 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -318,13 +318,6 @@
 }
 
 abstract class double extends num {
-  // TODO: remove these old constants when no tests rely on them.
-  static const double NAN = 0.0 / 0.0;
-  static const double INFINITY = 1.0 / 0.0;
-  static const double NEGATIVE_INFINITY = -INFINITY;
-  static const double MIN_POSITIVE = 5e-324;
-  static const double MAX_FINITE = 1.7976931348623157e+308;
-
   static const double nan = 0.0 / 0.0;
   static const double infinity = 1.0 / 0.0;
   static const double negativeInfinity = -infinity;
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index d4a3f0f..76dc2d2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 2.7.0
+version: 2.8.0-dev
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
 
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 3770d7c..bf708fc 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1012,7 +1012,7 @@
   const A(x);
 }
 main() {
-  const A(double.INFINITY);
+  const A(double.infinity);
 }
 ''');
   }
@@ -2382,7 +2382,7 @@
 
   test_nonConstantDefaultValue_constField() async {
     await assertNoErrorsInCode(r'''
-f([a = double.INFINITY]) {
+f([a = double.infinity]) {
 }
 ''');
   }
@@ -2457,7 +2457,7 @@
   test_nonConstListElement_constField() async {
     await assertNoErrorsInCode(r'''
 main() {
-  const [double.INFINITY];
+  const [double.infinity];
 }
 ''');
   }
@@ -2491,7 +2491,7 @@
   test_nonConstMapValue_constField() async {
     await assertNoErrorsInCode(r'''
 main() {
-  const {0: double.INFINITY};
+  const {0: double.infinity};
 }
 ''');
   }
diff --git a/pkg/analyzer/test/generated/statement_parser_test.dart b/pkg/analyzer/test/generated/statement_parser_test.dart
index 5e90e69..ff93ba2 100644
--- a/pkg/analyzer/test/generated/statement_parser_test.dart
+++ b/pkg/analyzer/test/generated/statement_parser_test.dart
@@ -1079,7 +1079,7 @@
   }
 
   void test_parseNonLabeledStatement_typeCast() {
-    var statement = parseStatement('double.NAN as num;') as ExpressionStatement;
+    var statement = parseStatement('double.nan as num;') as ExpressionStatement;
     assertNoErrors();
     expect(statement.expression, isNotNull);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 59cdc3b..8ab312a 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -199,7 +199,7 @@
     driver1.priorityFiles = [a];
     driver2.priorityFiles = [a];
 
-    var result = await driver2.getResult2(b) as ResolvedUnitResult;
+    var result = await driver2.getResult(b) as ResolvedUnitResult;
     expect(result.path, b);
 
     await scheduler.status.firstWhere((status) => status.isIdle);
@@ -579,7 +579,7 @@
 
     // Get the (cached) result, reported to the stream.
     {
-      var result2 = await driver.getResult2(a, sendCachedToStream: true);
+      var result2 = await driver.getResult(a, sendCachedToStream: true);
       expect(result2, same(result1));
 
       expect(allResults, hasLength(1));
@@ -1262,21 +1262,21 @@
     expect(allResults, isEmpty);
 
     {
-      var result = await driver.getResolvedLibrary2(templatePath);
+      var result = await driver.getResolvedLibrary(templatePath);
       expect(result, isA<NotPathOfUriResult>());
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
     }
 
     {
-      var result = await driver.getResult2(templatePath);
+      var result = await driver.getResult(templatePath);
       expect(result, isA<NotPathOfUriResult>());
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
     }
 
     {
-      var result = await driver.getUnitElement2(templatePath);
+      var result = await driver.getUnitElement(templatePath);
       expect(result, isA<NotPathOfUriResult>());
       expect(allExceptions, isEmpty);
       expect(allResults, isEmpty);
@@ -1303,18 +1303,18 @@
     expect(driver.getCachedResult(a), same(result));
   }
 
-  test_getErrors2() async {
+  test_getErrors() async {
     String content = 'int f() => 42 + bar();';
     addTestFile(content, priority: true);
 
-    var result = await driver.getErrors2(testFile) as ErrorsResult;
+    var result = await driver.getErrors(testFile) as ErrorsResult;
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.errors, hasLength(1));
   }
 
-  test_getErrors2_notAbsolutePath() async {
-    var result = await driver.getErrors2('not_absolute.dart');
+  test_getErrors_notAbsolutePath() async {
+    var result = await driver.getErrors('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
@@ -1421,7 +1421,7 @@
     expect(files, isNot(contains(c)));
   }
 
-  test_getFileSync2_changedFile() async {
+  test_getFileSync_changedFile() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
 
@@ -1458,7 +1458,7 @@
     expect((await driver.getResultValid(b)).errors, isEmpty);
   }
 
-  test_getFileSync2_library() async {
+  test_getFileSync_library() async {
     var path = convertPath('/test/lib/a.dart');
     newFile(path);
     var file = driver.getFileSyncValid(path);
@@ -1467,12 +1467,12 @@
     expect(file.isPart, isFalse);
   }
 
-  test_getFileSync2_notAbsolutePath() async {
-    var result = driver.getFileSync2('not_absolute.dart');
+  test_getFileSync_notAbsolutePath() async {
+    var result = driver.getFileSync('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
-  test_getFileSync2_part() async {
+  test_getFileSync_part() async {
     var path = convertPath('/test/lib/a.dart');
     newFile(path, content: 'part of lib;');
     var file = driver.getFileSyncValid(path);
@@ -1504,7 +1504,7 @@
     }, throwsArgumentError);
   }
 
-  test_getLibraryByUri2() async {
+  test_getLibraryByUri() async {
     var a = '/test/lib/a.dart';
     var b = '/test/lib/b.dart';
 
@@ -1523,27 +1523,27 @@
 class B {}
 ''');
 
-    var result = await driver.getLibraryByUri2(aUriStr);
+    var result = await driver.getLibraryByUri(aUriStr);
     result as LibraryElementResult;
     expect(result.element.getType('A'), isNotNull);
     expect(result.element.getType('B'), isNotNull);
 
     // It is an error to ask for a library when we know that it is a part.
     expect(
-      await driver.getLibraryByUri2(bUriStr),
+      await driver.getLibraryByUri(bUriStr),
       isA<NotLibraryButPartResult>(),
     );
   }
 
-  test_getLibraryByUri2_unresolvedUri() async {
-    var result = await driver.getLibraryByUri2('package:foo/foo.dart');
+  test_getLibraryByUri_unresolvedUri() async {
+    var result = await driver.getLibraryByUri('package:foo/foo.dart');
     expect(result, isA<CannotResolveUriResult>());
   }
 
-  test_getParsedLibrary2() async {
+  test_getParsedLibrary() async {
     var content = 'class A {}';
     addTestFile(content);
-    var result = driver.getParsedLibrary2(testFile);
+    var result = driver.getParsedLibrary(testFile);
     result as ParsedLibraryResult;
     expect(result.units, hasLength(1));
     expect(result.units[0].path, testFile);
@@ -1552,23 +1552,23 @@
     expect(result.units[0].errors, isEmpty);
   }
 
-  test_getParsedLibrary2_invalidPath_notAbsolute() async {
-    var result = driver.getParsedLibrary2('not_absolute.dart');
+  test_getParsedLibrary_invalidPath_notAbsolute() async {
+    var result = driver.getParsedLibrary('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
-  test_getParsedLibrary2_notLibraryButPart() async {
+  test_getParsedLibrary_notLibraryButPart() async {
     addTestFile('part of my;');
-    var result = driver.getParsedLibrary2(testFile);
+    var result = driver.getParsedLibrary(testFile);
     expect(result, isA<NotLibraryButPartResult>());
   }
 
-  test_getParsedLibraryByUri2() async {
+  test_getParsedLibraryByUri() async {
     var content = 'class A {}';
     addTestFile(content);
 
     var uri = Uri.parse('package:test/test.dart');
-    var result = driver.getParsedLibraryByUri2(uri);
+    var result = driver.getParsedLibraryByUri(uri);
     result as ParsedLibraryResult;
     expect(result.uri, uri);
     expect(result.units, hasLength(1));
@@ -1577,24 +1577,24 @@
     expect(result.units[0].content, content);
   }
 
-  test_getParsedLibraryByUri2_notLibrary() async {
+  test_getParsedLibraryByUri_notLibrary() async {
     addTestFile('part of my;');
 
     var uri = Uri.parse('package:test/test.dart');
-    var result = driver.getParsedLibraryByUri2(uri);
+    var result = driver.getParsedLibraryByUri(uri);
     expect(result, isA<NotLibraryButPartResult>());
   }
 
-  test_getParsedLibraryByUri2_unresolvedUri() async {
+  test_getParsedLibraryByUri_unresolvedUri() async {
     var uri = Uri.parse('package:unknown/a.dart');
-    var result = driver.getParsedLibraryByUri2(uri);
+    var result = driver.getParsedLibraryByUri(uri);
     expect(result, isA<CannotResolveUriResult>());
   }
 
-  test_getResolvedLibrary2() async {
+  test_getResolvedLibrary() async {
     var content = 'class A {}';
     addTestFile(content);
-    var result = await driver.getResolvedLibrary2(testFile);
+    var result = await driver.getResolvedLibrary(testFile);
     result as ResolvedLibraryResult;
     expect(result.units, hasLength(1));
     expect(result.units[0].path, testFile);
@@ -1603,23 +1603,23 @@
     expect(result.units[0].errors, isEmpty);
   }
 
-  test_getResolvedLibrary2_invalidPath_notAbsolute() async {
-    var result = await driver.getResolvedLibrary2('not_absolute.dart');
+  test_getResolvedLibrary_invalidPath_notAbsolute() async {
+    var result = await driver.getResolvedLibrary('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
-  test_getResolvedLibrary2_notLibraryButPart() async {
+  test_getResolvedLibrary_notLibraryButPart() async {
     addTestFile('part of my;');
-    var result = await driver.getResolvedLibrary2(testFile);
+    var result = await driver.getResolvedLibrary(testFile);
     expect(result, isA<NotLibraryButPartResult>());
   }
 
-  test_getResolvedLibraryByUri2() async {
+  test_getResolvedLibraryByUri() async {
     var content = 'class A {}';
     addTestFile(content);
 
     var uri = Uri.parse('package:test/test.dart');
-    var result = await driver.getResolvedLibraryByUri2(uri);
+    var result = await driver.getResolvedLibraryByUri(uri);
     result as ResolvedLibraryResult;
     expect(result.uri, uri);
     expect(result.element.source.fullName, testFile);
@@ -1629,17 +1629,17 @@
     expect(result.units[0].content, content);
   }
 
-  test_getResolvedLibraryByUri2_notLibrary() async {
+  test_getResolvedLibraryByUri_notLibrary() async {
     addTestFile('part of my;');
 
     var uri = Uri.parse('package:test/test.dart');
-    var result = await driver.getResolvedLibraryByUri2(uri);
+    var result = await driver.getResolvedLibraryByUri(uri);
     expect(result, isA<NotLibraryButPartResult>());
   }
 
-  test_getResolvedLibraryByUri2_unresolvedUri() async {
+  test_getResolvedLibraryByUri_unresolvedUri() async {
     var uri = Uri.parse('package:unknown/a.dart');
-    var result = await driver.getResolvedLibraryByUri2(uri);
+    var result = await driver.getResolvedLibraryByUri(uri);
     expect(result, isA<CannotResolveUriResult>());
   }
 
@@ -1663,11 +1663,6 @@
     expect(allResults, [result]);
   }
 
-  test_getResult2_invalidPath_notAbsolute() async {
-    var result = await driver.getResult2('not_absolute.dart');
-    expect(result, isA<InvalidPathResult>());
-  }
-
   test_getResult_constants_defaultParameterValue_localFunction() async {
     var a = convertPath('/test/bin/a.dart');
     var b = convertPath('/test/bin/b.dart');
@@ -1833,6 +1828,11 @@
     expect(a.name.staticElement, isFunctionElement);
   }
 
+  test_getResult_invalidPath_notAbsolute() async {
+    var result = await driver.getResult('not_absolute.dart');
+    expect(result, isA<InvalidPathResult>());
+  }
+
   test_getResult_invalidUri() async {
     String content = r'''
 import ':[invalid uri]';
@@ -2115,7 +2115,7 @@
     expect(result1.unit, isNotNull);
   }
 
-  test_getUnitElement2() async {
+  test_getUnitElement() async {
     String content = r'''
 foo(int p) {}
 main() {
@@ -2124,7 +2124,7 @@
 ''';
     addTestFile(content);
 
-    var unitResult = await driver.getUnitElement2(testFile);
+    var unitResult = await driver.getUnitElement(testFile);
     unitResult as UnitElementResult;
     CompilationUnitElement unitElement = unitResult.element;
     expect(unitElement.source.fullName, testFile);
@@ -2132,7 +2132,7 @@
         unorderedEquals(['foo', 'main']));
   }
 
-  test_getUnitElement2_doesNotExist_afterResynthesized() async {
+  test_getUnitElement_doesNotExist_afterResynthesized() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
 
@@ -2140,19 +2140,19 @@
 import 'package:test/b.dart';
 ''');
 
-    await driver.getResolvedLibrary2(a);
-    await driver.getUnitElement2(b);
+    await driver.getResolvedLibrary(a);
+    await driver.getUnitElement(b);
   }
 
-  test_getUnitElement2_invalidPath_notAbsolute() async {
-    var result = await driver.getUnitElement2('not_absolute.dart');
+  test_getUnitElement_invalidPath_notAbsolute() async {
+    var result = await driver.getUnitElement('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
-  test_getUnitElement2_notDart() async {
+  test_getUnitElement_notDart() async {
     var path = convertPath('/test.txt');
     newFile(path, content: 'class A {}');
-    var unitResult = await driver.getUnitElement2(path);
+    var unitResult = await driver.getUnitElement(path);
     unitResult as UnitElementResult;
     expect(unitResult.element.classes.map((e) => e.name), ['A']);
   }
@@ -2353,7 +2353,7 @@
     getFile(asyncPath).delete();
     addTestFile('class C {}');
 
-    var result = await driver.getErrors2(testFile) as ErrorsResult;
+    var result = await driver.getErrors(testFile) as ErrorsResult;
     expect(result.errors, hasLength(1));
 
     AnalysisError error = result.errors[0];
@@ -2365,14 +2365,14 @@
     getFile(corePath).delete();
     addTestFile('class C {}');
 
-    var result = await driver.getErrors2(testFile) as ErrorsResult;
+    var result = await driver.getErrors(testFile) as ErrorsResult;
     expect(result.errors, hasLength(1));
 
     AnalysisError error = result.errors[0];
     expect(error.errorCode, CompileTimeErrorCode.MISSING_DART_LIBRARY);
   }
 
-  test_parseFile2_changedFile() async {
+  test_parseFileSync_changedFile() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
 
@@ -2397,7 +2397,7 @@
     // Library cycles are compared by their identity, so we would try to
     // reload linked summary for [a.dart], and crash.
     {
-      var parseResult = await driver.parseFile2(a) as ParsedUnitResult;
+      var parseResult = driver.parseFileSync(a) as ParsedUnitResult;
       expect(parseResult.unit.declarations, isEmpty);
     }
 
@@ -2412,7 +2412,7 @@
 
     // So, `class A {}` is declared now.
     {
-      var parseResult = driver.parseFileSync2(a) as ParsedUnitResult;
+      var parseResult = driver.parseFileSync(a) as ParsedUnitResult;
       expect(parseResult.unit.declarations, hasLength(1));
     }
     {
@@ -2421,70 +2421,7 @@
     }
   }
 
-  test_parseFile2_notAbsolutePath() async {
-    var result = await driver.parseFile2('not_absolute.dart');
-    expect(result, isA<InvalidPathResult>());
-  }
-
-  test_parseFile2_notDart() async {
-    var p = convertPath('/test/bin/a.txt');
-    newFile(p, content: 'class A {}');
-
-    var parseResult = await driver.parseFile2(p) as ParsedUnitResult;
-    expect(parseResult, isNotNull);
-    expect(driver.knownFiles, contains(p));
-  }
-
-  test_parseFileSync2_changedFile() async {
-    var a = convertPath('/test/lib/a.dart');
-    var b = convertPath('/test/lib/b.dart');
-
-    newFile(a, content: '');
-    newFile(b, content: r'''
-import 'a.dart';
-
-void f(A a) {}
-''');
-
-    // Ensure that [a.dart] library cycle is loaded.
-    // So, `a.dart` is in the library context.
-    await driver.getResultValid(a);
-
-    // Update the file, changing its API signature.
-    // Note that we don't call `changeFile`.
-    newFile(a, content: 'class A {}');
-
-    // Parse the file.
-    // We have not called `changeFile(a)`, so we should not read the file.
-    // Moreover, doing this will create a new library cycle [a.dart].
-    // Library cycles are compared by their identity, so we would try to
-    // reload linked summary for [a.dart], and crash.
-    {
-      var parseResult = driver.parseFileSync2(a) as ParsedUnitResult;
-      expect(parseResult.unit.declarations, isEmpty);
-    }
-
-    // We have not read `a.dart`, so `A` is still not declared.
-    {
-      var bResult = await driver.getResultValid(b);
-      expect(bResult.errors, isNotEmpty);
-    }
-
-    // Notify the driver that the file was changed.
-    driver.changeFile(a);
-
-    // So, `class A {}` is declared now.
-    {
-      var parseResult = driver.parseFileSync2(a) as ParsedUnitResult;
-      expect(parseResult.unit.declarations, hasLength(1));
-    }
-    {
-      var bResult = await driver.getResultValid(b);
-      expect(bResult.errors, isEmpty);
-    }
-  }
-
-  test_parseFileSync2_doesNotReadImportedFiles() async {
+  test_parseFileSync_doesNotReadImportedFiles() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
 
@@ -2496,15 +2433,15 @@
     expect(driver.fsState.knownFilePaths, isEmpty);
 
     // Don't read `a.dart` when parse.
-    driver.parseFileSync2(b);
+    driver.parseFileSync(b);
     expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
 
     // Still don't read `a.dart` when parse the second time.
-    driver.parseFileSync2(b);
+    driver.parseFileSync(b);
     expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
   }
 
-  test_parseFileSync2_doesNotReadPartedFiles() async {
+  test_parseFileSync_doesNotReadPartedFiles() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
 
@@ -2519,15 +2456,15 @@
     expect(driver.fsState.knownFilePaths, isEmpty);
 
     // Don't read `a.dart` when parse.
-    driver.parseFileSync2(b);
+    driver.parseFileSync(b);
     expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
 
     // Still don't read `a.dart` when parse the second time.
-    driver.parseFileSync2(b);
+    driver.parseFileSync(b);
     expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
   }
 
-  test_parseFileSync2_languageVersion() async {
+  test_parseFileSync_languageVersion() async {
     var path = convertPath('/test/lib/test.dart');
 
     newFile(path, content: r'''
@@ -2535,33 +2472,33 @@
 class A {}
 ''');
 
-    var parseResult = driver.parseFileSync2(path) as ParsedUnitResult;
+    var parseResult = driver.parseFileSync(path) as ParsedUnitResult;
     var languageVersion = parseResult.unit.languageVersionToken!;
     expect(languageVersion.major, 2);
     expect(languageVersion.minor, 7);
   }
 
-  test_parseFileSync2_languageVersion_null() async {
+  test_parseFileSync_languageVersion_null() async {
     var path = convertPath('/test/lib/test.dart');
 
     newFile(path, content: r'''
 class A {}
 ''');
 
-    var parseResult = driver.parseFileSync2(path) as ParsedUnitResult;
+    var parseResult = driver.parseFileSync(path) as ParsedUnitResult;
     expect(parseResult.unit.languageVersionToken, isNull);
   }
 
-  test_parseFileSync2_notAbsolutePath() {
-    var result = driver.parseFileSync2('not_absolute.dart');
+  test_parseFileSync_notAbsolutePath() async {
+    var result = driver.parseFileSync('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
-  test_parseFileSync2_notDart() {
+  test_parseFileSync_notDart() async {
     var p = convertPath('/test/bin/a.txt');
     newFile(p, content: 'class A {}');
 
-    var parseResult = driver.parseFileSync2(p) as ParsedUnitResult;
+    var parseResult = driver.parseFileSync(p) as ParsedUnitResult;
     expect(parseResult, isNotNull);
     expect(driver.knownFiles, contains(p));
   }
@@ -2591,13 +2528,13 @@
 
     // Process a.dart so that we know that it's a library for c.dart later.
     {
-      var result = await driver.getErrors2(a) as ErrorsResult;
+      var result = await driver.getErrors(a) as ErrorsResult;
       expect(result.errors, isEmpty);
     }
 
     // c.dart does not have errors in the context of a.dart
     {
-      var result = await driver.getErrors2(c) as ErrorsResult;
+      var result = await driver.getErrors(c) as ErrorsResult;
       expect(result.errors, isEmpty);
     }
   }
@@ -2627,7 +2564,7 @@
 
     // c.dart is resolve in the context of a.dart, so have no errors
     {
-      var result = await driver.getErrors2(c) as ErrorsResult;
+      var result = await driver.getErrors(c) as ErrorsResult;
       expect(result.errors, isEmpty);
     }
   }
@@ -2746,7 +2683,7 @@
     expect(result.unit, isNotNull);
   }
 
-  test_part_getUnitElement2_afterLibrary() async {
+  test_part_getUnitElement_afterLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2774,7 +2711,7 @@
 
     // c.dart is resolve in the context of a.dart, knows 'A' and 'B'.
     {
-      var result = await driver.getUnitElement2(c);
+      var result = await driver.getUnitElement(c);
       result as UnitElementResult;
       var partUnit = result.element;
 
@@ -2786,7 +2723,7 @@
     }
   }
 
-  test_part_getUnitElement2_beforeLibrary() async {
+  test_part_getUnitElement_beforeLibrary() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
     var c = convertPath('/test/lib/c.dart');
@@ -2811,7 +2748,7 @@
 
     // c.dart is resolve in the context of a.dart, knows 'A' and 'B'.
     {
-      var result = await driver.getUnitElement2(c);
+      var result = await driver.getUnitElement(c);
       result as UnitElementResult;
       var partUnit = result.element;
 
@@ -2823,7 +2760,7 @@
     }
   }
 
-  test_part_getUnitElement2_noLibrary() async {
+  test_part_getUnitElement_noLibrary() async {
     var c = convertPath('/test/lib/c.dart');
     newFile(c, content: r'''
 part of a;
@@ -2836,7 +2773,7 @@
     // We don't know the library of c.dart, but we should get a result.
     // The types "A" and "B" are unresolved.
     {
-      var result = await driver.getUnitElement2(c);
+      var result = await driver.getUnitElement(c);
       result as UnitElementResult;
       var partUnit = result.element;
 
@@ -3423,7 +3360,7 @@
 
 extension on AnalysisDriver {
   FileResult getFileSyncValid(String path) {
-    return getFileSync2(path) as FileResult;
+    return getFileSync(path) as FileResult;
   }
 
   Set<String> get loadedLibraryUriSet {
@@ -3448,10 +3385,10 @@
   }
 
   Future<ResolvedUnitResult> getResultValid(String path) async {
-    return await getResult2(path) as ResolvedUnitResult;
+    return await getResult(path) as ResolvedUnitResult;
   }
 
   Future<LibraryElementResult> getLibraryByUriValid(String uriStr) async {
-    return await getLibraryByUri2(uriStr) as LibraryElementResult;
+    return await getLibraryByUri(uriStr) as LibraryElementResult;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 9512ac4..700ec3d 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -468,7 +468,7 @@
 ''');
     var element = findElement.unnamedConstructor('A');
 
-    var otherUnitResult = await driver.getResult2(other) as ResolvedUnitResult;
+    var otherUnitResult = await driver.getResult(other) as ResolvedUnitResult;
     CompilationUnit otherUnit = otherUnitResult.unit;
     Element main = otherUnit.declaredElement!.functions[0];
     var expected = [
@@ -1894,7 +1894,7 @@
 ''');
 
     var aLibraryResult =
-        await driver.getLibraryByUri2(aUri) as LibraryElementResult;
+        await driver.getLibraryByUri(aUri) as LibraryElementResult;
     ClassElement aClass = aLibraryResult.element.getType('A')!;
 
     // Search by 'type'.
@@ -1940,7 +1940,7 @@
     newFile(cccFilePath, content: 'class C implements List {}');
 
     var coreLibResult =
-        await driver.getLibraryByUri2('dart:core') as LibraryElementResult;
+        await driver.getLibraryByUri('dart:core') as LibraryElementResult;
     ClassElement listElement = coreLibResult.element.getType('List')!;
 
     var searchedFiles = SearchedFiles();
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 564c216..d9f6f0f 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -27,7 +27,7 @@
 @reflectiveTest
 class AnalysisSessionImpl_BazelWorkspaceTest
     extends BazelWorkspaceResolutionTest {
-  void test_getErrors2_notFileOfUri() async {
+  void test_getErrors_notFileOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
 
@@ -37,7 +37,7 @@
     expect(result, isA<NotPathOfUriResult>());
   }
 
-  void test_getErrors2_valid() async {
+  void test_getErrors_valid() async {
     var file = newFile(
       '$workspaceRootPath/dart/my/lib/a.dart',
       content: 'var x = 0',
@@ -50,7 +50,7 @@
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
 
-  void test_getParsedLibrary2_notFileOfUri() async {
+  void test_getParsedLibrary_notFileOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
 
@@ -60,7 +60,7 @@
     expect(result, isA<NotPathOfUriResult>());
   }
 
-  void test_getResolvedLibrary2_notFileOfUri() async {
+  void test_getResolvedLibrary_notFileOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
 
@@ -70,7 +70,7 @@
     expect(result, isA<NotPathOfUriResult>());
   }
 
-  void test_getResolvedUnit2_notFileOfUri() async {
+  void test_getResolvedUnit_notFileOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
 
@@ -80,7 +80,7 @@
     expect(result, isA<NotPathOfUriResult>());
   }
 
-  void test_getResolvedUnit2_valid() async {
+  void test_getResolvedUnit_valid() async {
     var file = newFile(
       '$workspaceRootPath/dart/my/lib/a.dart',
       content: 'class A {}',
@@ -93,7 +93,7 @@
     expect(result.uri.toString(), 'package:dart.my/a.dart');
   }
 
-  void test_getUnitElement2_invalidPath_notAbsolute() async {
+  void test_getUnitElement_invalidPath_notAbsolute() async {
     var file = newFile(
       '$workspaceRootPath/dart/my/lib/a.dart',
       content: 'class A {}',
@@ -104,7 +104,7 @@
     expect(result, isA<InvalidPathResult>());
   }
 
-  void test_getUnitElement2_notPathOfUri() async {
+  void test_getUnitElement_notPathOfUri() async {
     var relPath = 'dart/my/lib/a.dart';
     newFile('$workspaceRootPath/bazel-bin/$relPath');
 
@@ -114,7 +114,7 @@
     expect(result, isA<NotPathOfUriResult>());
   }
 
-  void test_getUnitElement2_valid() async {
+  void test_getUnitElement_valid() async {
     var file = newFile(
       '$workspaceRootPath/dart/my/lib/a.dart',
       content: 'class A {}',
@@ -166,7 +166,7 @@
     testPath = convertPath('/home/test/lib/test.dart');
   }
 
-  test_getErrors2() async {
+  test_getErrors() async {
     newFile(testPath, content: 'class C {');
     var errorsResult = await session.getErrorsValid(testPath);
     expect(errorsResult.session, session);
@@ -174,17 +174,17 @@
     expect(errorsResult.errors, isNotEmpty);
   }
 
-  test_getErrors2_invalidPath_notAbsolute() async {
+  test_getErrors_invalidPath_notAbsolute() async {
     var errorsResult = await session.getErrors('not_absolute.dart');
     expect(errorsResult, isA<InvalidPathResult>());
   }
 
-  test_getFile2_invalidPath_notAbsolute() async {
+  test_getFile_invalidPath_notAbsolute() async {
     var errorsResult = session.getFile('not_absolute.dart');
     expect(errorsResult, isA<InvalidPathResult>());
   }
 
-  test_getFileSync2_library() async {
+  test_getFileSync_library() async {
     var path = convertPath('/home/test/lib/a.dart');
     newFile(path, content: '');
     var file = session.getFileValid(path);
@@ -193,7 +193,7 @@
     expect(file.isPart, isFalse);
   }
 
-  test_getFileSync2_part() async {
+  test_getFileSync_part() async {
     var path = convertPath('/home/test/lib/a.dart');
     newFile(path, content: 'part of lib;');
     var file = session.getFileValid(path);
@@ -202,7 +202,7 @@
     expect(file.isPart, isTrue);
   }
 
-  test_getLibraryByUri2() async {
+  test_getLibraryByUri() async {
     newFile(testPath, content: r'''
 class A {}
 class B {}
@@ -215,12 +215,12 @@
     expect(library.getType('C'), isNull);
   }
 
-  test_getLibraryByUri2_unresolvedUri() async {
+  test_getLibraryByUri_unresolvedUri() async {
     var result = await session.getLibraryByUri('package:foo/foo.dart');
     expect(result, isA<CannotResolveUriResult>());
   }
 
-  test_getParsedLibrary2() async {
+  test_getParsedLibrary() async {
     newFile(testPath, content: r'''
 class A {}
 class B {}
@@ -241,74 +241,6 @@
     }
   }
 
-  test_getParsedLibrary2_invalidPath_notAbsolute() async {
-    var result = session.getParsedLibrary('not_absolute.dart');
-    expect(result, isA<InvalidPathResult>());
-  }
-
-  test_getParsedLibrary2_notLibrary() async {
-    newFile(testPath, content: 'part of "a.dart";');
-    expect(session.getParsedLibrary(testPath), isA<NotLibraryButPartResult>());
-  }
-
-  test_getParsedLibrary2_parts() async {
-    var a = convertPath('/home/test/lib/a.dart');
-    var b = convertPath('/home/test/lib/b.dart');
-    var c = convertPath('/home/test/lib/c.dart');
-
-    var aContent = r'''
-part 'b.dart';
-part 'c.dart';
-
-class A {}
-''';
-
-    var bContent = r'''
-part of 'a.dart';
-
-class B1 {}
-class B2 {}
-''';
-
-    var cContent = r'''
-part of 'a.dart';
-
-class C1 {}
-class C2 {}
-class C3 {}
-''';
-
-    newFile(a, content: aContent);
-    newFile(b, content: bContent);
-    newFile(c, content: cContent);
-
-    var parsedLibrary = session.getParsedLibraryValid(a);
-    expect(parsedLibrary.path, a);
-    expect(parsedLibrary.uri, Uri.parse('package:test/a.dart'));
-    expect(parsedLibrary.units, hasLength(3));
-
-    {
-      var aUnit = parsedLibrary.units[0];
-      expect(aUnit.path, a);
-      expect(aUnit.uri, Uri.parse('package:test/a.dart'));
-      expect(aUnit.unit.declarations, hasLength(1));
-    }
-
-    {
-      var bUnit = parsedLibrary.units[1];
-      expect(bUnit.path, b);
-      expect(bUnit.uri, Uri.parse('package:test/b.dart'));
-      expect(bUnit.unit.declarations, hasLength(2));
-    }
-
-    {
-      var cUnit = parsedLibrary.units[2];
-      expect(cUnit.path, c);
-      expect(cUnit.uri, Uri.parse('package:test/c.dart'));
-      expect(cUnit.unit.declarations, hasLength(3));
-    }
-  }
-
   test_getParsedLibrary_getElementDeclaration_class() async {
     newFile(testPath, content: r'''
 class A {}
@@ -328,7 +260,7 @@
     expect(node.length, 10);
   }
 
-  test_getParsedLibrary_getElementDeclaration_notThisLibrary2() async {
+  test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
     newFile(testPath, content: '');
 
     var resolvedUnit =
@@ -391,7 +323,75 @@
     );
   }
 
-  test_getParsedLibraryByElement2() async {
+  test_getParsedLibrary_invalidPath_notAbsolute() async {
+    var result = session.getParsedLibrary('not_absolute.dart');
+    expect(result, isA<InvalidPathResult>());
+  }
+
+  test_getParsedLibrary_notLibrary() async {
+    newFile(testPath, content: 'part of "a.dart";');
+    expect(session.getParsedLibrary(testPath), isA<NotLibraryButPartResult>());
+  }
+
+  test_getParsedLibrary_parts() async {
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+    var c = convertPath('/home/test/lib/c.dart');
+
+    var aContent = r'''
+part 'b.dart';
+part 'c.dart';
+
+class A {}
+''';
+
+    var bContent = r'''
+part of 'a.dart';
+
+class B1 {}
+class B2 {}
+''';
+
+    var cContent = r'''
+part of 'a.dart';
+
+class C1 {}
+class C2 {}
+class C3 {}
+''';
+
+    newFile(a, content: aContent);
+    newFile(b, content: bContent);
+    newFile(c, content: cContent);
+
+    var parsedLibrary = session.getParsedLibraryValid(a);
+    expect(parsedLibrary.path, a);
+    expect(parsedLibrary.uri, Uri.parse('package:test/a.dart'));
+    expect(parsedLibrary.units, hasLength(3));
+
+    {
+      var aUnit = parsedLibrary.units[0];
+      expect(aUnit.path, a);
+      expect(aUnit.uri, Uri.parse('package:test/a.dart'));
+      expect(aUnit.unit.declarations, hasLength(1));
+    }
+
+    {
+      var bUnit = parsedLibrary.units[1];
+      expect(bUnit.path, b);
+      expect(bUnit.uri, Uri.parse('package:test/b.dart'));
+      expect(bUnit.unit.declarations, hasLength(2));
+    }
+
+    {
+      var cUnit = parsedLibrary.units[2];
+      expect(cUnit.path, c);
+      expect(cUnit.uri, Uri.parse('package:test/c.dart'));
+      expect(cUnit.unit.declarations, hasLength(3));
+    }
+  }
+
+  test_getParsedLibraryByElement() async {
     newFile(testPath, content: '');
 
     var libraryResult = await session.getLibraryByUriValid(
@@ -406,7 +406,7 @@
     expect(parsedLibrary.units, hasLength(1));
   }
 
-  test_getParsedLibraryByElement2_differentSession() async {
+  test_getParsedLibraryByElement_differentSession() async {
     newFile(testPath, content: '');
 
     var libraryResult = await session.getLibraryByUriValid(
@@ -421,7 +421,7 @@
     expect(result, isA<NotElementOfThisSessionResult>());
   }
 
-  test_getParsedUnit2() async {
+  test_getParsedUnit() async {
     newFile(testPath, content: r'''
 class A {}
 class B {}
@@ -434,7 +434,7 @@
     expect(unitResult.unit.declarations, hasLength(2));
   }
 
-  test_getParsedUnit2_invalidPath_notAbsolute() async {
+  test_getParsedUnit_invalidPath_notAbsolute() async {
     var result = session.getParsedUnit('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
@@ -505,18 +505,6 @@
     expect(bNode.declaredElement!.name, 'B');
   }
 
-  test_getResolvedLibrary2_invalidPath_notAbsolute() async {
-    var result = await session.getResolvedLibrary('not_absolute.dart');
-    expect(result, isA<InvalidPathResult>());
-  }
-
-  test_getResolvedLibrary2_notLibrary() async {
-    newFile(testPath, content: 'part of "a.dart";');
-
-    var result = await session.getResolvedLibrary(testPath);
-    expect(result, isA<NotLibraryButPartResult>());
-  }
-
   test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
     newFile(testPath, content: '');
 
@@ -576,7 +564,19 @@
     );
   }
 
-  test_getResolvedLibraryByElement2() async {
+  test_getResolvedLibrary_invalidPath_notAbsolute() async {
+    var result = await session.getResolvedLibrary('not_absolute.dart');
+    expect(result, isA<InvalidPathResult>());
+  }
+
+  test_getResolvedLibrary_notLibrary() async {
+    newFile(testPath, content: 'part of "a.dart";');
+
+    var result = await session.getResolvedLibrary(testPath);
+    expect(result, isA<NotLibraryButPartResult>());
+  }
+
+  test_getResolvedLibraryByElement() async {
     newFile(testPath, content: '');
 
     var libraryResult = await session.getLibraryByUriValid(
@@ -592,7 +592,7 @@
     expect(result.units[0].unit.declaredElement, isNotNull);
   }
 
-  test_getResolvedLibraryByElement2_differentSession() async {
+  test_getResolvedLibraryByElement_differentSession() async {
     newFile(testPath, content: '');
 
     var libraryResult = await session.getLibraryByUriValid(
@@ -607,7 +607,7 @@
     expect(result, isA<NotElementOfThisSessionResult>());
   }
 
-  test_getResolvedUnit2() async {
+  test_getResolvedUnit() async {
     newFile(testPath, content: r'''
 class A {}
 class B {}
@@ -623,7 +623,7 @@
     expect(unitResult.libraryElement, isNotNull);
   }
 
-  test_getUnitElement2() async {
+  test_getUnitElement() async {
     newFile(testPath, content: r'''
 class A {}
 class B {}
diff --git a/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart
index 6b2a23b..c592ea3 100644
--- a/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart
@@ -32,7 +32,7 @@
   test_constField() async {
     await assertErrorsInCode(r'''
 main() {
-  const {double.INFINITY: 0};
+  const {double.infinity: 0};
 }
 ''', [
       error(
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
index 2024150..7fe6cbe 100644
--- a/pkg/analyzer/test/util/id_testing_helper.dart
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -171,7 +171,7 @@
   var results = <Uri, ResolvedUnitResult>{};
   for (var testUri in testUris) {
     var path = resourceProvider.convertPath(testUri.path);
-    var result = await driver.getResult2(path) as ResolvedUnitResult;
+    var result = await driver.getResult(path) as ResolvedUnitResult;
     var errors =
         result.errors.where((e) => e.severity == Severity.error).toList();
     if (errors.isNotEmpty) {
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 1b1e423..4b3846b 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -113,7 +113,7 @@
   /// Fills [errorsResults] using [files].
   Future<void> prepareErrors() async {
     for (var path in files) {
-      var errorsResult = await analysisDriver.getErrors2(path);
+      var errorsResult = await analysisDriver.getErrors(path);
       if (errorsResult is ErrorsResult) {
         errorsResults.add(errorsResult);
       }
@@ -209,7 +209,7 @@
     var libraryPath = libraryFile.path;
     analysisDriver.priorityFiles = [libraryPath];
     var elementResult =
-        await analysisDriver.getUnitElement2(libraryPath) as UnitElementResult;
+        await analysisDriver.getUnitElement(libraryPath) as UnitElementResult;
     return elementResult.element.library;
   }
 
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index 16a2732..f496762 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -312,7 +312,7 @@
     for (var message in error.contextMessages) {
       var session = result.session.analysisContext;
       if (session is DriverBasedAnalysisContext) {
-        var fileResult = session.driver.getFileSync2(message.filePath);
+        var fileResult = session.driver.getFileSync(message.filePath);
         if (fileResult is FileResult) {
           var lineInfo = fileResult?.lineInfo;
           var location = lineInfo.getLocation(message.offset);
diff --git a/pkg/analyzer_plugin/lib/plugin/plugin.dart b/pkg/analyzer_plugin/lib/plugin/plugin.dart
index 14ede54..f56f362 100644
--- a/pkg/analyzer_plugin/lib/plugin/plugin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/plugin.dart
@@ -161,7 +161,7 @@
       throw RequestFailure(
           RequestErrorFactory.pluginError('Failed to analyze $path', null));
     }
-    var result = await driver.getResult2(path);
+    var result = await driver.getResult(path);
     if (result is! ResolvedUnitResult) {
       // Return an error from the request.
       throw RequestFailure(
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 133f7d5..fcec048 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -590,9 +590,9 @@
 
   Future<void> test_already_migrated_field() async {
     await analyze('''
-double f() => double.NAN;
+double f() => double.nan;
 ''');
-    var nanElement = typeProvider.doubleType.element.getField('NAN')!;
+    var nanElement = typeProvider.doubleType.element.getField('nan')!;
     assertEdge(variables!.decoratedElementType(nanElement).node,
         decoratedTypeAnnotation('double f').node,
         hard: false);
diff --git a/tools/VERSION b/tools/VERSION
index 0b145e6..bb8c8f5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 247
+PRERELEASE 248
 PRERELEASE_PATCH 0
\ No newline at end of file
