Version 2.17.0-62.0.dev

Merge commit '1c2ecfe6244e3a6b4f7f82a2bd350bd35f27df85' into 'dev'
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 5a90033..fb40314 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -2,16 +2,10 @@
 // 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/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/test_utilities/mock_sdk.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -129,85 +123,56 @@
 }
 
 @reflectiveTest
-class AnalysisSessionImplTest with ResourceProviderMixin {
-  late final AnalysisContextCollection contextCollection;
-  late final AnalysisContext context;
-  late final AnalysisSessionImpl session;
-
-  late final String testContextPath;
-  late final String aaaContextPath;
-  late final String bbbContextPath;
-
-  late final String testPath;
-
-  void setUp() {
-    var sdkRoot = newFolder('/sdk');
-    createMockSdk(
-      resourceProvider: resourceProvider,
-      root: sdkRoot,
-    );
-
-    testContextPath = newFolder('/home/test').path;
-    aaaContextPath = newFolder('/home/aaa').path;
-    bbbContextPath = newFolder('/home/bbb').path;
-
-    newDotPackagesFile('/home/test', content: r'''
-test:lib/
-''');
-
-    contextCollection = AnalysisContextCollectionImpl(
-      includedPaths: [testContextPath, aaaContextPath, bbbContextPath],
-      resourceProvider: resourceProvider,
-      sdkPath: sdkRoot.path,
-    );
-    context = contextCollection.contextFor(testContextPath);
-    session = context.currentSession as AnalysisSessionImpl;
-
-    testPath = convertPath('/home/test/lib/test.dart');
-  }
-
+class AnalysisSessionImplTest extends PubPackageResolutionTest {
   test_getErrors() async {
-    newFile(testPath, content: 'class C {');
-    var errorsResult = await session.getErrorsValid(testPath);
+    var test = newFile(testFilePath, content: 'class C {');
+
+    var session = contextFor(testFilePath).currentSession;
+    var errorsResult = await session.getErrorsValid(test.path);
     expect(errorsResult.session, session);
-    expect(errorsResult.path, testPath);
+    expect(errorsResult.path, test.path);
     expect(errorsResult.errors, isNotEmpty);
   }
 
   test_getErrors_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var errorsResult = await session.getErrors('not_absolute.dart');
     expect(errorsResult, isA<InvalidPathResult>());
   }
 
   test_getFile_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var errorsResult = session.getFile('not_absolute.dart');
     expect(errorsResult, isA<InvalidPathResult>());
   }
 
   test_getFileSync_library() async {
-    var path = convertPath('/home/test/lib/a.dart');
-    newFile(path, content: '');
-    var file = session.getFileValid(path);
-    expect(file.path, path);
+    var a = newFile('$testPackageLibPath/a.dart', content: '');
+
+    var session = contextFor(testFilePath).currentSession;
+    var file = session.getFileValid(a.path);
+    expect(file.path, a.path);
     expect(file.uri.toString(), 'package:test/a.dart');
     expect(file.isPart, isFalse);
   }
 
   test_getFileSync_part() async {
-    var path = convertPath('/home/test/lib/a.dart');
-    newFile(path, content: 'part of lib;');
-    var file = session.getFileValid(path);
-    expect(file.path, path);
+    var a = newFile('$testPackageLibPath/a.dart', content: 'part of lib;');
+
+    var session = contextFor(testFilePath).currentSession;
+    var file = session.getFileValid(a.path);
+    expect(file.path, a.path);
     expect(file.uri.toString(), 'package:test/a.dart');
     expect(file.isPart, isTrue);
   }
 
   test_getLibraryByUri() async {
-    newFile(testPath, content: r'''
+    newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
+    var session = contextFor(testFilePath).currentSession;
     var result = await session.getLibraryByUriValid('package:test/test.dart');
     var library = result.element;
     expect(library.getType('A'), isNotNull);
@@ -216,39 +181,42 @@
   }
 
   test_getLibraryByUri_unresolvedUri() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = await session.getLibraryByUri('package:foo/foo.dart');
     expect(result, isA<CannotResolveUriResult>());
   }
 
   test_getParsedLibrary() async {
-    newFile(testPath, content: r'''
+    var test = newFile('$testPackageLibPath/a.dart', content: r'''
 class A {}
 class B {}
 ''');
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
     expect(parsedLibrary.session, session);
 
     expect(parsedLibrary.units, hasLength(1));
     {
       var parsedUnit = parsedLibrary.units[0];
       expect(parsedUnit.session, session);
-      expect(parsedUnit.path, testPath);
-      expect(parsedUnit.uri, Uri.parse('package:test/test.dart'));
+      expect(parsedUnit.path, test.path);
+      expect(parsedUnit.uri, Uri.parse('package:test/a.dart'));
       expect(parsedUnit.unit.declarations, hasLength(2));
     }
   }
 
   test_getParsedLibrary_getElementDeclaration_class() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
     var element = libraryResult.element.getType('A')!;
     var declaration = parsedLibrary.getElementDeclaration(element)!;
@@ -259,14 +227,15 @@
   }
 
   test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var resolvedUnit =
