// Copyright (c) 2017, 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 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/source/source.dart'; import 'package:analyzer/src/context/packages.dart'; import 'package:analyzer/src/workspace/simple.dart'; import 'package:analyzer/src/workspace/workspace.dart'; /// Information about a default Dart workspace. /// /// A BasicWorkspace should only be used when no other workspace type is valid. class BasicWorkspace extends SimpleWorkspace { /// The singular package in this workspace. /// /// Each basic workspace is itself one package. late final BasicWorkspacePackage theOnlyPackage; BasicWorkspace._(ResourceProvider provider, Packages packages, Folder root) : super(provider, packages, root.path) { theOnlyPackage = BasicWorkspacePackage(root, this); } @override WorkspacePackageImpl? findPackageFor(String filePath) { Folder folder = provider.getFolder(filePath); if (provider.pathContext.isWithin(root, folder.path)) { return theOnlyPackage; } else { return null; } } /// Find the basic workspace that contains the given [path]. /// /// As a [BasicWorkspace] is not defined by any marker files or build /// artifacts, this simply creates a BasicWorkspace with [path] as the [root] /// (or [path]'s parent if [path] points to a file). static BasicWorkspace find( ResourceProvider provider, Packages packages, String path, ) { Resource resource = provider.getResource(path); if (resource is File) { resource = resource.parent; } return BasicWorkspace._(provider, packages, resource as Folder); } } /// Information about a package defined in a [BasicWorkspace]. /// /// 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 [BasicWorkspace]. class BasicWorkspacePackage extends WorkspacePackageImpl { @override final Folder root; @override final SimpleWorkspace workspace; BasicWorkspacePackage(this.root, this.workspace); @override bool get canHavePublicApi => false; @override bool contains(Source source) { // When dealing with a BasicWorkspace, [source] will always have a valid // fullName. String filePath = source.fullName; // There is a 1-1 relationship between [BasicWorkspace]s and // [BasicWorkspacePackage]s. If a file is in a package's workspace, then it // is in the package as well. return workspace.provider.pathContext.isWithin(root.path, filePath); } @override Packages packagesAvailableTo(String libraryPath) => workspace.packages; @override bool sourceIsInPublicApi(Source source) { // Since every source file in a BasicPackage is in the same directory, they // are all in the public API of the package. A file in a subdirectory // is in a separate package. return true; } }