blob: 8dc0f0a76ac2c75da20014b277b340c7037b76c8 [file] [log] [blame]
// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.cmdline;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.util.BatchCallback;
import com.google.devtools.build.lib.vfs.PathFragment;
/**
* A callback interface that is used during the process of converting target patterns (such as
* <code>//foo:all</code>) into one or more lists of targets (such as <code>//foo:foo,
* //foo:bar</code>). During a call to {@link TargetPattern#eval}, the {@link TargetPattern} makes
* calls to this interface to implement the target pattern semantics. The generic type {@code T} is
* only for compile-time type safety; there are no requirements to the actual type.
*/
public interface TargetPatternResolver<T> {
/**
* Reports the given warning.
*/
void warn(String msg);
/**
* Returns a single target corresponding to the given label, or null. This method may only throw
* an exception if the current thread was interrupted.
*/
T getTargetOrNull(Label label) throws InterruptedException;
/**
* Returns a single target corresponding to the given label, or an empty or failed result.
*/
ResolvedTargets<T> getExplicitTarget(Label label)
throws TargetParsingException, InterruptedException;
/**
* Returns the set containing the targets found in the given package. The specified directory is
* not necessarily a valid package name. If {@code rulesOnly} is true, then this method should
* only return rules in the given package.
*
* @param originalPattern the original target pattern for error reporting purposes
* @param packageIdentifier the identifier of the package
* @param rulesOnly whether to return rules only
*/
ResolvedTargets<T> getTargetsInPackage(String originalPattern,
PackageIdentifier packageIdentifier, boolean rulesOnly)
throws TargetParsingException, InterruptedException;
/**
* Computes the set containing the targets found below the given {@code directory}, passing it in
* batches to {@code callback}. Conceptually, this method should look for all packages that start
* with the {@code directory} (as a proper prefix directory, i.e., "foo/ba" is not a proper prefix
* of "foo/bar/"), and then collect all targets in each such package (subject to
* {@code rulesOnly}) as if calling {@link #getTargetsInPackage}. The specified directory is not
* necessarily a valid package name.
*
* <p>Note that the {@code directory} can be empty, which corresponds to the "//..." pattern.
* Implementations may choose not to support this case and throw an {@link
* IllegalArgumentException} exception instead, or may restrict the set of directories that are
* considered by default.
*
* <p>If the {@code directory} points to a package, then that package should also be part of the
* result.
*
* @param originalPattern the original target pattern for error reporting purposes
* @param directory the directory in which to look for packages
* @param rulesOnly whether to return rules only
* @param excludedSubdirectories a set of transitive subdirectories beneath {@code directory}
* to ignore
* @param callback the callback to receive the result, possibly in multiple batches.
* @param exceptionClass The class type of the parameterized exception.
* @throws TargetParsingException under implementation-specific failure conditions
*/
<E extends Exception> void findTargetsBeneathDirectory(
RepositoryName repository,
String originalPattern,
String directory,
boolean rulesOnly,
ImmutableSet<PathFragment> excludedSubdirectories,
BatchCallback<T, E> callback, Class<E> exceptionClass)
throws TargetParsingException, E, InterruptedException;
/**
* Returns true, if and only if the given package identifier corresponds to a package, i.e., a
* file with the name {@code packageName/BUILD} exists in the appropriat repository.
*/
boolean isPackage(PackageIdentifier packageIdentifier);
/**
* Returns the target kind of the given target, for example {@code cc_library rule}.
*/
String getTargetKind(T target);
}