diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index b51a93a..e11bd6e 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -5,7 +5,6 @@
 import 'dart:io' as io;
 
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
@@ -15,8 +14,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/io.dart';
 import 'package:analyzer/src/lint/linter.dart';
-import 'package:analyzer/src/lint/project.dart';
-import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:yaml/yaml.dart';
 
@@ -124,18 +121,9 @@
       },
     );
 
-    AnalysisSession? projectAnalysisSession;
     for (io.File file in files) {
       var path = _absoluteNormalizedPath(file.path);
       _filesAnalyzed.add(path);
-      var analysisContext = contextCollection.contextFor(path);
-      var analysisSession = analysisContext.currentSession;
-      projectAnalysisSession = analysisSession;
-    }
-
-    if (projectAnalysisSession != null) {
-      // ignore: deprecated_member_use_from_same_package
-      await _visitProject(projectAnalysisSession);
     }
 
     var result = <AnalysisErrorInfo>[];
@@ -161,24 +149,6 @@
     path = pathContext.normalize(path);
     return path;
   }
-
-  @Deprecated('DartProject is deprecated. This is slated for removal')
-  Future<void> _visitProject(AnalysisSession projectAnalysisSession) async {
-    Future<DartProject> createProject() async {
-      return await DartProject.create(
-        projectAnalysisSession,
-        _filesAnalyzed.toList(),
-      );
-    }
-
-    DartProject? project;
-    for (var lint in Registry.ruleRegistry) {
-      if (lint is ProjectVisitor) {
-        project ??= await createProject();
-        (lint as ProjectVisitor).visit(project);
-      }
-    }
-  }
 }
 
 /// Prints logging information comments to the [outSink] and error messages to
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index bbbb005..cab3bd7 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -35,7 +35,6 @@
 import 'package:analyzer/src/lint/config.dart';
 import 'package:analyzer/src/lint/io.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart' show NodeLintRegistry;
-import 'package:analyzer/src/lint/project.dart';
 import 'package:analyzer/src/lint/pub.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/services/lint.dart' show Linter;
@@ -627,11 +626,6 @@
     return name.compareTo(other.name);
   }
 
-  /// Return a visitor to be passed to provide access to Dart project context
-  /// and to perform project-level analyses.
-  @Deprecated('Use LinterContext instead')
-  ProjectVisitor? getProjectVisitor() => null;
-
   /// Return a visitor to be passed to pubspecs to perform lint
   /// analysis.
   /// Lint errors are reported via this [Linter]'s error [reporter].