-        await session.getResolvedUnit(testPath) as ResolvedUnitResult;
+        await session.getResolvedUnit(test.path) as ResolvedUnitResult;
     var typeProvider = resolvedUnit.typeProvider;
     var intClass = typeProvider.intType.element;
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
     expect(() {
       parsedLibrary.getElementDeclaration(intClass);
@@ -274,13 +243,14 @@
   }
 
   test_getParsedLibrary_getElementDeclaration_synthetic() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 int foo = 0;
 ''');
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
-    var unitResult = await session.getUnitElementValid(testPath);
+    var unitResult = await session.getUnitElementValid(test.path);
     var fooElement = unitResult.element.topLevelVariables[0];
     expect(fooElement.name, 'foo');
 
@@ -298,13 +268,14 @@
   }
 
   test_getParsedLibrary_invalidPartUri() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 part 'a.dart';
 part ':[invalid uri].dart';
 part 'c.dart';
 ''');
 
-    var parsedLibrary = session.getParsedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(test.path);
 
     expect(parsedLibrary.units, hasLength(3));
     expect(
@@ -322,20 +293,18 @@
   }
 
   test_getParsedLibrary_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     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>());
+    var test = newFile(testFilePath, content: 'part of "a.dart";');
+    var session = contextFor(testFilePath).currentSession;
+    expect(session.getParsedLibrary(test.path), 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';
@@ -358,38 +327,40 @@
 class C3 {}
 ''';
 
-    newFile(a, content: aContent);
-    newFile(b, content: bContent);
-    newFile(c, content: cContent);
+    var a = newFile('$testPackageLibPath/a.dart', content: aContent);
+    var b = newFile('$testPackageLibPath/b.dart', content: bContent);
+    var c = newFile('$testPackageLibPath/c.dart', content: cContent);
 
-    var parsedLibrary = session.getParsedLibraryValid(a);
+    var session = contextFor(testFilePath).currentSession;
+    var parsedLibrary = session.getParsedLibraryValid(a.path);
     expect(parsedLibrary.units, hasLength(3));
 
     {
       var aUnit = parsedLibrary.units[0];
-      expect(aUnit.path, a);
+      expect(aUnit.path, a.path);
       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.path, b.path);
       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.path, c.path);
       expect(cUnit.uri, Uri.parse('package:test/c.dart'));
       expect(cUnit.unit.declarations, hasLength(3));
     }
   }
 
   test_getParsedLibraryByElement() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
@@ -401,55 +372,54 @@
 
     {
       var unit = parsedLibrary.units[0];
-      expect(unit.path, testPath);
+      expect(unit.path, test.path);
       expect(unit.uri, Uri.parse('package:test/test.dart'));
       expect(unit.unit, isNotNull);
     }
   }
 
   test_getParsedLibraryByElement_differentSession() async {
-    newFile(testPath, content: '');
+    newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
     var element = libraryResult.element;
 
-    var aaaSession =
-        contextCollection.contextFor(aaaContextPath).currentSession;
+    var aaaSession = contextFor('$workspaceRootPath/aaa').currentSession;
 
     var result = aaaSession.getParsedLibraryByElement(element);
     expect(result, isA<NotElementOfThisSessionResult>());
   }
 
   test_getParsedUnit() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
-    var unitResult = session.getParsedUnitValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var unitResult = session.getParsedUnitValid(test.path);
     expect(unitResult.session, session);
-    expect(unitResult.path, testPath);
+    expect(unitResult.path, test.path);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
     expect(unitResult.unit.declarations, hasLength(2));
   }
 
   test_getParsedUnit_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = session.getParsedUnit('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
   test_getResolvedLibrary() async {
-    var a = convertPath('/home/test/lib/a.dart');
-    var b = convertPath('/home/test/lib/b.dart');
-
     var aContent = r'''
 part 'b.dart';
 
 class A /*a*/ {}
 ''';
-    newFile(a, content: aContent);
+    var a = newFile('$testPackageLibPath/a.dart', content: aContent);
 
     var bContent = r'''
 part of 'a.dart';
@@ -457,9 +427,10 @@
 class B /*b*/ {}
 class B2 extends X {}
 ''';
-    newFile(b, content: bContent);
+    var b = newFile('$testPackageLibPath/b.dart', content: bContent);
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(a);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(a.path);
     expect(resolvedLibrary.session, session);
 
     var typeProvider = resolvedLibrary.typeProvider;
@@ -472,7 +443,7 @@
     var bClass = libraryElement.getType('B')!;
 
     var aUnitResult = resolvedLibrary.units[0];
-    expect(aUnitResult.path, a);
+    expect(aUnitResult.path, a.path);
     expect(aUnitResult.uri, Uri.parse('package:test/a.dart'));
     expect(aUnitResult.content, aContent);
     expect(aUnitResult.unit, isNotNull);
@@ -481,7 +452,7 @@
     expect(aUnitResult.errors, isEmpty);
 
     var bUnitResult = resolvedLibrary.units[1];
-    expect(bUnitResult.path, b);
+    expect(bUnitResult.path, b.path);
     expect(bUnitResult.uri, Uri.parse('package:test/b.dart'));
     expect(bUnitResult.content, bContent);
     expect(bUnitResult.unit, isNotNull);
@@ -505,9 +476,10 @@
   }
 
   test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
 
     expect(() {
       var intClass = resolvedLibrary.typeProvider.intType.element;
@@ -516,11 +488,12 @@
   }
 
   test_getResolvedLibrary_getElementDeclaration_synthetic() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 int foo = 0;
 ''');
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
     var unitElement = resolvedLibrary.element.definingCompilationUnit;
 
     var fooElement = unitElement.topLevelVariables[0];
