Revert "Refactor PubWorkspace into PackageConfigWorkspace"

This reverts commit 43fb59f4dc1991863982d5805d2551ed9fb3a28d.

Reason for revert: Breaking Dart SDK -> Flutter Engine roller. See https://github.com/flutter/flutter/issues/142253

Original change's description:
> Refactor PubWorkspace into PackageConfigWorkspace
>
>  - use package_config.json as marker file for workspace.
>  - workspace can have multiple packages, they can be either PubPackages (marker pubspec.yaml) or BasicWorkspace.
>  - add package info (pubspec) to resolution salt.
>  - removed duplication of finding package_config.json from ContextLocator, as this is now done while creating workspace.
>  - some test/s setup/expectations were changed since we now use package config as marker for workspace instead of pubspec.
>
> Change-Id: I091a4a686c6b1d8c14858aefd9843a8d9c8efa25
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/345346
> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
> Commit-Queue: Keerti Parthasarathy <keertip@google.com>
> Reviewed-by: Konstantin Shcheglov <scheglov@google.com>

Change-Id: I59adf5b26d25e360bcf962323db688156774c767
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/348364
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Commit-Queue: Jackson Gardner <jacksongardner@google.com>
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index d0e6f4b..bfcceaf 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -373,8 +373,9 @@
       var analysisOptions = driver.getAnalysisOptionsForFile(file);
       var content = file.readAsStringSync();
       var lineInfo = LineInfo.fromContent(content);
-      var sdkVersionConstraint =
-          (package is PubPackage) ? package.sdkVersionConstraint : null;
+      var sdkVersionConstraint = (package is PubWorkspacePackage)
+          ? package.sdkVersionConstraint
+          : null;
       var errors = analyzeAnalysisOptions(
         file.createSource(),
         content,
diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
index f8813e6..4e1b980 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart
@@ -111,7 +111,7 @@
     var package =
         analysisContext.contextRoot.workspace.findPackageFor(optionsFile.path);
     var sdkVersionConstraint =
-        (package is PubPackage) ? package.sdkVersionConstraint : null;
+        (package is PubWorkspacePackage) ? package.sdkVersionConstraint : null;
     var errors = analyzeAnalysisOptions(
       optionsFile.createSource(),
       content,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart
index 2dbcdea..a866f27 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart
@@ -62,7 +62,7 @@
     final contextRoot = session.analysisContext.contextRoot;
     final package = contextRoot.workspace.findPackageFor(optionsFile.path);
     final sdkVersionConstraint =
-        (package is PubPackage) ? package.sdkVersionConstraint : null;
+        (package is PubWorkspacePackage) ? package.sdkVersionConstraint : null;
 
     final errors = analyzeAnalysisOptions(
       optionsFile.createSource(),
diff --git a/pkg/analysis_server/lib/src/services/user_prompts/dart_fix_prompt_manager.dart b/pkg/analysis_server/lib/src/services/user_prompts/dart_fix_prompt_manager.dart
index d223acb..7fd9502 100644
--- a/pkg/analysis_server/lib/src/services/user_prompts/dart_fix_prompt_manager.dart
+++ b/pkg/analysis_server/lib/src/services/user_prompts/dart_fix_prompt_manager.dart
@@ -73,9 +73,8 @@
     final constraintMap = <String, List<String?>>{};
     for (final context in server.contextManager.analysisContexts) {
       final workspace = context.contextRoot.workspace;
-      final sdkConstraints = workspace is PackageConfigWorkspace
-          ? workspace.allPackages
-              .whereType<PubPackage>()
+      final sdkConstraints = workspace is PubWorkspace
+          ? workspace.pubPackages
               .map((p) => p.sdkVersionConstraint?.toString())
               .toList()
           : <String>[];
diff --git a/pkg/analysis_server/test/analysis_server_base.dart b/pkg/analysis_server/test/analysis_server_base.dart
index 8eaf998..8790fd5 100644
--- a/pkg/analysis_server/test/analysis_server_base.dart
+++ b/pkg/analysis_server/test/analysis_server_base.dart
@@ -259,7 +259,6 @@
   @override
   void createDefaultFiles() {
     writeTestPackageConfig();
-    writeTestPackagePubspecYamlFile('name: test');
 
     writeTestPackageAnalysisOptionsFile(
       AnalysisOptionsFileConfig(
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 77c6162..86674e7 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -111,7 +111,7 @@
     // Subscribe to STATUS so we'll know when analysis is done.
     server.serverServices = {ServerService.STATUS};
     final projectRoot = convertPath('/foo');
-    final projectTestFile = convertPath('/foo/lib/test.dart');
+    final projectTestFile = convertPath('/foo/test.dart');
     final projectPackageConfigFile =
         convertPath('/foo/.dart_tool/package_config.json');
 
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index f99bfd6..2930f7f 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -99,9 +99,6 @@
     // Both a.dart and b.dart are analyzed.
     assertNotificationsText(r'''
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 AnalysisErrors
@@ -124,14 +121,10 @@
 AnalysisFlush
   /home/test/lib/a.dart
   /home/test/lib/b.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -149,9 +142,6 @@
     // a.dart was analyzed
     assertNotificationsText(r'''
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -168,14 +158,10 @@
     assertNotificationsText(r'''
 AnalysisFlush
   /home/test/lib/a.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: notEmpty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -197,9 +183,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -232,9 +215,6 @@
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
-AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
 ''');
 
     _createFilesWithErrors([
@@ -269,9 +249,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/b.dart
   errors: notEmpty
 ''');
@@ -315,9 +292,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/b.dart
   errors: notEmpty
 ''');
@@ -351,9 +325,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -390,9 +361,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -437,9 +405,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: notEmpty
 ''');
@@ -460,14 +425,10 @@
 AnalysisFlush
   /home/test/analysis_options.yaml
   /home/test/lib/test.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: empty
 ''');
@@ -492,9 +453,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -513,7 +471,6 @@
 AnalysisFlush
   /home/test/analysis_options.yaml
   /home/test/lib/a.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
@@ -541,9 +498,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -582,9 +536,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 AnalysisErrors
@@ -609,14 +560,10 @@
   /home/test/analysis_options.yaml
   /home/test/lib/a.dart
   /home/test/lib/c.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 AnalysisErrors
@@ -650,9 +597,6 @@
   file: /home/test/AndroidManifest.xml
   errors: notEmpty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -695,9 +639,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 AnalysisErrors
@@ -745,9 +686,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/b.dart
   errors: notEmpty
 ''');
@@ -797,9 +735,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/b.dart
   errors: notEmpty
 ''');
@@ -838,9 +773,6 @@
   file: /home/test/lib/fix_data/foo.yaml
   errors: notEmpty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -886,9 +818,6 @@
   file: /home/test/lib/fix_data.yaml
   errors: notEmpty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -933,9 +862,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: empty
 ''');
@@ -987,9 +913,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: notEmpty
 ''');
@@ -1009,14 +932,10 @@
 AnalysisFlush
   /home/test/analysis_options.yaml
   /home/test/lib/test.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: empty
 ''');
@@ -1045,9 +964,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1063,10 +979,6 @@
 AnalysisFlush
   /home/test/analysis_options.yaml
   /home/test/lib/a.dart
-  /home/test/pubspec.yaml
-AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
 AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
@@ -1102,9 +1014,6 @@
   file: /home/test/AndroidManifest.xml
   errors: notEmpty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -1139,9 +1048,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1213,9 +1119,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1261,9 +1164,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/b.dart
   errors: empty
 ''');
@@ -1301,9 +1201,6 @@
   file: /home/test/lib/fix_data.yaml
   errors: notEmpty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: empty
 ''');
@@ -1347,9 +1244,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: empty
 ''');
@@ -1368,14 +1262,10 @@
 AnalysisFlush
   /home/test/analysis_options.yaml
   /home/test/lib/test.dart
-  /home/test/pubspec.yaml
 AnalysisErrors
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: notEmpty
 ''');
@@ -1399,9 +1289,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1470,9 +1357,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/foo/lib/a.dart
   errors: empty
 AnalysisErrors
@@ -1629,9 +1513,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 AnalysisErrors
@@ -1693,9 +1574,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1735,9 +1613,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1786,9 +1661,6 @@
 
     assertNotificationsText(r'''
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/a.dart
   errors: notEmpty
 ''');
@@ -1817,9 +1689,6 @@
 AnalysisErrors
   file: /home/test/AndroidManifest.xml
   errors: notEmpty
-AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
 ''');
   }
 
@@ -1838,9 +1707,6 @@
 AnalysisErrors
   file: /home/test/lib/fix_data.yaml
   errors: notEmpty
-AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
 ''');
   }
 
@@ -1857,9 +1723,6 @@
 AnalysisErrors
   file: /home/test/lib/fix_data.yaml
   errors: empty
-AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
 ''');
   }
 
@@ -1876,9 +1739,6 @@
 AnalysisErrors
   file: /home/test/lib/fix_data.yaml
   errors: empty
-AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
 ''');
   }
 
@@ -1944,9 +1804,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: empty
 ''');
@@ -1964,9 +1821,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: notEmpty
 ''');
@@ -2006,9 +1860,6 @@
   file: /home/test/analysis_options.yaml
   errors: empty
 AnalysisErrors
-  file: /home/test/pubspec.yaml
-  errors: empty
-AnalysisErrors
   file: /home/test/lib/test.dart
   errors: notEmpty
 ''');
diff --git a/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart b/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart
index 8d5103e..59a8d34 100644
--- a/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart
+++ b/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart
@@ -35,9 +35,9 @@
     workspaceFolder2Uri = pathContext.toUri(workspaceFolder2Path);
     workspaceFolder3Uri = pathContext.toUri(workspaceFolder3Path);
 
-    newPackageConfigJsonFile(workspaceFolder1Path, '');
-    newPackageConfigJsonFile(workspaceFolder2Path, '');
-    newPackageConfigJsonFile(workspaceFolder3Path, '');
+    newPubspecYamlFile(workspaceFolder1Path, '');
+    newPubspecYamlFile(workspaceFolder2Path, '');
+    newPubspecYamlFile(workspaceFolder3Path, '');
 
     nonFileWorkspaceFolderUri = Uri.parse('dart-foo:/foo.dart');
   }
@@ -261,12 +261,11 @@
     final nestedFileUri = pathContext.toUri(nestedFilePath);
     newFile(nestedFilePath, '');
 