diff --git a/pkg/analyzer/lib/src/lint/project.dart b/pkg/analyzer/lib/src/lint/project.dart
deleted file mode 100644
index 17f95be..0000000
--- a/pkg/analyzer/lib/src/lint/project.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/resolver/scope.dart';
-import 'package:analyzer/src/lint/io.dart';
-import 'package:analyzer/src/lint/pub.dart';
-import 'package:collection/collection.dart';
-import 'package:path/path.dart' as p;
-
-Pubspec? _findAndParsePubspec(Directory root) {
-  if (root.existsSync()) {
-    var pubspec = root
-        .listSync(followLinks: false)
-        .whereType<File>()
-        .firstWhereOrNull((f) => isPubspecFile(f));
-    if (pubspec != null) {
-      return Pubspec.parse(pubspec.readAsStringSync(),
-          sourceUrl: p.toUri(pubspec.path));
-    }
-  }
-  return null;
-}
-
-/// A semantic representation of a Dart project.
-///
-/// Projects provide a semantic model of a Dart project based on the
-/// [pub package layout conventions](https://dart.dev/tools/pub/package-layout).
-/// This model allows clients to traverse project contents in a convenient and
-/// standardized way, access global information (such as whether elements are
-/// in the "public API") and resources that have special meanings in the
-/// context of pub package layout conventions.
-@Deprecated('Use LinterContext instead')
-class DartProject {
-  late final _ApiModel _apiModel;
-  String? _name;
-  Pubspec? _pubspec;
-
-  /// Project root.
-  final Directory root;
-
-  /// Create a Dart project for the corresponding [analysisSession] and [files].
-  /// If a [dir] is unspecified the current working directory will be
-  /// used.
-  ///
-  /// Note: clients should call [create] which performs API model initialization.
-  DartProject._(AnalysisSession analysisSession, List<String> files,
-      {Directory? dir})
-      : root = dir ?? Directory.current {
-    _pubspec = _findAndParsePubspec(root);
-    _apiModel = _ApiModel(analysisSession, files, root);
-  }
-
-  /// The project's name.
-  ///
-  /// Project names correspond to the package name as specified in the project's
-  /// [pubspec]. The pubspec is found relative to the project [root].  If no
-  /// pubspec can be found, the name defaults to the project root basename.
-  String get name => _name ??= _calculateName();
-
-  /// The project's pubspec.
-  Pubspec? get pubspec => _pubspec;
-
-  /// Returns `true` if the given element is part of this project's public API.
-  ///
-  /// Public API elements are defined as all elements that are in the packages's
-  /// `lib` directory, *less* those in `lib/src` (which are treated as private
-  /// *implementation files*), plus elements having been explicitly exported
-  /// via an `export` directive.
-  bool isApi(Element element) => _apiModel.contains(element);
-
-  String _calculateName() {
-    final pubspec = this.pubspec;
-    if (pubspec != null) {
-      var nameEntry = pubspec.name;
-      if (nameEntry != null) {
-        return nameEntry.value.text!;
-      }
-    }
-    return p.basename(root.path);
-  }
-
-  /// Create an initialized Dart project for the corresponding [analysisSession]
-  /// and [files].
-  /// If a [dir] is unspecified the current working directory will be
-  /// used.
-  static Future<DartProject> create(
-      AnalysisSession analysisSession, List<String> files,
-      {Directory? dir}) async {
-    DartProject project = DartProject._(analysisSession, files, dir: dir);
-    await project._apiModel._calculate();
-    return project;
-  }
-}
-
-/// An object that can be used to visit Dart project structure.
-@Deprecated('Use LinterContext instead')
-abstract class ProjectVisitor<T> {
-  T? visit(DartProject project) => null;
-}
-
-/// Captures the project's API as defined by pub package layout standards.
-class _ApiModel {
-  final AnalysisSession analysisSession;
-  final List<String> files;
-  final Directory root;
-  final Set<Element> elements = {};
-
-  _ApiModel(this.analysisSession, this.files, this.root) {
-    _calculate();
-  }
-
-  /// Return `true` if this element is part of the public API for this package.
-  bool contains(Element? element) {
-    while (element != null) {
-      if (!element.isPrivate && elements.contains(element)) {
-        return true;
-      }
-      element = element.enclosingElement;
-    }
-    return false;
-  }
-
-  Future<void> _calculate() async {
-    if (files.isEmpty) {
-      return;
-    }
-
-    String libDir = '${root.path}/lib';
-    String libSrcDir = '$libDir/src';
-
-    for (var file in files) {
-      if (file.startsWith(libDir) && !file.startsWith(libSrcDir)) {
-        var result = await analysisSession.getResolvedUnit(file);
-        if (result is ResolvedUnitResult) {
-          LibraryElement library = result.libraryElement;
-
-          NamespaceBuilder namespaceBuilder = NamespaceBuilder();
-          Namespace exports =
-              namespaceBuilder.createExportNamespaceForLibrary(library);
-          Namespace public =
-              namespaceBuilder.createPublicNamespaceForLibrary(library);
-          elements.addAll(exports.definedNames.values);
-          elements.addAll(public.definedNames.values);
-        }
-      }
-    }
-  }
-}
diff --git a/pkg/analyzer/test/src/lint/project_test.dart b/pkg/analyzer/test/src/lint/project_test.dart
deleted file mode 100644
index 8b6d01a..0000000
--- a/pkg/analyzer/test/src/lint/project_test.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/src/lint/project.dart';
-import 'package:test/test.dart';
-
-main() {
-//  defineTests();
-}
-
-defineTests() {
-  group('project', () {
-    group('basic', () {
-      // TODO(brianwilkerson) These tests fail on the bots because the cwd is
-      // not the same there as when we run tests locally.
-      group('cwd', () async {
-        // ignore: deprecated_member_use_from_same_package
-        var project = await DartProject.create(_AnalysisSessionMock(), []);
-        test('name', () {
-          expect(project.name, 'analyzer');
-        });
-        test('spec', () {
-          expect(project.pubspec, isNotNull);
-        });
-        test('root', () {
-          expect(project.root.path, Directory.current.path);
-        });
-      });
-      // TODO(brianwilkerson) Rewrite these to use a memory resource provider.
-//      group('p1', () {
-//        var project =
-//            new DartProject(null, null, dir: new Directory('test/_data/p1'));
-//        test('name', () {
-//          expect(project.name, 'p1');
-//        });
-//        test('spec', () {
-//          expect(project.pubspec, isNotNull);
-//          expect(project.pubspec.name.value.text, 'p1');
-//        });
-//        test('root', () {
-//          expect(project.root.path, 'test/_data/p1');
-//        });
-//      });
-//      group('no pubspec', () {
-//        var project = new DartProject(null, null,
-//            dir: new Directory('test/_data/p1/src'));
-//        test('name', () {
-//          expect(project.name, 'src');
-//        });
-//        test('spec', () {
-//          expect(project.pubspec, isNull);
-//        });
-//        test('root', () {
-//          expect(project.root.path, 'test/_data/p1/src');
-//        });
-//      });
-    });
-  });
-}
-
-class _AnalysisSessionMock implements AnalysisSession {
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
diff --git a/pkg/analyzer/test/src/lint/test_all.dart b/pkg/analyzer/test/src/lint/test_all.dart
index 6b1afdc..801f080 100644
--- a/pkg/analyzer/test/src/lint/test_all.dart
+++ b/pkg/analyzer/test/src/lint/test_all.dart
@@ -8,7 +8,6 @@
 import 'io_test.dart' as io;
 import 'lint_rule_test.dart' as lint_rule;
 import 'linter/test_all.dart' as linter;
-import 'project_test.dart' as project;
 import 'pub_test.dart' as pub;
 
 main() {
@@ -17,7 +16,6 @@
     io.main();
     lint_rule.main();
     linter.main();
-    project.main();
     pub.main();
   }, name: 'lint');
 }