@@ -540,13 +513,14 @@
   }
 
   test_getResolvedLibrary_invalidPartUri() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 part 'a.dart';
 part ':[invalid uri].dart';
 part 'c.dart';
 ''');
 
-    var resolvedLibrary = await session.getResolvedLibraryValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
 
     expect(resolvedLibrary.units, hasLength(3));
     expect(
@@ -564,20 +538,23 @@
   }
 
   test_getResolvedLibrary_invalidPath_notAbsolute() async {
+    var session = contextFor(testFilePath).currentSession;
     var result = await session.getResolvedLibrary('not_absolute.dart');
     expect(result, isA<InvalidPathResult>());
   }
 
   test_getResolvedLibrary_notLibrary() async {
-    newFile(testPath, content: 'part of "a.dart";');
+    var test = newFile(testFilePath, content: 'part of "a.dart";');
 
-    var result = await session.getResolvedLibrary(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var result = await session.getResolvedLibrary(test.path);
     expect(result, isA<NotLibraryButPartResult>());
   }
 
   test_getResolvedLibraryByElement() async {
-    newFile(testPath, content: '');
+    var test = newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
@@ -586,36 +563,37 @@
     var result = await session.getResolvedLibraryByElementValid(element);
     expect(result.session, session);
     expect(result.units, hasLength(1));
-    expect(result.units[0].path, testPath);
+    expect(result.units[0].path, test.path);
     expect(result.units[0].uri, Uri.parse('package:test/test.dart'));
     expect(result.units[0].unit.declaredElement, isNotNull);
   }
 
   test_getResolvedLibraryByElement_differentSession() async {
-    newFile(testPath, content: '');
+    newFile(testFilePath, content: '');
 
+    var session = contextFor(testFilePath).currentSession;
     var libraryResult = await session.getLibraryByUriValid(
       'package:test/test.dart',
     );
     var element = libraryResult.element;
 
-    var aaaSession =
-        contextCollection.contextFor(aaaContextPath).currentSession;
+    var aaaSession = contextFor('$workspaceRootPath/aaa').currentSession;
 
     var result = await aaaSession.getResolvedLibraryByElement(element);
     expect(result, isA<NotElementOfThisSessionResult>());
   }
 
   test_getResolvedUnit() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
+    var session = contextFor(testFilePath).currentSession;
     var unitResult =
-        await session.getResolvedUnit(testPath) as ResolvedUnitResult;
+        await session.getResolvedUnit(test.path) as ResolvedUnitResult;
     expect(unitResult.session, session);
-    expect(unitResult.path, testPath);
+    expect(unitResult.path, test.path);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
     expect(unitResult.unit.declarations, hasLength(2));
     expect(unitResult.typeProvider, isNotNull);
@@ -623,19 +601,21 @@
   }
 
   test_getUnitElement() async {
-    newFile(testPath, content: r'''
+    var test = newFile(testFilePath, content: r'''
 class A {}
 class B {}
 ''');
 
-    var unitResult = await session.getUnitElementValid(testPath);
+    var session = contextFor(testFilePath).currentSession;
+    var unitResult = await session.getUnitElementValid(test.path);
     expect(unitResult.session, session);
-    expect(unitResult.path, testPath);
+    expect(unitResult.path, test.path);
     expect(unitResult.uri, Uri.parse('package:test/test.dart'));
     expect(unitResult.element.classes, hasLength(2));
   }
 
   test_resourceProvider() async {
+    var session = contextFor(testFilePath).currentSession;
     expect(session.resourceProvider, resourceProvider);
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index 020f99a..00374dc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 61
+PRERELEASE 62
 PRERELEASE_PATCH 0
\ No newline at end of file