aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java79
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java5
4 files changed, 64 insertions, 31 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
index 2ca221598f..e997b9f78d 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
@@ -172,32 +172,62 @@ public abstract class TargetPattern implements Serializable {
/**
* Returns {@code true} iff this pattern has type {@code Type.TARGETS_BELOW_DIRECTORY} and
- * {@code directory} is contained by or equals this pattern's directory. For example,
- * returns {@code true} for {@code this = TargetPattern ("//...")} and {@code directory
- * = "foo")}.
+ * {@code directory} is contained by or equals this pattern's directory.
+ *
+ * <p>For example, returns {@code true} for {@code this = TargetPattern ("//...")} and
+ * {@code directory = "foo")}.
*/
- public abstract boolean containsBelowDirectory(PackageIdentifier directory);
+ public abstract boolean containsAllTransitiveSubdirectoriesForTBD(PackageIdentifier directory);
/**
- * Shorthand for {@code containsBelowDirectory(containedPattern.getDirectory())}.
+ * Returns {@code true} iff both this pattern and {@code containedPattern} have type
+ * {@code Type.TARGETS_BELOW_DIRECTORY} and the directory in question for {@code containedPattern}
+ * is underneath the directory in question for this pattern.
+ *
+ * <p>That is, when this method returns {@code true} it means every target matched by
+ * {@code containedPattern} is also matched by this pattern.
*/
- public boolean containsBelowDirectory(TargetPattern containedPattern) {
- return containsBelowDirectory(containedPattern.getDirectory());
+ public boolean containsDirectoryOfTBDForTBD(TargetPattern containedPattern) {
+ return containedPattern.getType() != Type.TARGETS_BELOW_DIRECTORY
+ ? false
+ : containsAllTransitiveSubdirectoriesForTBD(
+ containedPattern.getDirectoryForTargetsUnderDirectory());
}
/**
- * Returns a {@link PackageIdentifier} identifying the most specific containing directory of the
- * patterns that could be matched by this pattern.
+ * For patterns of type {@link Type#TARGETS_BELOW_DIRECTORY}, returns a {@link PackageIdentifier}
+ * identifying the most specific containing directory of the patterns that could be matched by
+ * this pattern.
*
* <p>Note that we are using the {@link PackageIdentifier} type as a convenience; there may not
* actually be a package corresponding to this directory!
*
- * <p>For patterns of type {@code Type.TARGETS_BELOW_DIRECTORY}, this returns a
- * {@link PackageIdentifier} that identifies the referred-to directory. For example, for a
- * {@code Type.TARGETS_BELOW_DIRECTORY} corresponding to "//foo/bar/...", this method returns a
- * {@link PackageIdentifier} for "foo/bar".
+ * <p>This returns a {@link PackageIdentifier} that identifies the referred-to directory. For
+ * example, for a {@link Type#TARGETS_BELOW_DIRECTORY} corresponding to "//foo/bar/...", this
+ * method returns a {@link PackageIdentifier} for "foo/bar".
+ */
+ public PackageIdentifier getDirectoryForTargetsUnderDirectory() {
+ throw new IllegalStateException();
+ }
+
+ /**
+ * For patterns of type {@link Type#PATH_AS_TARGET}, returns the path in question.
+ *
+ * <p>The interpretation of this path, of course, depends on the existence of packages.
+ * See {@link InterpretPathAsTarget#eval}.
+ */
+ public String getPathForPathAsTarget() {
+ throw new IllegalStateException();
+ }
+
+ /**
+ * For patterns of type {@link Type#SINGLE_TARGET} and {@link Type#TARGETS_IN_PACKAGE}, returns
+ * the {@link PackageIdentifier} corresponding to the package that would contain the target(s)
+ * matched by this {@link TargetPattern}.
*/
- public abstract PackageIdentifier getDirectory();
+ public PackageIdentifier getDirectoryForTargetOrTargetsInPackage() {
+ throw new IllegalStateException();
+ }
/**
* Returns {@code true} iff this pattern has type {@code Type.TARGETS_BELOW_DIRECTORY} or
@@ -231,12 +261,12 @@ public abstract class TargetPattern implements Serializable {
}
@Override
- public boolean containsBelowDirectory(PackageIdentifier directory) {
+ public boolean containsAllTransitiveSubdirectoriesForTBD(PackageIdentifier directory) {
return false;
}
@Override
- public PackageIdentifier getDirectory() {
+ public PackageIdentifier getDirectoryForTargetOrTargetsInPackage() {
return directory;
}
@@ -307,16 +337,13 @@ public abstract class TargetPattern implements Serializable {
}
@Override
- public boolean containsBelowDirectory(PackageIdentifier directory) {
+ public boolean containsAllTransitiveSubdirectoriesForTBD(PackageIdentifier directory) {
return false;
}
@Override
- public PackageIdentifier getDirectory() {
- int lastSlashIndex = path.lastIndexOf('/');
- // The package name cannot be illegal because we verified it during target parsing
- return PackageIdentifier.createInMainRepo(
- lastSlashIndex < 0 ? "" : path.substring(0, lastSlashIndex));
+ public String getPathForPathAsTarget() {
+ return path;
}
@Override
@@ -386,12 +413,12 @@ public abstract class TargetPattern implements Serializable {
}
@Override
- public boolean containsBelowDirectory(PackageIdentifier directory) {
+ public boolean containsAllTransitiveSubdirectoriesForTBD(PackageIdentifier directory) {
return false;
}
@Override
- public PackageIdentifier getDirectory() {
+ public PackageIdentifier getDirectoryForTargetOrTargetsInPackage() {
return packageIdentifier;
}
@@ -510,7 +537,7 @@ public abstract class TargetPattern implements Serializable {
}
@Override
- public boolean containsBelowDirectory(PackageIdentifier containedDirectory) {
+ public boolean containsAllTransitiveSubdirectoriesForTBD(PackageIdentifier containedDirectory) {
// Note that merely checking to see if the directory startsWith the TargetsBelowDirectory's
// directory is insufficient. "food" begins with "foo", but "//foo/..." does not contain
// "//food/...".
@@ -519,7 +546,7 @@ public abstract class TargetPattern implements Serializable {
}
@Override
- public PackageIdentifier getDirectory() {
+ public PackageIdentifier getDirectoryForTargetsUnderDirectory() {
return directory;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
index 337b14decf..9f922da527 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
@@ -177,7 +177,9 @@ public final class GraphBackedRecursivePackageProvider implements RecursivePacka
boolean isTBD = pattern.getType().equals(Type.TARGETS_BELOW_DIRECTORY);
PackageIdentifier packageIdentifier = PackageIdentifier.create(
repository, directory);
- if (isTBD && pattern.containsBelowDirectory(packageIdentifier)) {
+ if (isTBD
+ && pattern.containsAllTransitiveSubdirectoriesForTBD(
+ packageIdentifier)) {
inUniverse = true;
break;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java
index 423d07eb0d..eb1754e9dd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java
@@ -144,8 +144,11 @@ public class PrepareDepsOfPatternValue implements SkyValue {
TargetPatternKey laterTargetPatternKey = (TargetPatternKey) laterSkyKey.argument();
TargetPattern laterParsedPattern = laterTargetPatternKey.getParsedPattern();
if (laterTargetPatternKey.isNegative()
- && targetPatternKey.getParsedPattern().containsBelowDirectory(laterParsedPattern)) {
- excludedDirectoriesBuilder.add(laterParsedPattern.getDirectory().getPackageFragment());
+ && laterParsedPattern.getType() == Type.TARGETS_BELOW_DIRECTORY
+ && targetPatternKey.getParsedPattern().containsDirectoryOfTBDForTBD(
+ laterParsedPattern)) {
+ excludedDirectoriesBuilder.add(
+ laterParsedPattern.getDirectoryForTargetsUnderDirectory().getPackageFragment());
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
index e555b7df99..22b400e80d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
@@ -221,9 +221,10 @@ public final class TargetPatternValue implements SkyValue {
if (parsedPattern.getType() == Type.TARGETS_BELOW_DIRECTORY) {
for (PathFragment blacklistedPackagePrefix : blacklistedPackagePrefixes.get()) {
PackageIdentifier pkgIdForBlacklistedDirectorPrefix = PackageIdentifier.create(
- parsedPattern.getDirectory().getRepository(),
+ parsedPattern.getDirectoryForTargetsUnderDirectory().getRepository(),
blacklistedPackagePrefix);
- if (parsedPattern.containsBelowDirectory(pkgIdForBlacklistedDirectorPrefix)) {
+ if (parsedPattern.containsAllTransitiveSubdirectoriesForTBD(
+ pkgIdForBlacklistedDirectorPrefix)) {
excludedPathsBuilder.add(blacklistedPackagePrefix);
}
}