-    // Ensure no package config in tree.
+    // Ensure no pubspecs in tree.
     deleteFile(
       join(
         workspaceFolder1Path,
-        file_paths.dotDartTool,
-        file_paths.packageConfigJson,
+        file_paths.pubspecYaml,
       ),
     );
 
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 4f42d3f..67abf6e 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -57,7 +57,7 @@
       if (resolver is PackageMapUriResolver) {
         return resolver.packageMap;
       }
-      if (resolver is PackageConfigPackageUriResolver) {
+      if (resolver is PackageBuildPackageUriResolver) {
         return resolver.packageMap;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 37b6c4e..512c31e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -193,26 +193,25 @@
     Folder? packagesFolderToChooseRoot;
     if (defaultPackagesFile != null) {
       packagesFile = defaultPackagesFile;
-      // If  the packages file is in .dart_tool directory, use the grandparent
-      // folder, else use the parent folder.
-      packagesFolderToChooseRoot =
-          _findPackagesFile(packagesFile.parent)?.parent ?? packagesFile.parent;
+    } else {
+      var foundPackages = _findPackagesFile(parent);
+      packagesFile = foundPackages?.file;
+      packagesFolderToChooseRoot = foundPackages?.parent;
     }
 
     var buildGnFile = _findBuildGnFile(parent);
 
     var rootFolder = _lowest([
       optionsFolderToChooseRoot,
+      packagesFolderToChooseRoot,
       buildGnFile?.parent,
     ]);
 
-    // If default packages file is given, create workspace for it.
     var workspace = _createWorkspace(
       folder: parent,
       packagesFile: packagesFile,
       buildGnFile: buildGnFile,
     );
-
     if (workspace is! BasicWorkspace) {
       rootFolder = _lowest([
         rootFolder,
@@ -220,17 +219,6 @@
       ]);
     }
 
-    if (workspace is PackageConfigWorkspace) {
-      packagesFile ??= workspace.packageConfigFile;
-      // If the default packages folder is a parent of the workspace root,
-      // choose that as the root.
-      if (rootFolder != null && packagesFolderToChooseRoot != null) {
-        if (packagesFolderToChooseRoot.contains(rootFolder.path)) {
-          rootFolder = packagesFolderToChooseRoot;
-        }
-      }
-    }
-
     if (rootFolder == null) {
       rootFolder = defaultRootFolder();
       if (workspace is BasicWorkspace) {
@@ -418,8 +406,8 @@
     Workspace? workspace;
     workspace = BlazeWorkspace.find(resourceProvider, rootPath,
         lookForBuildFileSubstitutes: false);
-    workspace = _mostSpecificWorkspace(workspace,
-        PackageConfigWorkspace.find(resourceProvider, packages, rootPath));
+    workspace = _mostSpecificWorkspace(
+        workspace, PubWorkspace.find(resourceProvider, packages, rootPath));
     workspace ??= BasicWorkspace.find(resourceProvider, packages, rootPath);
     return workspace;
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator2.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator2.dart
index 528cd38..7c9c0f9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator2.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator2.dart
@@ -192,10 +192,10 @@
     Folder? packagesFolderToChooseRoot;
     if (defaultPackagesFile != null) {
       packagesFile = defaultPackagesFile;
-      // If  the packages file is in .dart_tool directory, use the grandparent
-      // folder, else use the parent folder.
-      packagesFolderToChooseRoot =
-          _findPackagesFile(packagesFile.parent)?.parent ?? packagesFile.parent;
+    } else {
+      var foundPackages = _findPackagesFile(parent);
+      packagesFile = foundPackages?.file;
+      packagesFolderToChooseRoot = foundPackages?.parent;
     }
 
     var buildGnFile = _findBuildGnFile(parent);
@@ -211,7 +211,6 @@
       packagesFile: packagesFile,
       buildGnFile: buildGnFile,
     );
-
     if (workspace is! BasicWorkspace) {
       rootFolder = _lowest([
         rootFolder,
@@ -219,17 +218,6 @@
       ]);
     }
 
-    if (workspace is PackageConfigWorkspace) {
-      packagesFile ??= workspace.packageConfigFile;
-      // If the default packages folder is a parent of the workspace root,
-      // choose that as the root.
-      if (rootFolder != null && packagesFolderToChooseRoot != null) {
-        if (packagesFolderToChooseRoot.contains(rootFolder.path)) {
-          rootFolder = packagesFolderToChooseRoot;
-        }
-      }
-    }
-
     if (rootFolder == null) {
       rootFolder = defaultRootFolder();
       if (workspace is BasicWorkspace) {
@@ -426,8 +414,8 @@
     Workspace? workspace;
     workspace = BlazeWorkspace.find(resourceProvider, rootPath,
         lookForBuildFileSubstitutes: false);
-    workspace = _mostSpecificWorkspace(workspace,
-        PackageConfigWorkspace.find(resourceProvider, packages, rootPath));
+    workspace = _mostSpecificWorkspace(
+        workspace, PubWorkspace.find(resourceProvider, packages, rootPath));
     workspace ??= BasicWorkspace.find(resourceProvider, packages, rootPath);
     return workspace;
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 8c88e6c..42c0065 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -56,7 +56,6 @@
 import 'package:analyzer/src/utilities/extensions/collection.dart';
 import 'package:analyzer/src/utilities/extensions/string.dart';
 import 'package:analyzer/src/utilities/uri_cache.dart';
-import 'package:analyzer/src/workspace/pub.dart';
 import 'package:meta/meta.dart';
 
 /// This class computes analysis results for Dart files.
@@ -1762,10 +1761,6 @@
   String _getResolvedUnitSignature(LibraryFileKind library, FileState file) {
     ApiSignature signature = ApiSignature();
     signature.addUint32List(_saltForResolution);
-    if (file.workspacePackage is PubPackage) {
-      signature.addString(
-          (file.workspacePackage as PubPackage).pubspecContent ?? '');
-    }
     signature.addString(library.file.uriStr);
     signature.addString(library.libraryCycle.apiSignature);
     signature.addString(file.uriStr);
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart b/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart
index 86fd42e..8fbbc5a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart
@@ -10,7 +10,7 @@
   /// Return a filter of files that can be accessed by the [file].
   factory FileStateFilter(FileState file) {
     var workspacePackage = file.workspacePackage;
-    if (workspacePackage is PubPackage) {
+    if (workspacePackage is PubWorkspacePackage) {
       return _PubFilter(workspacePackage, file.path);
     } else {
       return _AnyFilter();
@@ -57,13 +57,13 @@
 }
 
 class _PubFilter implements FileStateFilter {
-  final PubPackage targetPackage;
+  final PubWorkspacePackage targetPackage;
   final String? targetPackageName;
   final bool targetPackageIsAnalysisServer;
   final bool targetInLib;
   final Set<String> dependencies;
 
-  factory _PubFilter(PubPackage package, String path) {
+  factory _PubFilter(PubWorkspacePackage package, String path) {
     var inLib = package.workspace.provider
         .getFolder(package.root)
         .getChildAssumingFolder('lib')
@@ -112,7 +112,7 @@
         return false;
       } else {
         var filePackage = file.workspacePackage;
-        return filePackage is PubPackage &&
+        return filePackage is PubWorkspacePackage &&
             filePackage.root == targetPackage.root;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 6fbf6209..0a157ba 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -501,7 +501,7 @@
     //
     var package = file.workspacePackage;
     var sdkVersionConstraint =
-        (package is PubPackage) ? package.sdkVersionConstraint : null;
+        (package is PubWorkspacePackage) ? package.sdkVersionConstraint : null;
     if (sdkVersionConstraint != null) {
       SdkConstraintVerifier verifier = SdkConstraintVerifier(
         errorReporter,
diff --git a/pkg/analyzer/lib/src/workspace/basic.dart b/pkg/analyzer/lib/src/workspace/basic.dart
index 16013e7..7b3ad4c 100644
--- a/pkg/analyzer/lib/src/workspace/basic.dart
+++ b/pkg/analyzer/lib/src/workspace/basic.dart
@@ -63,7 +63,7 @@
   final String root;
 
   @override
-  final SimpleWorkspace workspace;
+  final BasicWorkspace workspace;
 
   BasicWorkspacePackage(this.root, this.workspace);
 
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
index c4a3e58..7539b2b 100644
--- a/pkg/analyzer/lib/src/workspace/pub.dart
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -13,12 +13,12 @@
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/utilities/uri_cache.dart';
-import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/simple.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart';
 import 'package:pub_semver/pub_semver.dart';
+import 'package:yaml/yaml.dart';
 
 /// Check if the given list of path components contains a package build
 /// generated directory, it would have the following path segments,
@@ -37,29 +37,26 @@
 /// Instances of the class `PackageBuildFileUriResolver` resolve `file` URI's by
 /// first resolving file uri's in the expected way, and then by looking in the
 /// corresponding generated directories.
-class PackageConfigFileUriResolver extends ResourceUriResolver {
-  final PackageConfigWorkspace workspace;
+class PackageBuildFileUriResolver extends ResourceUriResolver {
+  final PubWorkspace workspace;
 
-  PackageConfigFileUriResolver(this.workspace) : super(workspace.provider);
+  PackageBuildFileUriResolver(this.workspace) : super(workspace.provider);
 
   @override
   Uri pathToUri(String path) {
     var pathContext = workspace.provider.pathContext;
 
     if (pathContext.isWithin(workspace.root, path)) {
-      var package = workspace.findPackageFor(path);
-      if (package is PubPackage) {
-        var relative = pathContext.relative(path, from: workspace.root);
-        var components = pathContext.split(relative);
-        if (components.length > 4 &&
-            _isPackageBuildGeneratedPath(components, 0) &&
-            components[3] == package._name) {
-          var canonicalPath = pathContext.joinAll([
-            workspace.root,
-            ...components.skip(4),
-          ]);
-          return pathContext.toUri(canonicalPath);
-        }
+      var relative = pathContext.relative(path, from: workspace.root);
+      var components = pathContext.split(relative);
+      if (components.length > 4 &&
+          _isPackageBuildGeneratedPath(components, 0) &&
+          components[3] == workspace.projectPackageName) {
+        var canonicalPath = pathContext.joinAll([
+          workspace.root,
+          ...components.skip(4),
+        ]);
+        return pathContext.toUri(canonicalPath);
       }
     }
 
@@ -86,13 +83,13 @@
 
 /// The [UriResolver] that can resolve `package` URIs in
 /// [PackageBuildWorkspace].
-class PackageConfigPackageUriResolver extends UriResolver {
-  final PackageConfigWorkspace _workspace;
+class PackageBuildPackageUriResolver extends UriResolver {
+  final PubWorkspace _workspace;
   final UriResolver _normalUriResolver;
   final Context _context;
 
-  PackageConfigPackageUriResolver(
-      PackageConfigWorkspace workspace, this._normalUriResolver)
+  PackageBuildPackageUriResolver(
+      PubWorkspace workspace, this._normalUriResolver)
       : _workspace = workspace,
         _context = workspace.provider.pathContext;
 
@@ -157,53 +154,118 @@
   }
 }
 
-/// Information about a Package Config workspace.
-class PackageConfigWorkspace extends SimpleWorkspace {
-  /// The associated package config file.
-  final File packageConfigFile;
+/// Information about a Pub workspace.
+class PubWorkspace extends SimpleWorkspace {
+  /// The name of the directory that identifies the root of the workspace. Note,
+  /// the presence of this file does not show package:build is used. For that,
+  /// the subdirectory [_dartToolBuildName] must exist. A `pub` subdirectory
+  /// will usually exist in non-package:build projects too.
+  static const String _dartToolRootName = '.dart_tool';
 
-  /// The contents of the package config file.
-  late final String? _packageConfigContent;
+  /// The name of the subdirectory in [_dartToolRootName] that distinguishes
+  /// projects built with package:build.
+  static const String _dartToolBuildName = 'build';
 
-  final Map<String, WorkspacePackage> _workspacePackages = {};
+  static const List<String> _generatedPathParts = [
+    '.dart_tool',
+    'build',
+    'generated'
+  ];
 
-  factory PackageConfigWorkspace(
-      ResourceProvider provider, //Packages packages,
+  /// The singular package in this workspace.
+  ///
+  /// Each Pub workspace is itself one package.
+  late final PubWorkspacePackage _theOnlyPackage;
+
+  /// The associated pubspec file.
+  final File _pubspecFile;
+
+  /// The content of the `pubspec.yaml` file.
+  /// We read it once, so that all usages return consistent results.
+  final String? _pubspecContent;
+
+  /// The name of the package under development as defined in pubspec.yaml. This
+  /// matches the behavior of package:build.
+  @visibleForTesting
+  final String projectPackageName;
+
+  /// `.dart_tool/build/generated` in [root].
+  final String? _generatedRootPath;
+
+  /// [projectPackageName] in [_generatedRootPath].
+  final String? _generatedThisPath;
+
+  /// Indicates whether this workspace uses package build.
+  @visibleForTesting
+  final bool usesPackageBuild;
+
+  factory PubWorkspace(ResourceProvider provider, Packages packages,
+      String root, File pubspecFile) {
+    var folder = pubspecFile.parent;
+    final dartToolDir = folder.getChildAssumingFolder(_dartToolRootName);
+    final dartToolBuildDir =
+        dartToolDir.getChildAssumingFolder(_dartToolBuildName);
+    var pubspecContent = _fileContentOrNull(pubspecFile);
+    String? generatedRootPath;
+    String? generatedThisPath;
+    var projectPackageName = '';
+    var usesPackageBuild = false;
+    // Found the .dart_tool file, that's our project root. We also require a
+    // pubspec, to know the package name that package:build will assume.
+    try {
+      final yaml = loadYaml(pubspecContent!) as YamlMap;
+      projectPackageName = yaml['name'] as String;
+      if (dartToolBuildDir.exists) {
+        generatedRootPath =
+            provider.pathContext.joinAll([folder.path, ..._generatedPathParts]);
+        generatedThisPath =
+            provider.pathContext.join(generatedRootPath, projectPackageName);
+        usesPackageBuild = true;
+      }
+    } catch (_) {}
+
+    return PubWorkspace._(
+        provider,
+        packages,
+        root,
+        pubspecFile,
+        pubspecContent,
+        generatedRootPath,
+        generatedThisPath,
+        projectPackageName,
+        usesPackageBuild);
+  }
+
+  PubWorkspace._(
+      ResourceProvider provider,
+      Packages packages,
       String root,
-      File packageConfigFile,
-      Packages packages) {
-    // Use the default packages if there is one.
-    var newPackages = packages == Packages.empty
-        ? parsePackageConfigJsonFile(provider, packageConfigFile)
-        : packages;
-
-    return PackageConfigWorkspace._(
-      provider,
-      newPackages,
-      root,
-      packageConfigFile,
-    );
+      this._pubspecFile,
+      this._pubspecContent,
+      this._generatedRootPath,
+      this._generatedThisPath,
+      this.projectPackageName,
+      this.usesPackageBuild)
+      : super(provider, packages, root) {
+    _theOnlyPackage = PubWorkspacePackage(root, this);
   }
 
-  PackageConfigWorkspace._(
-      super.provider, super.packages, super.root, this.packageConfigFile) {
-    _packageConfigContent = packageConfigFile.readAsStringSync();
-  }
-
-  Iterable<WorkspacePackage> get allPackages =>
-      _workspacePackages.values.toSet();
-
   @override
   bool get isConsistentWithFileSystem {
-    return _fileContentOrNull(packageConfigFile) == _packageConfigContent;
+    return _fileContentOrNull(_pubspecFile) == _pubspecContent;
   }
 
   @override
   UriResolver get packageUriResolver {
-    return PackageConfigPackageUriResolver(
-        this, PackageMapUriResolver(provider, packageMap));
+    if (usesPackageBuild) {
+      return PackageBuildPackageUriResolver(
+          this, PackageMapUriResolver(provider, packageMap));
+    }
+    return PackageMapUriResolver(provider, packageMap);
   }
 
+  List<PubWorkspacePackage> get pubPackages => [_theOnlyPackage];
+
   /// For some package file, which may or may not be a package source (it could
   /// be in `bin/`, `web/`, etc), find where its built counterpart will exist if
   /// its a generated source.
@@ -230,7 +292,7 @@
   @internal
   @override
   void contributeToResolutionSalt(ApiSignature buffer) {
-    buffer.addString(_packageConfigContent ?? '');
+    buffer.addString(_pubspecContent ?? '');
   }
 
   @override
@@ -238,15 +300,18 @@
     DartSdk? sdk,
     SummaryDataStore? summaryData,
   ) {
+    if (usesPackageBuild && summaryData != null) {
+      throw UnsupportedError(
+          'Summary files are not supported in a package:build workspace.');
+    }
     var resolvers = <UriResolver>[];
     if (sdk != null) {
       resolvers.add(DartUriResolver(sdk));
     }
-    if (summaryData != null) {
-      resolvers.add(InSummaryUriResolver(summaryData));
-    }
     resolvers.add(packageUriResolver);
-    resolvers.add(PackageConfigFileUriResolver(this));
+    if (usesPackageBuild) {
+      resolvers.add(PackageBuildFileUriResolver(this));
+    }
     resolvers.add(ResourceUriResolver(provider));
     return SourceFactory(resolvers);
   }
@@ -261,13 +326,10 @@
     var context = provider.pathContext;
     assert(context.isAbsolute(filePath), 'Not an absolute path: $filePath');
     try {
-      final package = findPackageFor(filePath);
-      if (package is PubPackage) {
-        final relativePath = context.relative(filePath, from: package.root);
-        final file = builtFile(relativePath, package._name ?? '');
-        if (file!.exists) {
-          return file;
-        }
+      final relativePath = context.relative(filePath, from: root);
+      final file = builtFile(relativePath, projectPackageName);
+      if (file!.exists) {
+        return file;
       }
       return provider.getFile(filePath);
     } catch (_) {
@@ -275,50 +337,26 @@
     }
   }
 
-  /// Find the [PubPackage] that contains the given file path. The path
+  /// Find the [PubWorkspacePackage] that contains the given file path. The path
   /// can be for a source file or a generated file. Generated files are located
   /// in the '.dart_tool/build/generated' folder of the containing package.
   @override
-  WorkspacePackage? findPackageFor(String filePath) {
+  PubWorkspacePackage? findPackageFor(String filePath) {
     var pathContext = provider.pathContext;
     // Must be in this workspace.
     if (!pathContext.isWithin(root, filePath)) {
       return null;
     }
 
-    List<String> paths = [];
-    var folder = provider.getFile(filePath).parent;
-
-    for (var current in folder.withAncestors) {
-      var package = _workspacePackages[current.path];
-      if (package != null) {
-        for (var path in paths) {
-          _workspacePackages[path] = package;
-        }
-        return package;
-      }
-      var pubspec = current.getChildAssumingFile(file_paths.pubspecYaml);
-      if (pubspec.exists) {
-        if (_isInThirdPartyDart(pubspec)) {
+    if (usesPackageBuild) {
+      // If generated, must be for this package.
+      if (pathContext.isWithin(_generatedRootPath!, filePath)) {
+        if (!pathContext.isWithin(_generatedThisPath!, filePath)) {
           return null;
         }
-        var package = PubPackage(current.path, this, pubspec);
-        for (var path in paths) {
-          _workspacePackages[path] = package;
-        }
-        _workspacePackages[current.path] = package;
-        return package;
       }
-      if (current.path == root) {
-        var package = BasicWorkspacePackage(root, this);
-        for (var path in paths) {
-          _workspacePackages[path] = package;
-        }
-        return package;
-      }
-      paths.add(current.path);
     }
-    return null;
+    return _theOnlyPackage;
   }
 
   /// Unlike the way that sources are resolved against `.packages` (if foo
@@ -332,22 +370,23 @@
     return context.join('lib', filePath);
   }
 
-  /// Find the package config workspace that contains the given [filePath].
-  /// A [PackageConfigWorkspace] is rooted at the innermost package-config file.
-  static PackageConfigWorkspace? find(
+  /// Find the pub workspace that contains the given [filePath].
+  /// A [PubWorkspace] is rooted at the innermost pubspec/package-config pair,
+  /// or if that's not found, then the outermost pubspec.
+  static PubWorkspace? find(
     ResourceProvider provider,
     Packages packages,
     String filePath,
   ) {
     var start = provider.getFolder(filePath);
     for (var current in start.withAncestors) {
-      var packageConfigFile = current
-          .getChildAssumingFolder(file_paths.dotDartTool)
-          .getChildAssumingFile(file_paths.packageConfigJson);
-      if (packageConfigFile.exists) {
+      var pubspec = current.getChildAssumingFile(file_paths.pubspecYaml);
+      if (pubspec.exists) {
+        if (_isInThirdPartyDart(pubspec)) {
+          return null;
+        }
         var root = current.path;
-        return PackageConfigWorkspace(
-            provider, root, packageConfigFile, packages);
+        return PubWorkspace(provider, packages, root, pubspec);
       }
     }
     return null;
@@ -376,12 +415,12 @@
   }
 }
 
-/// Information about a package defined in a [PackageConfigWorkspace].
+/// Information about a package defined in a [PubWorkspace].
 ///
 /// Separate from [Packages] or package maps, this class is designed to simply
 /// understand whether arbitrary file paths represent libraries declared within
-/// a given package in a [PackageConfigWorkspace].
-class PubPackage extends WorkspacePackage {
+/// a given package in a [PubWorkspace].
+class PubWorkspacePackage extends WorkspacePackage {
   static const List<String> _generatedPathParts = [
     file_paths.dotDartTool,
     file_paths.packageBuild,
@@ -391,11 +430,10 @@
   @override
   final String root;
 
-  final String? _name;
+  Pubspec? _pubspec;
 
-  final String? _pubspecContent;
-
-  final Pubspec? _pubspec;
+  /// A flag to indicate if we've tried to parse the pubspec.
+  bool _parsedPubspec = false;
 
   VersionConstraint? _sdkVersionConstraint;
 
@@ -403,30 +441,30 @@
   bool _parsedSdkConstraint = false;
 
   @override
-  final PackageConfigWorkspace workspace;
+  final PubWorkspace workspace;
 
-  factory PubPackage(
-      String root, PackageConfigWorkspace workspace, File pubspecFile) {
-    var pubspecContent = pubspecFile.readAsStringSync();
-    var pubspec = Pubspec.parse(pubspecContent);
-    var packageName = pubspec.name?.value.text;
-    return PubPackage._(root, workspace, pubspecContent, pubspec, packageName);
+  PubWorkspacePackage(this.root, this.workspace);
+
+  /// Get the associated parsed [Pubspec], or `null` if there was an error in
+  /// reading or parsing.
+  Pubspec? get pubspec {
+    if (!_parsedPubspec) {
+      _parsedPubspec = true;
+      final content = workspace._pubspecContent;
+      if (content != null) {
+        _pubspec = Pubspec.parse(content);
+      }
+    }
+    return _pubspec;
   }
 
-  PubPackage._(this.root, this.workspace, this._pubspecContent, this._pubspec,
-      this._name);
-
-  Pubspec? get pubspec => _pubspec;
-
-  String? get pubspecContent => _pubspecContent;
-
   /// The version range for the SDK specified for this package , or `null` if
   /// it is ill-formatted or not set.
   VersionConstraint? get sdkVersionConstraint {
     if (!_parsedSdkConstraint) {
       _parsedSdkConstraint = true;
 
-      var sdkValue = _pubspec?.environment?.sdk?.value.text;
+      var sdkValue = pubspec?.environment?.sdk?.value.text;
       if (sdkValue != null) {
         try {
           _sdkVersionConstraint = VersionConstraint.parse(sdkValue);
@@ -446,7 +484,7 @@
       // TODO(keertip): Check to see if we can use information from package
       // config to find out if a file is in this package.
       var packageName = uri.pathSegments[0];
-      return packageName == _name;
+      return packageName == workspace.projectPackageName;
     }
 
     if (uri.isScheme('file')) {
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
index 2ec1f32..b114198 100644
--- a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -229,19 +229,25 @@
     final workspaceRootPath = '/home';
     final testPackageRootPath = '$workspaceRootPath/test';
 
+    newSinglePackageConfigJsonFile(
+      packagePath: testPackageRootPath,
+      name: 'test',
+    );
+
     newFile('$testPackageRootPath/lib/a.dart', '');
 
     _assertWorkspaceCollectionText(workspaceRootPath, r'''
 contexts
-  /home
+  /home/test
+    packagesFile: /home/test/.dart_tool/package_config.json
     workspace: workspace_0
     analyzedFiles
       /home/test/lib/a.dart
-        uri: file:///home/test/lib/a.dart
+        uri: package:test/a.dart
         workspacePackage_0_0
 workspaces
   workspace_0: BasicWorkspace
-    root: /home
+    root: /home/test
     workspacePackage_0_0
 ''');
   }
@@ -289,15 +295,15 @@
   analysisOptions_0: /home/test/analysis_options.yaml
   analysisOptions_1: /home/test/lib/nested/analysis_options.yaml
 workspaces
-  workspace_0: PackageConfigWorkspace
+  workspace_0: PubWorkspace
     root: /home/test
     pubPackages
-      workspacePackage_0_0: PubPackage
+      workspacePackage_0_0: PubWorkspacePackage
         root: /home/test
-  workspace_1: PackageConfigWorkspace
+  workspace_1: PubWorkspace
     root: /home/test
     pubPackages
-      workspacePackage_1_0: PubPackage
+      workspacePackage_1_0: PubWorkspacePackage
         root: /home/test
 ''');
   }
@@ -345,15 +351,15 @@
         uri: package:nested/b.dart
         workspacePackage_1_0
 workspaces
-  workspace_0: PackageConfigWorkspace
+  workspace_0: PubWorkspace
     root: /home/test
     pubPackages
-      workspacePackage_0_0: PubPackage
+      workspacePackage_0_0: PubWorkspacePackage
         root: /home/test
-  workspace_1: PackageConfigWorkspace
+  workspace_1: PubWorkspace
     root: /home/test/nested
     pubPackages
-      workspacePackage_1_0: PubPackage
+      workspacePackage_1_0: PubWorkspacePackage
         root: /home/test/nested
 ''');
   }
@@ -384,10 +390,10 @@
         uri: package:test/a.dart
         workspacePackage_0_0
 workspaces
-  workspace_0: PackageConfigWorkspace
+  workspace_0: PubWorkspace
     root: /home/test
     pubPackages
-      workspacePackage_0_0: PubPackage
+      workspacePackage_0_0: PubWorkspacePackage
         root: /home/test
         sdkVersionConstraint: ^3.0.0
 ''');
@@ -424,10 +430,10 @@
 analysisOptions
   analysisOptions_0: /home/test/analysis_options.yaml
 workspaces
-  workspace_0: PackageConfigWorkspace
+  workspace_0: PubWorkspace
     root: /home/test
     pubPackages
-      workspacePackage_0_0: PubPackage
+      workspacePackage_0_0: PubWorkspacePackage
         root: /home/test
 ''');
   }
@@ -483,15 +489,15 @@
   analysisOptions_0: /home/test/analysis_options.yaml
   analysisOptions_1: /home/test/analysis_options.yaml
 workspaces
-  workspace_0: PackageConfigWorkspace
+  workspace_0: PubWorkspace
     root: /home/test
     pubPackages
-      workspacePackage_0_0: PubPackage
+      workspacePackage_0_0: PubWorkspacePackage
         root: /home/test
-  workspace_1: PackageConfigWorkspace
+  workspace_1: PubWorkspace
     root: /home/test/nested
     pubPackages
-      workspacePackage_1_0: PubPackage
+      workspacePackage_1_0: PubWorkspacePackage
         root: /home/test/nested
 ''');
   }
@@ -684,14 +690,14 @@
             _idOfWorkspacePackage(workspace.theOnlyPackage),
           );
         });
-      case PackageConfigWorkspace():
-        sink.writelnWithIndent('$id: PackageConfigWorkspace');
+      case PubWorkspace():
+        sink.writelnWithIndent('$id: PubWorkspace');
         sink.withIndent(() {
           final root = resourceProvider.getFolder(workspace.root);
           sink.writelnWithIndent('root: ${root.posixPath}');
           sink.writeElements(
             'pubPackages',
-            workspace.allPackages.toList(),
+            workspace.pubPackages.toList(),
             _writeWorkspacePackage,
           );
         });
@@ -710,8 +716,8 @@
           final root = resourceProvider.getFolder(package.root);
           sink.writelnWithIndent('root: ${root.posixPath}');
         });
-      case PubPackage():
-        sink.writelnWithIndent('$id: PubPackage');
+      case PubWorkspacePackage():
+        sink.writelnWithIndent('$id: PubWorkspacePackage');
         sink.withIndent(() {
           final root = resourceProvider.getFolder(package.root);
           sink.writelnWithIndent('root: ${root.posixPath}');
diff --git a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
index 4ccce93..3e1bb23 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/blaze.dart';
+import 'package:analyzer/src/workspace/pub.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -143,24 +144,6 @@
     expect(context.sdkRoot, sdkRoot);
   }
 
-  void test_sourceFactory_basicWorkspace() {
-    var projectPath = convertPath('/home/my');
-    newFile('/home/my/pubspec.yaml', '');
-
-    // no package uri resolution information
-    var analysisContext = _createSingleAnalysisContext(projectPath);
-    expect(analysisContext.contextRoot.workspace, isA<BasicWorkspace>());
-
-    expect(
-      analysisContext.uriResolvers,
-      unorderedEquals([
-        isA<DartUriResolver>(),
-        isA<PackageMapUriResolver>(),
-        isA<ResourceUriResolver>(),
-      ]),
-    );
-  }
-
   void test_sourceFactory_blazeWorkspace() {
     var projectPath = convertPath('/workspace/my/module');
     newFile('/workspace/${file_paths.blazeWorkspaceMarker}', '');
@@ -180,6 +163,23 @@
     );
   }
 
+  void test_sourceFactory_pubWorkspace() {
+    var projectPath = convertPath('/home/my');
+    newFile('/home/my/pubspec.yaml', '');
+
+    var analysisContext = _createSingleAnalysisContext(projectPath);
+    expect(analysisContext.contextRoot.workspace, isA<PubWorkspace>());
+
+    expect(
+      analysisContext.uriResolvers,
+      unorderedEquals([
+        isA<DartUriResolver>(),
+        isA<PackageMapUriResolver>(),
+        isA<ResourceUriResolver>(),
+      ]),
+    );
+  }
+
   /// Return a single expected analysis context at the [path].
   DriverBasedAnalysisContext _createSingleAnalysisContext(String path) {
     var roots = ContextLocatorImpl(
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator2_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator2_test.dart
index 42079b6..b8124df 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator2_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator2_test.dart
@@ -668,7 +668,7 @@
     );
     expect(roots, hasLength(1));
 
-    ContextRoot root = findRoot(roots, getFolder('/home'));
+    ContextRoot root = findRoot(roots, getFolder('/'));
     expect(
         root.includedPaths, unorderedEquals([testFile1.path, testFile2.path]));
     expect(root.excludedPaths, isEmpty);
@@ -761,13 +761,13 @@
     _assertAnalyzedFiles2(root, [fooFile, barFile]);
   }
 
-  void test_locateRoots_multiple_files_differentWorkspaces_packageConfig() {
+  void test_locateRoots_multiple_files_differentWorkspaces_pub() {
     var rootPath = '/home';
     var fooPath = '$rootPath/foo';
     var barPath = '$rootPath/bar';
 
-    newPackageConfigJsonFile(fooPath, '');
-    newPackageConfigJsonFile(barPath, '');
+    newPubspecYamlFile(fooPath, '');
+    newPubspecYamlFile(barPath, '');
 
     var fooFile = newFile('$fooPath/lib/foo.dart', '');
     var barFile = newFile('$barPath/lib/bar.dart', '');
@@ -781,7 +781,7 @@
     expect(fooRoot.includedPaths, unorderedEquals([fooFile.path]));
     expect(fooRoot.excludedPaths, isEmpty);
     expect(fooRoot.optionsFile, isNull);
-    expect(fooRoot.packagesFile, isNotNull);
+    expect(fooRoot.packagesFile, isNull);
     _assertPubWorkspace(fooRoot.workspace, fooPath);
     _assertAnalyzedFiles2(fooRoot, [fooFile]);
 
@@ -789,7 +789,7 @@
     expect(barRoot.includedPaths, unorderedEquals([barFile.path]));
     expect(barRoot.excludedPaths, isEmpty);
     expect(barRoot.optionsFile, isNull);
-    expect(barRoot.packagesFile, isNotNull);
+    expect(barRoot.packagesFile, isNull);
     _assertPubWorkspace(barRoot.workspace, barPath);
     _assertAnalyzedFiles2(barRoot, [barFile]);
   }
@@ -1774,7 +1774,7 @@
   }
 
   void _assertPubWorkspace(Workspace workspace, String posixRoot) {
-    workspace as PackageConfigWorkspace;
+    workspace as PubWorkspace;
     var root = convertPath(posixRoot);
     expect(workspace.root, root);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index 10333aa..f9bc142 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -653,7 +653,7 @@
 
   /// When there is a packages file in a containing directory, that would
   /// control analysis of the files, but we provide an override, we ignore
-  /// and don't look into containing directories, so the context root can be
+  /// the don't look into containing directories, so the context root can be
   /// just the file system root.
   void
       test_locateRoots_multiple_fileAndSiblingFile_hasPackages_overridePackages() {
@@ -668,7 +668,7 @@
     );
     expect(roots, hasLength(1));
 
-    ContextRoot root = findRoot(roots, getFolder('/home'));
+    ContextRoot root = findRoot(roots, getFolder('/'));
     expect(
         root.includedPaths, unorderedEquals([testFile1.path, testFile2.path]));
     expect(root.excludedPaths, isEmpty);
@@ -761,13 +761,13 @@
     _assertAnalyzedFiles2(root, [fooFile, barFile]);
   }
 
-  void test_locateRoots_multiple_files_differentWorkspaces_packageConfig() {
+  void test_locateRoots_multiple_files_differentWorkspaces_pub() {
     var rootPath = '/home';
     var fooPath = '$rootPath/foo';
     var barPath = '$rootPath/bar';
 
-    newPackageConfigJsonFile(fooPath, '');
-    newPackageConfigJsonFile(barPath, '');
+    newPubspecYamlFile(fooPath, '');
+    newPubspecYamlFile(barPath, '');
 
     var fooFile = newFile('$fooPath/lib/foo.dart', '');
     var barFile = newFile('$barPath/lib/bar.dart', '');
@@ -781,7 +781,7 @@
     expect(fooRoot.includedPaths, unorderedEquals([fooFile.path]));
     expect(fooRoot.excludedPaths, isEmpty);
     expect(fooRoot.optionsFile, isNull);
-    expect(fooRoot.packagesFile, isNotNull);
+    expect(fooRoot.packagesFile, isNull);
     _assertPubWorkspace(fooRoot.workspace, fooPath);
     _assertAnalyzedFiles2(fooRoot, [fooFile]);
 
@@ -789,7 +789,7 @@
     expect(barRoot.includedPaths, unorderedEquals([barFile.path]));
     expect(barRoot.excludedPaths, isEmpty);
     expect(barRoot.optionsFile, isNull);
-    expect(barRoot.packagesFile, isNotNull);
+    expect(barRoot.packagesFile, isNull);
     _assertPubWorkspace(barRoot.workspace, barPath);
     _assertAnalyzedFiles2(barRoot, [barFile]);
   }
@@ -1746,6 +1746,7 @@
     expect(package1Root.packagesFile, packagesFile);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/53874')
   void test_multiple_packages_monorepo() {
     var rootPath = convertPath('/test/outer');
     Folder rootFolder = newFolder(rootPath);
@@ -1825,7 +1826,7 @@
   }
 
   void _assertPubWorkspace(Workspace workspace, String posixRoot) {
-    workspace as PackageConfigWorkspace;
+    workspace as PubWorkspace;
     var root = convertPath(posixRoot);
     expect(workspace.root, root);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 4c216e9..1387569 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -231,9 +231,17 @@
     expect(workspace, TypeMatcher<GnWorkspace>());
   }
 
-  void assertPackageConfigWorkspaceFor(File file) {
+  void assertPackageBuildWorkspaceFor(File file) {
     var workspace = contextFor(file).contextRoot.workspace;
-    expect(workspace, TypeMatcher<PackageConfigWorkspace>());
+    expect(
+        workspace,
+        isA<PubWorkspace>()
+            .having((e) => e.usesPackageBuild, 'usesPackageBuild', true));
+  }
+
+  void assertPubWorkspaceFor(File file) {
+    var workspace = contextFor(file).contextRoot.workspace;
+    expect(workspace, TypeMatcher<PubWorkspace>());
   }
 
   AnalysisContext contextFor(File file) {
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 6fe5b7f..83b331f 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -11,7 +11,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(DeprecatedMemberUse_PackageConfigWorkspaceTest);
+    defineReflectiveTests(DeprecatedMemberUse_BasicWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_BlazeWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_GnWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_PackageBuildWorkspaceTest);
@@ -19,173 +19,7 @@
 }
 
 @reflectiveTest
-class DeprecatedMemberUse_BlazeWorkspaceTest
-    extends BlazeWorkspaceResolutionTest {
-  test_dart() async {
-    newFile('$workspaceRootPath/foo/bar/lib/a.dart', r'''
-@deprecated
-class A {}
-''');
-
-    await assertErrorsInCode(r'''
-import 'package:foo.bar/a.dart';
-
-void f(A a) {}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE, 41, 1),
-    ]);
-  }
-
-  test_thirdPartyDart() async {
-    newFile('$workspaceThirdPartyDartPath/aaa/lib/a.dart', r'''
-@deprecated
-class A {}
-''');
-
-    assertBlazeWorkspaceFor(testFile);
-
-    await assertErrorsInCode(r'''
-import 'package:aaa/a.dart';
-
-void f(A a) {}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
-    ]);
-  }
-}
-
-@reflectiveTest
-class DeprecatedMemberUse_GnWorkspaceTest extends ContextResolutionTest {
-  @override
-  List<String> get collectionIncludedPaths => [workspaceRootPath];
-
-  String get genPath => '$outPath/dartlang/gen';
-
-  String get myPackageLibPath => '$myPackageRootPath/lib';
-
-  String get myPackageRootPath => '$workspaceRootPath/my';
-
-  Folder get outFolder => getFolder(outPath);
-
-  String get outPath => '$workspaceRootPath/out/default';
-
-  @override
-  File get testFile => getFile('$myPackageLibPath/my.dart');
-
-  String get workspaceRootPath => '/workspace';
-
-  @override
-  void setUp() {
-    super.setUp();
-    newFolder('$workspaceRootPath/.jiri_root');
-
-    newFile('$workspaceRootPath/.fx-build-dir', '''
-${outFolder.path}
-''');
-
-    newBuildGnFile(myPackageRootPath, '');
-  }
-
-  test_differentPackage() async {
-    newBuildGnFile('$workspaceRootPath/aaa', '');
-
-    var myPackageConfig = getFile('$genPath/my/my_package_config.json');
-    _writeWorkspacePackagesFile(myPackageConfig, {
-      'aaa': '$workspaceRootPath/aaa/lib',
-      'my': myPackageLibPath,
-    });
-
-    newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
-@deprecated
-class A {}
-''');
-
-    await assertErrorsInCode(r'''
-import 'package:aaa/a.dart';
-
-void f(A a) {}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
-    ]);
-  }
-
-  @override
-  void verifyCreatedCollection() {
-    super.verifyCreatedCollection();
-    assertGnWorkspaceFor(testFile);
-  }
-
-  void _writeWorkspacePackagesFile(
-      File file, Map<String, String> nameToLibPath) {
-    var packages = nameToLibPath.entries.map((entry) => '''{
-    "languageVersion": "2.2",
-    "name": "${entry.key}",
-    "packageUri": ".",
-    "rootUri": "${toUriStr(entry.value)}"
-  }''');
-
-    newFile(file.path, '''{
-  "configVersion": 2,
-  "packages": [ ${packages.join(', ')} ]
-}''');
-  }
-}
-
-@reflectiveTest
-class DeprecatedMemberUse_PackageBuildWorkspaceTest
-    extends _PackageConfigWorkspaceBase {
-  test_generated() async {
-    writeTestPackageConfig(
-      PackageConfigFileBuilder()
-        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
-    );
-
-    newPubspecYamlFile(testPackageRootPath, 'name: test');
-    _newTestPackageGeneratedFile(
-      packageName: 'aaa',
-      pathInLib: 'a.dart',
-      content: r'''
-@deprecated
-class A {}
-''',
-    );
-
-    await assertErrorsInCode(r'''
-import 'package:aaa/a.dart';
-
-void f(A a) {}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
-    ]);
-  }
-
-  test_lib() async {
-    writeTestPackageConfig(
-      PackageConfigFileBuilder()
-        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
-    );
-
-    newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
-@deprecated
-class A {}
-''');
-
-    newPubspecYamlFile(testPackageRootPath, 'name: test');
-    _createTestPackageBuildMarker();
-
-    await assertErrorsInCode(r'''
-import 'package:aaa/a.dart';
-
-void f(A a) {}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
-    ]);
-  }
-}
-
-@reflectiveTest
-class DeprecatedMemberUse_PackageConfigWorkspaceTest
-    extends PubPackageResolutionTest {
+class DeprecatedMemberUse_BasicWorkspaceTest extends PubPackageResolutionTest {
   String get externalLibPath => '$workspaceRootPath/aaa/lib/a.dart';
 
   String get externalLibUri => 'package:aaa/a.dart';
@@ -2028,11 +1862,176 @@
   @override
   void verifyCreatedCollection() {
     super.verifyCreatedCollection();
-    assertPackageConfigWorkspaceFor(testFile);
+    assertBasicWorkspaceFor(testFile);
   }
 }
 
-class _PackageConfigWorkspaceBase extends PubPackageResolutionTest {
+@reflectiveTest
+class DeprecatedMemberUse_BlazeWorkspaceTest
+    extends BlazeWorkspaceResolutionTest {
+  test_dart() async {
+    newFile('$workspaceRootPath/foo/bar/lib/a.dart', r'''
+@deprecated
+class A {}
+''');
+
+    await assertErrorsInCode(r'''
+import 'package:foo.bar/a.dart';
+
+void f(A a) {}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 41, 1),
+    ]);
+  }
+
+  test_thirdPartyDart() async {
+    newFile('$workspaceThirdPartyDartPath/aaa/lib/a.dart', r'''
+@deprecated
+class A {}
+''');
+
+    assertBlazeWorkspaceFor(testFile);
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f(A a) {}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class DeprecatedMemberUse_GnWorkspaceTest extends ContextResolutionTest {
+  @override
+  List<String> get collectionIncludedPaths => [workspaceRootPath];
+
+  String get genPath => '$outPath/dartlang/gen';
+
+  String get myPackageLibPath => '$myPackageRootPath/lib';
+
+  String get myPackageRootPath => '$workspaceRootPath/my';
+
+  Folder get outFolder => getFolder(outPath);
+
+  String get outPath => '$workspaceRootPath/out/default';
+
+  @override
+  File get testFile => getFile('$myPackageLibPath/my.dart');
+
+  String get workspaceRootPath => '/workspace';
+
+  @override
+  void setUp() {
+    super.setUp();
+    newFolder('$workspaceRootPath/.jiri_root');
+
+    newFile('$workspaceRootPath/.fx-build-dir', '''
+${outFolder.path}
+''');
+
+    newBuildGnFile(myPackageRootPath, '');
+  }
+
+  test_differentPackage() async {
+    newBuildGnFile('$workspaceRootPath/aaa', '');
+
+    var myPackageConfig = getFile('$genPath/my/my_package_config.json');
+    _writeWorkspacePackagesFile(myPackageConfig, {
+      'aaa': '$workspaceRootPath/aaa/lib',
+      'my': myPackageLibPath,
+    });
+
+    newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
+@deprecated
+class A {}
+''');
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f(A a) {}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
+    ]);
+  }
+
+  @override
+  void verifyCreatedCollection() {
+    super.verifyCreatedCollection();
+    assertGnWorkspaceFor(testFile);
+  }
+
+  void _writeWorkspacePackagesFile(
+      File file, Map<String, String> nameToLibPath) {
+    var packages = nameToLibPath.entries.map((entry) => '''{
+    "languageVersion": "2.2",
+    "name": "${entry.key}",
+    "packageUri": ".",
+    "rootUri": "${toUriStr(entry.value)}"
+  }''');
+
+    newFile(file.path, '''{
+  "configVersion": 2,
+  "packages": [ ${packages.join(', ')} ]
+}''');
+  }
+}
+
+@reflectiveTest
+class DeprecatedMemberUse_PackageBuildWorkspaceTest
+    extends _PackageBuildWorkspaceBase {
+  test_generated() async {
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
+
+    newPubspecYamlFile(testPackageRootPath, 'name: test');
+    _newTestPackageGeneratedFile(
+      packageName: 'aaa',
+      pathInLib: 'a.dart',
+      content: r'''
+@deprecated
+class A {}
+''',
+    );
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f(A a) {}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
+    ]);
+  }
+
+  test_lib() async {
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
+
+    newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
+@deprecated
+class A {}
+''');
+
+    newPubspecYamlFile(testPackageRootPath, 'name: test');
+    _createTestPackageBuildMarker();
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f(A a) {}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 37, 1),
+    ]);
+  }
+}
+
+class _PackageBuildWorkspaceBase extends PubPackageResolutionTest {
   String get testPackageGeneratedPath {
     return '$testPackageRootPath/.dart_tool/build/generated';
   }
@@ -2040,7 +2039,7 @@
   @override
   void verifyCreatedCollection() {
     super.verifyCreatedCollection();
-    assertPackageConfigWorkspaceFor(testFile);
+    assertPackageBuildWorkspaceFor(testFile);
   }
 
   void _createTestPackageBuildMarker() {
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index cf39909..0cf6bca 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -604,8 +604,8 @@
 class C { }
 ''');
 
-    expect(context.package, TypeMatcher<PubPackage>());
-    final pubPackage = context.package as PubPackage;
+    expect(context.package, TypeMatcher<PubWorkspacePackage>());
+    final pubPackage = context.package as PubWorkspacePackage;
     final pubspec = pubPackage.pubspec!;
 
     final argsDep = pubspec.dependencies!
diff --git a/pkg/analyzer/test/src/workspace/pub_test.dart b/pkg/analyzer/test/src/workspace/pub_test.dart
index ca1106a..19ab57d 100644
--- a/pkg/analyzer/test/src/workspace/pub_test.dart
+++ b/pkg/analyzer/test/src/workspace/pub_test.dart
@@ -7,20 +7,17 @@
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/generated/source.dart' show UriResolver;
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/pub.dart';
-import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/test_support.dart';
-import '../dart/resolution/context_collection_resolution.dart';
 import 'workspace_test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(PubPackageTest);
-    defineReflectiveTests(PackageConfigWorkspaceTest);
+    defineReflectiveTests(PubWorkspacePackageTest);
+    defineReflectiveTests(PubWorkspaceTest);
     defineReflectiveTests(PackageBuildFileUriResolverTest);
     defineReflectiveTests(PackageBuildPackageUriResolverTest);
   });
@@ -51,8 +48,8 @@
 
 @reflectiveTest
 class PackageBuildFileUriResolverTest with ResourceProviderMixin {
-  late final PackageConfigWorkspace workspace;
-  late final PackageConfigFileUriResolver resolver;
+  late final PubWorkspace workspace;
+  late final PackageBuildFileUriResolver resolver;
 
   File get testFile => getFile('$testPackageLibPath/test.dart');
 
@@ -70,17 +67,20 @@
   void setUp() {
     newFolder(testPackageGeneratedLibPath);
     newPubspecYamlFile(testPackageRootPath, 'name: test');
-    var config = PackageConfigFileBuilder();
-    config.add(name: 'test', rootPath: convertPath(testPackageRootPath));
-    newPackageConfigJsonFile(
-        testPackageRootPath, config.toContent(toUriStr: toUriStr));
 
-    workspace = PackageConfigWorkspace.find(
+    workspace = PubWorkspace.find(
       resourceProvider,
-      Packages.empty,
+      Packages({
+        'test': Package(
+          name: 'test',
+          rootFolder: getFolder(testPackageRootPath),
+          libFolder: getFolder(testPackageLibPath),
+          languageVersion: null,
+        ),
+      }),
       convertPath(testPackageRootPath),
     )!;
-    resolver = PackageConfigFileUriResolver(workspace);
+    resolver = PackageBuildFileUriResolver(workspace);
     expect(workspace.isBlaze, isFalse);
   }
 
@@ -146,8 +146,8 @@
 
 @reflectiveTest
 class PackageBuildPackageUriResolverTest with ResourceProviderMixin {
-  late final PackageConfigWorkspace workspace;
-  late final PackageConfigPackageUriResolver resolver;
+  late final PubWorkspace workspace;
+  late final PackageBuildPackageUriResolver resolver;
   late final MockUriResolver packageUriResolver;
 
   Uri addPackageSource(String path, String uriStr, {bool create = true}) {
@@ -161,7 +161,6 @@
 
   void setUp() {
     newPubspecYamlFile('/workspace', 'name: project');
-    newPackageConfigJsonFile('/workspace', '');
   }
 
   void test_resolveAbsolute_generated() {
@@ -222,17 +221,20 @@
         newFile(path, '');
       }
     }
-    var config = PackageConfigFileBuilder();
-    config.add(name: 'project', rootPath: '/workspace');
-    newPackageConfigJsonFile(
-        workspacePath, config.toContent(toUriStr: toUriStr));
-    workspace = PackageConfigWorkspace.find(
+    workspace = PubWorkspace.find(
       resourceProvider,
-      Packages.empty,
+      Packages({
+        'project': Package(
+          name: 'project',
+          rootFolder: getFolder('/workspace'),
+          libFolder: getFolder('/workspace'),
+          languageVersion: null,
+        ),
+      }),
       convertPath(workspacePath),
     )!;
     packageUriResolver = MockUriResolver();
-    resolver = PackageConfigPackageUriResolver(workspace, packageUriResolver);
+    resolver = PackageBuildPackageUriResolver(workspace, packageUriResolver);
   }
 
   Source _assertResolveUri(
@@ -251,286 +253,9 @@
 }
 
 @reflectiveTest
-class PackageConfigWorkspaceTest with ResourceProviderMixin {
-  void test_builtFile_currentProject() {
-    newFolder('/workspace/.dart_tool/build');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final libFile = newFile(
-        '/workspace/.dart_tool/build/generated/project/lib/file.dart', '');
-    expect(
-        workspace.builtFile(convertPath('lib/file.dart'), 'project'), libFile);
-  }
-
-  void test_builtFile_importedPackage() {
-    newFolder('/workspace/.dart_tool/build');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project', 'foo']);
-
-    final libFile =
-        newFile('/workspace/.dart_tool/build/generated/foo/lib/file.dart', '');
-    expect(workspace.builtFile(convertPath('lib/file.dart'), 'foo'), libFile);
-  }
-
-  void test_builtFile_notInPackagesGetsHidden() {
-    newFolder('/workspace/.dart_tool/build');
-    // Ensure package:bar is not configured.
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project', 'foo']);
-
-    // Create a generated file in package:bar.
-    newFile('/workspace/.dart_tool/build/generated/bar/lib/file.dart', '');
-
-    // Bar not in packages, file should not be returned.
-    expect(workspace.builtFile('lib/file.dart', 'bar'), isNull);
-  }
-
-  void test_find_directory() {
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-    expect(workspace.isBlaze, isFalse);
-    expect(workspace.root, convertPath('/workspace'));
-  }
-
-  void test_find_file() {
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-    expect(workspace.root, convertPath('/workspace'));
-  }
-
-  void test_find_hasBuild_hasPubspec_malformed_dontGoToUp() {
-    newFolder('/workspace/.dart_tool/build/generated');
-
-    newFolder('/workspace/aaa/.dart_tool/build/generated');
-    newPubspecYamlFile('/workspace/aaa', '*');
-
-    PackageConfigWorkspace workspace = _createWorkspace('/workspace/aaa', []);
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace/aaa'));
-  }
-
-  void test_find_hasDartToolAndPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    PackageConfigWorkspace workspace = _createWorkspace('/workspace', []);
-
-    expect(workspace.root, convertPath('/workspace'));
-  }
-
-  void test_find_hasDartToolAndPubspec_inParentDirectory() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newPubspecYamlFile('/workspace/opened/up/a/child/dir', 'name: subproject');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace/opened/up/a/child/dir', ['project']);
-    expect(workspace.root, convertPath('/workspace/opened/up/a/child/dir'));
-  }
-
-  void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloDartTool() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFolder('/workspace/opened/up/a/child/dir');
-    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-    expect(workspace.root, convertPath('/workspace'));
-  }
-
-  void test_find_hasDartToolNoBuild() {
-    // Edge case: an empty .dart_tool directory. Don't assume package:build.
-    newFolder('/workspace/.dart_tool');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-    expect(workspace, isNotNull);
-  }
-
-  void test_find_hasDartToolNoPackageConfig() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    var workspace = PackageConfigWorkspace.find(
-      resourceProvider,
-      Packages.empty,
-      convertPath('/workspace'),
-    );
-    expect(workspace, isNull);
-  }
-
-  void test_find_hasDartToolPubButNotBuild() {
-    // Dart projects will have this directory, that don't use package:build.
-    newFolder('/workspace/.dart_tool/pub');
-    newPackageConfigJsonFile('/workspace', '');
-    var workspace = PackageConfigWorkspace.find(
-      resourceProvider,
-      Packages.empty,
-      convertPath('/workspace'),
-    );
-    expect(workspace!.root, convertPath('/workspace'));
-  }
-
-  void test_find_hasMalformedPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newPubspecYamlFile('/workspace', 'not: yaml: here! 1111');
-    newPackageConfigJsonFile('/workspace', '');
-    var workspace = PackageConfigWorkspace.find(
-      resourceProvider,
-      Packages.empty,
-      convertPath('/workspace'),
-    );
-    expect(workspace?.root, convertPath('/workspace'));
-  }
-
-  void test_find_hasPubspec_noDartTool_dontGoUp() {
-    newFolder('/workspace/.dart_tool/build/generated');
-    newPackageConfigJsonFile('/workspace/aaa', '');
-
-    newPubspecYamlFile('/workspace/aaa', '*');
-
-    var workspace = PackageConfigWorkspace.find(
-      resourceProvider,
-      Packages.empty,
-      convertPath('/workspace/aaa/lib'),
-    );
-    expect(workspace?.root, convertPath('/workspace/aaa'));
-  }
-
-  void test_find_hasPubspecNoDartTool() {
-    var workspace = PackageConfigWorkspace.find(
-      resourceProvider,
-      Packages.empty,
-      convertPath('/workspace'),
-    );
-    expect(workspace, isNull);
-  }
-
-  void test_findFile_bin() {
-    newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final binFile = newFile('/workspace/bin/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
-  }
-
-  void test_findFile_binGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    newPubspecYamlFile('/workspace', 'name: project');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final binFile = newFile(
-        '/workspace/.dart_tool/build/generated/project/bin/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
-  }
-
-  void test_findFile_libGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newPubspecYamlFile('/workspace', 'name: project');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final libFile = newFile(
-        '/workspace/.dart_tool/build/generated/project/lib/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/lib/file.dart')), libFile);
-  }
-
-  void test_findFile_test() {
-    newFolder('/workspace/.dart_tool/build/generated/project/test');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final testFile = newFile('/workspace/test/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
-  }
-
-  void test_findFile_testGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/test');
-    newPubspecYamlFile('/workspace', 'name: project');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final testFile = newFile(
-        '/workspace/.dart_tool/build/generated/project/test/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
-  }
-
-  void test_findFile_web() {
-    newFolder('/workspace/.dart_tool/build/generated/project/web');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final webFile = newFile('/workspace/web/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
-  }
-
-  void test_findFile_webGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/web');
-    newPubspecYamlFile('/workspace', 'name: project');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final webFile = newFile(
-        '/workspace/.dart_tool/build/generated/project/web/file.dart', '');
-    expect(
-        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
-  }
-
-  void test_isConsistentWithFileSystem() {
-    newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-    expect(workspace.isConsistentWithFileSystem, isTrue);
-
-    newPackageConfigJsonFile('/workspace', 'project:/workspace');
-    expect(workspace.isConsistentWithFileSystem, isFalse);
-  }
-
-  void test_multiple_packages() {
-    var aFilePath = '/workspace/a/lib/a.dart';
-    var bFilePath = '/workspace/b/b.dart';
-    _addResources(['/workspace/a/lib/', '/workspace/b/', aFilePath, bFilePath]);
-    newPubspecYamlFile('/workspace/a', 'name: a');
-    PackageConfigWorkspace workspace =
-        _createWorkspace('/workspace', ['project', 'foo']);
-    expect(workspace.root, convertPath('/workspace'));
-    workspace.findPackageFor(convertPath(aFilePath));
-    workspace.findPackageFor(convertPath(bFilePath));
-    expect(workspace.allPackages,
-        unorderedEquals([isA<PubPackage>(), isA<BasicWorkspacePackage>()]));
-  }
-
-  void _addResources(List<String> paths) {
-    for (String path in paths) {
-      if (path.endsWith('/')) {
-        newFolder(path.substring(0, path.length - 1));
-      } else {
-        newFile(path, '');
-      }
-    }
-  }
-
-  PackageConfigWorkspace _createWorkspace(
-      String root, List<String> packageNames) {
-    var config = PackageConfigFileBuilder();
-    for (var name in packageNames) {
-      config.add(name: name, rootPath: convertPath('/packages/$name'));
-    }
-    newPackageConfigJsonFile(root, config.toContent(toUriStr: toUriStr));
-    return PackageConfigWorkspace.find(
-      resourceProvider,
-      Packages.empty,
-      convertPath(root),
-    )!;
-  }
-}
-
-@reflectiveTest
-class PubPackageTest extends WorkspacePackageTest {
-  late final PackageConfigWorkspace myWorkspace;
-  late final WorkspacePackage myPackage;
+class PubWorkspacePackageTest extends WorkspacePackageTest {
+  late final PubWorkspace myWorkspace;
+  late final PubWorkspacePackage myPackage;
 
   String get fooPackageLibPath => '$fooPackageRootPath/lib';
 
@@ -553,29 +278,45 @@
 
     // workspace 1 with packages 'p1' and 'workspace'
     newPubspecYamlFile('/workspace', 'name: project');
-    var config = PackageConfigFileBuilder();
-    config.add(name: 'p1', rootPath: '/.pubcache/p1');
-    config.add(name: 'workspace', rootPath: '/workspace');
-    newPackageConfigJsonFile(
-        '/workspace', config.toContent(toUriStr: toUriStr));
-    workspace = PackageConfigWorkspace.find(
+    workspace = PubWorkspace.find(
       resourceProvider,
-      Packages.empty,
+      Packages({
+        'p1': Package(
+          name: 'p1',
+          rootFolder: getFolder('/.pubcache/p1'),
+          libFolder: getFolder('/.pubcache/p1/lib'),
+          languageVersion: null,
+        ),
+        'workspace': Package(
+          name: 'workspace',
+          rootFolder: getFolder('/workspace'),
+          libFolder: getFolder('/workspace/lib'),
+          languageVersion: null,
+        ),
+      }),
       convertPath('/workspace'),
     )!;
     expect(workspace.isBlaze, isFalse);
 
     // workspace 2 with packages 'my' and 'foo'
     newPubspecYamlFile(myPackageRootPath, 'name: my');
-    config = PackageConfigFileBuilder();
-    config.add(name: 'my', rootPath: myPackageRootPath);
-    config.add(name: 'foo', rootPath: fooPackageRootPath);
-    newPackageConfigJsonFile(
-        myPackageRootPath, config.toContent(toUriStr: toUriStr));
     newFolder(myPackageGeneratedPath);
-    myWorkspace = PackageConfigWorkspace.find(
+    myWorkspace = PubWorkspace.find(
       resourceProvider,
-      Packages.empty,
+      Packages({
+        'my': Package(
+          name: 'my',
+          rootFolder: getFolder(myPackageRootPath),
+          libFolder: getFolder(myPackageLibPath),
+          languageVersion: null,
+        ),
+        'foo': Package(
+          name: 'foo',
+          rootFolder: getFolder(fooPackageRootPath),
+          libFolder: getFolder(fooPackageLibPath),
+          languageVersion: null,
+        ),
+      }),
       convertPath(myPackageRootPath),
     )!;
     final fakeFile = getFile('$myPackageLibPath/fake.dart');
@@ -608,6 +349,28 @@
     );
   }
 
+  test_contains_fileUri_generated() {
+    var myGeneratedPath = '$myPackageGeneratedPath/my/test/a.dart';
+    newFile(myGeneratedPath, '');
+
+    var fooGeneratedPath = '$myPackageGeneratedPath/foo/test/a.dart';
+    newFile(fooGeneratedPath, '');
+
+    expect(
+      myPackage.contains(
+        _sourceWithFileUri(myGeneratedPath),
+      ),
+      isTrue,
+    );
+
+    expect(
+      myPackage.contains(
+        _sourceWithFileUri(fooGeneratedPath),
+      ),
+      isFalse,
+    );
+  }
+
   test_contains_packageUri() {
     expect(
       myPackage.contains(
@@ -672,6 +435,22 @@
     expect(package.workspace, myWorkspace);
   }
 
+  test_findPackageFor_my_generated_other() {
+    expect(
+      myWorkspace.findPackageFor(
+        convertPath('$myPackageGeneratedPath/foo/lib/a.dart'),
+      ),
+      isNull,
+    );
+
+    expect(
+      myWorkspace.findPackageFor(
+        convertPath('$myPackageGeneratedPath/foo/test/a.dart'),
+      ),
+      isNull,
+    );
+  }
+
   test_findPackageFor_my_generated_testFile() {
     var package = myWorkspace.findPackageFor(
       convertPath('$myPackageGeneratedPath/my/test/a.dart'),
@@ -746,6 +525,288 @@
   }
 }
 
+@reflectiveTest
+class PubWorkspaceTest with ResourceProviderMixin {
+  void test_builtFile_currentProject() {
+    newFolder('/workspace/.dart_tool/build');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final libFile = newFile(
+        '/workspace/.dart_tool/build/generated/project/lib/file.dart', '');
+    expect(
+        workspace.builtFile(convertPath('lib/file.dart'), 'project'), libFile);
+  }
+
+  void test_builtFile_importedPackage() {
+    newFolder('/workspace/.dart_tool/build');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project', 'foo']);
+
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/foo/lib/file.dart', '');
+    expect(workspace.builtFile(convertPath('lib/file.dart'), 'foo'), libFile);
+  }
+
+  void test_builtFile_notInPackagesGetsHidden() {
+    newFolder('/workspace/.dart_tool/build');
+    newPubspecYamlFile('/workspace', 'name: project');
+
+    // Ensure package:bar is not configured.
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project', 'foo']);
+
+    // Create a generated file in package:bar.
+    newFile('/workspace/.dart_tool/build/generated/bar/lib/file.dart', '');
+
+    // Bar not in packages, file should not be returned.
+    expect(workspace.builtFile('lib/file.dart', 'bar'), isNull);
+  }
+
+  void test_find_directory() {
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+    expect(workspace.isBlaze, isFalse);
+    expect(workspace.root, convertPath('/workspace'));
+  }
+
+  void test_find_fail_notAbsolute() {
+    expect(
+        () => PubWorkspace.find(
+            resourceProvider, Packages.empty, convertPath('not_absolute')),
+        throwsA(TypeMatcher<ArgumentError>()));
+  }
+
+  void test_find_file() {
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace =
+        _createWorkspace('/workspace/lib/lib1.dart', ['project']);
+    expect(workspace.root, convertPath('/workspace'));
+  }
+
+  void test_find_hasBuild_hasPubspec_malformed_dontGoToUp() {
+    newFolder('/workspace/.dart_tool/build/generated');
+    newPubspecYamlFile('/workspace', 'name: project');
+
+    newFolder('/workspace/aaa/.dart_tool/build/generated');
+    newPubspecYamlFile('/workspace/aaa', '*');
+    newPackageConfigJsonFile('/workspace/aaa', '');
+
+    PubWorkspace workspace = _createWorkspace('/workspace/aaa/lib', []);
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace/aaa'));
+  }
+
+  void test_find_hasDartToolAndPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newPubspecYamlFile('/workspace', 'name: project');
+
+    PubWorkspace workspace = _createWorkspace('/workspace', []);
+
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.projectPackageName, 'project');
+  }
+
+  void test_find_hasDartToolAndPubspec_inParentDirectory() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newPubspecYamlFile('/workspace/opened/up/a/child/dir', 'name: subproject');
+    newPackageConfigJsonFile('/workspace/opened/up/a/child/dir', '');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace =
+        _createWorkspace('/workspace/opened/up/a/child/dir', ['project']);
+    expect(workspace.root, convertPath('/workspace/opened/up/a/child/dir'));
+    expect(workspace.projectPackageName, 'subproject');
+  }
+
+  void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloDartTool() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace =
+        _createWorkspace('/workspace/opened/up/a/child/dir', ['project']);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.projectPackageName, 'project');
+  }
+
+  void test_find_hasDartToolNoBuild() {
+    // Edge case: an empty .dart_tool directory. Don't assume package:build.
+    newFolder('/workspace/.dart_tool');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+    expect(workspace, isNotNull);
+    expect(workspace.usesPackageBuild, isFalse);
+  }
+
+  void test_find_hasDartToolNoPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    var workspace = PubWorkspace.find(
+      resourceProvider,
+      Packages.empty,
+      convertPath('/workspace'),
+    );
+    expect(workspace, isNull);
+  }
+
+  void test_find_hasDartToolPubButNotBuild() {
+    // Dart projects will have this directory, that don't use package:build.
+    newFolder('/workspace/.dart_tool/pub');
+    newPubspecYamlFile('/workspace', 'name: project');
+    var workspace = PubWorkspace.find(
+      resourceProvider,
+      Packages.empty,
+      convertPath('/workspace'),
+    );
+    expect(workspace!.root, convertPath('/workspace'));
+    expect(workspace.usesPackageBuild, isFalse);
+  }
+
+  void test_find_hasMalformedPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newPubspecYamlFile('/workspace', 'not: yaml: here! 1111');
+    var workspace = PubWorkspace.find(
+      resourceProvider,
+      Packages.empty,
+      convertPath('/workspace'),
+    );
+    expect(workspace?.root, convertPath('/workspace'));
+  }
+
+  void test_find_hasPubspec_noDartTool_dontGoUp() {
+    newFolder('/workspace/.dart_tool/build/generated');
+    newPubspecYamlFile('/workspace', 'name: project');
+
+    newPubspecYamlFile('/workspace/aaa', '*');
+
+    var workspace = PubWorkspace.find(
+      resourceProvider,
+      Packages.empty,
+      convertPath('/workspace/aaa/lib'),
+    );
+    expect(workspace?.root, convertPath('/workspace/aaa'));
+    expect(workspace?.usesPackageBuild, isFalse);
+  }
+
+  void test_find_hasPubspecNoDartTool() {
+    newPubspecYamlFile('/workspace', 'name: project');
+    var workspace = PubWorkspace.find(
+      resourceProvider,
+      Packages.empty,
+      convertPath('/workspace'),
+    );
+    expect(workspace?.root, convertPath('/workspace'));
+    expect(workspace?.usesPackageBuild, isFalse);
+  }
+
+  void test_find_missingPubspec() {
+    var workspace = PubWorkspace.find(resourceProvider, Packages.empty,
+        convertPath('/workspace/lib/lib1.dart'));
+    expect(workspace, isNull);
+  }
+
+  void test_findFile_bin() {
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final binFile = newFile('/workspace/bin/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
+  }
+
+  void test_findFile_binGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final binFile = newFile(
+        '/workspace/.dart_tool/build/generated/project/bin/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
+  }
+
+  void test_findFile_libGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final libFile = newFile(
+        '/workspace/.dart_tool/build/generated/project/lib/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/lib/file.dart')), libFile);
+  }
+
+  void test_findFile_test() {
+    newFolder('/workspace/.dart_tool/build/generated/project/test');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final testFile = newFile('/workspace/test/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
+  }
+
+  void test_findFile_testGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/test');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final testFile = newFile(
+        '/workspace/.dart_tool/build/generated/project/test/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
+  }
+
+  void test_findFile_web() {
+    newFolder('/workspace/.dart_tool/build/generated/project/web');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final webFile = newFile('/workspace/web/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
+  }
+
+  void test_findFile_webGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/web');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+
+    final webFile = newFile(
+        '/workspace/.dart_tool/build/generated/project/web/file.dart', '');
+    expect(
+        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
+  }
+
+  void test_isConsistentWithFileSystem() {
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newPubspecYamlFile('/workspace', 'name: project');
+    PubWorkspace workspace = _createWorkspace('/workspace', ['project']);
+    expect(workspace.isConsistentWithFileSystem, isTrue);
+
+    newPubspecYamlFile('/workspace', 'name: my2');
+    expect(workspace.isConsistentWithFileSystem, isFalse);
+  }
+
+  PubWorkspace _createWorkspace(String root, List<String> packageNames) {
+    var packageMap = <String, Package>{};
+    for (var name in packageNames) {
+      packageMap[name] = Package(
+        name: name,
+        rootFolder: getFolder('/packages/$name'),
+        libFolder: getFolder('/packages/$name/lib'),
+        languageVersion: null,
+      );
+    }
+
+    return PubWorkspace.find(
+      resourceProvider,
+      Packages(packageMap),
+      convertPath(root),
+    )!;
+  }
+}
+
 class _MockSource implements Source {
   final String path;
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 135ad33..8490d01 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -252,8 +252,9 @@
           var contextRoot =
               analysisDriver.currentSession.analysisContext.contextRoot;
           var package = contextRoot.workspace.findPackageFor(file.path);
-          var sdkVersionConstraint =
-              (package is PubPackage) ? package.sdkVersionConstraint : null;
+          var sdkVersionConstraint = (package is PubWorkspacePackage)
+              ? package.sdkVersionConstraint
+              : null;
           var errors = analyzeAnalysisOptions(
             file.createSource(),
             content,
diff --git a/pkg/linter/lib/src/analyzer.dart b/pkg/linter/lib/src/analyzer.dart
index 77291b4..d8c073c 100644
--- a/pkg/linter/lib/src/analyzer.dart
+++ b/pkg/linter/lib/src/analyzer.dart
@@ -34,7 +34,7 @@
 export 'package:analyzer/src/lint/pub.dart' show PSEntry, PubspecVisitor;
 export 'package:analyzer/src/lint/util.dart' show FileSpelunker;
 export 'package:analyzer/src/services/lint.dart' show lintRegistry;
-export 'package:analyzer/src/workspace/pub.dart' show PubPackage;
+export 'package:analyzer/src/workspace/pub.dart' show PubWorkspacePackage;
 
 const loggedAnalyzerErrorExitCode = 63;
 
diff --git a/pkg/linter/lib/src/rules/pub/depend_on_referenced_packages.dart b/pkg/linter/lib/src/rules/pub/depend_on_referenced_packages.dart
index 07ae793..ab344dc 100644
--- a/pkg/linter/lib/src/rules/pub/depend_on_referenced_packages.dart
+++ b/pkg/linter/lib/src/rules/pub/depend_on_referenced_packages.dart
@@ -65,7 +65,7 @@
       NodeLintRegistry registry, LinterContext context) {
     // Only lint if we have a pubspec.
     var package = context.package;
-    if (package is! PubPackage) return;
+    if (package is! PubWorkspacePackage) return;
     var pubspec = package.pubspec;
     if (pubspec == null) return;
     var name = pubspec.name?.value.text;