aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar cushon <cushon@google.com>2017-11-15 08:59:27 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-15 09:01:28 -0800
commit34ff85ef30f483dc617493e64166c1e8a767c708 (patch)
tree71035fd859ef377d8101e1df592ee4b39981f67b
parent275ae45b1228bdd0f912c4fbd634b29ba4180383 (diff)
Refactor the representation of a collection of package specifications
PiperOrigin-RevId: 175832159
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/VisibilityProviderImpl.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java69
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/BlazeQueryVisibility.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/BlazeTargetAccessor.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java6
16 files changed, 144 insertions, 90 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 768d0ad152..a846022a20 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -69,6 +69,7 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.NoSuchThingException;
import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleTransitionFactory;
@@ -1136,8 +1137,9 @@ public class BuildView {
ruleClassProvider.getPrerequisiteValidator(),
((Rule) target.getTarget()).getRuleClassObject().getConfigurationFragmentPolicy())
.setVisibility(
- NestedSetBuilder.<PackageSpecification>create(
- Order.STABLE_ORDER, PackageSpecification.everything()))
+ NestedSetBuilder.create(
+ Order.STABLE_ORDER,
+ PackageGroupContents.create(ImmutableList.of(PackageSpecification.everything()))))
.setPrerequisites(
getPrerequisiteMapForTesting(eventHandler, target, configurations, toolchainContext))
.setConfigConditions(ImmutableMap.<Label, ConfigMatchingProvider>of())
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 767d220cf3..31c436e9e9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -58,6 +58,7 @@ import com.google.devtools.build.lib.packages.OutputFile;
import com.google.devtools.build.lib.packages.PackageGroup;
import com.google.devtools.build.lib.packages.PackageGroupsRuleVisibility;
import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -95,21 +96,23 @@ public final class ConfiguredTargetFactory {
* Returns the visibility of the given target. Errors during package group resolution are reported
* to the {@code AnalysisEnvironment}.
*/
- private NestedSet<PackageSpecification> convertVisibility(
- OrderedSetMultimap<Attribute, ConfiguredTarget> prerequisiteMap, EventHandler reporter,
- Target target, BuildConfiguration packageGroupConfiguration) {
+ private NestedSet<PackageGroupContents> convertVisibility(
+ OrderedSetMultimap<Attribute, ConfiguredTarget> prerequisiteMap,
+ EventHandler reporter,
+ Target target,
+ BuildConfiguration packageGroupConfiguration) {
RuleVisibility ruleVisibility = target.getVisibility();
if (ruleVisibility instanceof ConstantRuleVisibility) {
return ((ConstantRuleVisibility) ruleVisibility).isPubliclyVisible()
- ? NestedSetBuilder.<PackageSpecification>create(
- Order.STABLE_ORDER, PackageSpecification.everything())
- : NestedSetBuilder.<PackageSpecification>emptySet(Order.STABLE_ORDER);
+ ? NestedSetBuilder.create(
+ Order.STABLE_ORDER,
+ PackageGroupContents.create(ImmutableList.of(PackageSpecification.everything())))
+ : NestedSetBuilder.emptySet(Order.STABLE_ORDER);
} else if (ruleVisibility instanceof PackageGroupsRuleVisibility) {
PackageGroupsRuleVisibility packageGroupsVisibility =
(PackageGroupsRuleVisibility) ruleVisibility;
- NestedSetBuilder<PackageSpecification> packageSpecifications =
- NestedSetBuilder.stableOrder();
+ NestedSetBuilder<PackageGroupContents> result = NestedSetBuilder.stableOrder();
for (Label groupLabel : packageGroupsVisibility.getPackageGroups()) {
// PackageGroupsConfiguredTargets are always in the package-group configuration.
ConfiguredTarget group =
@@ -127,15 +130,15 @@ public final class ConfiguredTargetFactory {
provider = group.getProvider(PackageSpecificationProvider.class);
}
if (provider != null) {
- packageSpecifications.addTransitive(provider.getPackageSpecifications());
+ result.addTransitive(provider.getPackageSpecifications());
} else {
reporter.handle(Event.error(target.getLocation(),
String.format("Label '%s' does not refer to a package group", groupLabel)));
}
}
- packageSpecifications.addAll(packageGroupsVisibility.getDirectPackages());
- return packageSpecifications.build();
+ result.add(packageGroupsVisibility.getDirectPackages());
+ return result.build();
} else {
throw new IllegalStateException("unknown visibility");
}
@@ -244,8 +247,8 @@ public final class ConfiguredTargetFactory {
}
// Visibility, like all package groups, doesn't have a configuration
- NestedSet<PackageSpecification> visibility = convertVisibility(
- prerequisiteMap, analysisEnvironment.getEventHandler(), target, null);
+ NestedSet<PackageGroupContents> visibility =
+ convertVisibility(prerequisiteMap, analysisEnvironment.getEventHandler(), target, null);
TargetContext targetContext = new TargetContext(analysisEnvironment, target, config,
prerequisiteMap.get(null), visibility);
if (target instanceof OutputFile) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java
index 436a72e3b0..495beae93b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java
@@ -15,12 +15,12 @@
package com.google.devtools.build.lib.analysis;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
/**
* A {@link TransitiveInfoProvider} that describes a set of transitive package specifications
* used in package groups.
*/
public interface PackageSpecificationProvider extends TransitiveInfoProvider {
- NestedSet<PackageSpecification> getPackageSpecifications();
+ NestedSet<PackageGroupContents> getPackageSpecifications();
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 841c47e9ba..3223ae8393 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -74,7 +74,7 @@ import com.google.devtools.build.lib.packages.Info;
import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.NativeProvider;
import com.google.devtools.build.lib.packages.OutputFile;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
import com.google.devtools.build.lib.packages.RequiredProviders;
import com.google.devtools.build.lib.packages.Rule;
@@ -1303,8 +1303,8 @@ public final class RuleContext extends TargetContext
*/
public static boolean isVisible(Rule rule, TransitiveInfoCollection prerequisite) {
// Check visibility attribute
- for (PackageSpecification specification :
- prerequisite.getProvider(VisibilityProvider.class).getVisibility()) {
+ for (PackageGroupContents specification :
+ prerequisite.getProvider(VisibilityProvider.class).getVisibility()) {
if (specification.containsPackage(rule.getLabel().getPackageIdentifier())) {
return true;
}
@@ -1339,7 +1339,7 @@ public final class RuleContext extends TargetContext
private final ErrorReporter reporter;
private OrderedSetMultimap<Attribute, ConfiguredTarget> prerequisiteMap;
private ImmutableMap<Label, ConfigMatchingProvider> configConditions;
- private NestedSet<PackageSpecification> visibility;
+ private NestedSet<PackageGroupContents> visibility;
private ImmutableMap<String, Attribute> aspectAttributes;
private ImmutableList<AspectDescriptor> aspectDescriptors;
private ToolchainContext toolchainContext;
@@ -1387,7 +1387,7 @@ public final class RuleContext extends TargetContext
rule.getRuleClassObject().checkAttributesNonEmpty(rule, reporter, attributes);
}
- Builder setVisibility(NestedSet<PackageSpecification> visibility) {
+ Builder setVisibility(NestedSet<PackageGroupContents> visibility) {
this.visibility = visibility;
return this;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java
index 40eaa8c1e1..e6ea9902b2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetContext.java
@@ -21,7 +21,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.Target;
import java.util.List;
import javax.annotation.Nullable;
@@ -46,16 +46,20 @@ public class TargetContext {
* attribute in case of a rule). Rule attributes are handled by the {@link RuleContext} subclass.
*/
private final List<ConfiguredTarget> directPrerequisites;
- private final NestedSet<PackageSpecification> visibility;
+
+ private final NestedSet<PackageGroupContents> visibility;
/**
* The constructor is intentionally package private.
*
* <p>directPrerequisites is expected to be ordered.
*/
- TargetContext(AnalysisEnvironment env, Target target, BuildConfiguration configuration,
+ TargetContext(
+ AnalysisEnvironment env,
+ Target target,
+ BuildConfiguration configuration,
Iterable<ConfiguredTarget> directPrerequisites,
- NestedSet<PackageSpecification> visibility) {
+ NestedSet<PackageGroupContents> visibility) {
this.env = env;
this.target = target;
this.configuration = configuration;
@@ -85,7 +89,7 @@ public class TargetContext {
return configuration;
}
- public NestedSet<PackageSpecification> getVisibility() {
+ public NestedSet<PackageGroupContents> getVisibility() {
return visibility;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java
index ce6fb03f12..44edd90e74 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java
@@ -15,15 +15,13 @@
package com.google.devtools.build.lib.analysis;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
/**
* Provider class for configured targets that have a visibility.
*/
public interface VisibilityProvider extends TransitiveInfoProvider {
- /**
- * Returns the visibility specification.
- */
- NestedSet<PackageSpecification> getVisibility();
+ /** Returns the visibility specification. */
+ NestedSet<PackageGroupContents> getVisibility();
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProviderImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProviderImpl.java
index f84fe36615..239d4edd32 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProviderImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProviderImpl.java
@@ -16,21 +16,21 @@ package com.google.devtools.build.lib.analysis;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
/**
* Visibility provider implementation.
*/
@Immutable
public final class VisibilityProviderImpl implements VisibilityProvider {
- private final NestedSet<PackageSpecification> visibility;
+ private final NestedSet<PackageGroupContents> visibility;
- public VisibilityProviderImpl(NestedSet<PackageSpecification> visibility) {
+ public VisibilityProviderImpl(NestedSet<PackageGroupContents> visibility) {
this.visibility = visibility;
}
@Override
- public NestedSet<PackageSpecification> getVisibility() {
+ public NestedSet<PackageGroupContents> getVisibility() {
return visibility;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
index b0e5a2446e..5c9c463e9b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
@@ -33,7 +33,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Info;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.Provider;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
@@ -54,7 +54,7 @@ public abstract class AbstractConfiguredTarget
private final Target target;
private final BuildConfiguration configuration;
- private final NestedSet<PackageSpecification> visibility;
+ private final NestedSet<PackageGroupContents> visibility;
// Cached on-demand default provider
private final AtomicReference<DefaultInfo> defaultProvider = new AtomicReference<>();
@@ -77,7 +77,7 @@ public abstract class AbstractConfiguredTarget
}
@Override
- public final NestedSet<PackageSpecification> getVisibility() {
+ public final NestedSet<PackageGroupContents> getVisibility() {
return visibility;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java
index 9d6d3c6786..a729e69f0d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java
@@ -28,7 +28,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.Info;
import com.google.devtools.build.lib.packages.PackageGroup;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.Provider;
/**
@@ -40,14 +40,13 @@ public final class PackageGroupConfiguredTarget extends AbstractConfiguredTarget
private static final FileProvider NO_FILES = new FileProvider(
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER));
- private final NestedSet<PackageSpecification> packageSpecifications;
+ private final NestedSet<PackageGroupContents> packageSpecifications;
public PackageGroupConfiguredTarget(TargetContext targetContext, PackageGroup packageGroup) {
super(targetContext);
Preconditions.checkArgument(targetContext.getConfiguration() == null);
- NestedSetBuilder<PackageSpecification> builder =
- NestedSetBuilder.stableOrder();
+ NestedSetBuilder<PackageGroupContents> builder = NestedSetBuilder.stableOrder();
for (Label label : packageGroup.getIncludes()) {
TransitiveInfoCollection include = targetContext.maybeFindDirectPrerequisite(
label, targetContext.getConfiguration());
@@ -62,7 +61,7 @@ public final class PackageGroupConfiguredTarget extends AbstractConfiguredTarget
builder.addTransitive(provider.getPackageSpecifications());
}
- builder.addAll(packageGroup.getPackageSpecifications());
+ builder.add(packageGroup.getPackageSpecifications());
packageSpecifications = builder.build();
}
@@ -72,7 +71,7 @@ public final class PackageGroupConfiguredTarget extends AbstractConfiguredTarget
}
@Override
- public NestedSet<PackageSpecification> getPackageSpecifications() {
+ public NestedSet<PackageGroupContents> getPackageSpecifications() {
return packageSpecifications;
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java b/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java
index bffd92941d..4e35fc4991 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageGroup.java
@@ -14,13 +14,15 @@
package com.google.devtools.build.lib.packages;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.License.DistributionType;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -36,7 +38,7 @@ public class PackageGroup implements Target {
private final Label label;
private final Location location;
private final Package containingPackage;
- private final List<PackageSpecification> packageSpecifications;
+ private final PackageGroupContents packageSpecifications;
private final List<Label> includes;
public PackageGroup(
@@ -67,25 +69,19 @@ public class PackageGroup implements Target {
packagesBuilder.add(specification);
}
}
- this.packageSpecifications = packagesBuilder.build();
+ this.packageSpecifications = PackageGroupContents.create(packagesBuilder.build());
}
public boolean containsErrors() {
return containsErrors;
}
- public Iterable<PackageSpecification> getPackageSpecifications() {
+ public PackageGroupContents getPackageSpecifications() {
return packageSpecifications;
}
public boolean contains(Package pkg) {
- for (PackageSpecification specification : packageSpecifications) {
- if (specification.containsPackage(pkg.getPackageIdentifier())) {
- return true;
- }
- }
-
- return false;
+ return packageSpecifications.containsPackage(pkg.getPackageIdentifier());
}
public List<Label> getIncludes() {
@@ -93,11 +89,7 @@ public class PackageGroup implements Target {
}
public List<String> getContainedPackages() {
- List<String> result = Lists.newArrayListWithCapacity(packageSpecifications.size());
- for (PackageSpecification specification : packageSpecifications) {
- result.add(specification.toString());
- }
- return result;
+ return packageSpecifications.containedPackages().collect(toImmutableList());
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java b/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java
index c5eb1db615..14e400daba 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java
@@ -17,7 +17,7 @@ import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import java.util.Collection;
import java.util.List;
@@ -29,7 +29,7 @@ public class PackageGroupsRuleVisibility implements RuleVisibility {
public static final String PACKAGE_LABEL = "__pkg__";
public static final String SUBTREE_LABEL = "__subpackages__";
private final List<Label> packageGroups;
- private final List<PackageSpecification> directPackages;
+ private final PackageGroupContents directPackages;
private final List<Label> declaredLabels;
public PackageGroupsRuleVisibility(Label ruleLabel, List<Label> labels) {
@@ -48,14 +48,14 @@ public class PackageGroupsRuleVisibility implements RuleVisibility {
}
packageGroups = packageGroupBuilder.build();
- directPackages = directPackageBuilder.build();
+ directPackages = PackageGroupContents.create(directPackageBuilder.build());
}
public Collection<Label> getPackageGroups() {
return packageGroups;
}
- public Collection<PackageSpecification> getDirectPackages() {
+ public PackageGroupContents getDirectPackages() {
return directPackages;
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java b/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
index a50a810d1e..63823fbcaa 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
@@ -14,11 +14,14 @@
package com.google.devtools.build.lib.packages;
import com.google.common.base.Verify;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.vfs.PathFragment;
+import java.util.stream.Stream;
/**
* Represents one of the following:
@@ -42,7 +45,7 @@ public abstract class PackageSpecification {
private static final String ALL_BENEATH_SUFFIX = "/...";
/** Returns {@code true} if the package spec includes the provided {@code packageName}. */
- public abstract boolean containsPackage(PackageIdentifier packageName);
+ protected abstract boolean containsPackage(PackageIdentifier packageName);
/**
* Returns a {@link String} representation of the {@link PackageSpecification} of the same format
@@ -51,7 +54,7 @@ public abstract class PackageSpecification {
* <p>The returned {@link String} is insensitive to the {@link RepositoryName} associated with the
* {@link PackageSpecification}.
*/
- public abstract String toStringWithoutRepository();
+ protected abstract String toStringWithoutRepository();
/**
* Parses the provided {@link String} into a {@link PackageSpecification}.
@@ -146,12 +149,12 @@ public abstract class PackageSpecification {
}
@Override
- public boolean containsPackage(PackageIdentifier packageName) {
+ protected boolean containsPackage(PackageIdentifier packageName) {
return this.singlePackageName.equals(packageName);
}
@Override
- public String toStringWithoutRepository() {
+ protected String toStringWithoutRepository() {
return "//" + singlePackageName.getPackageFragment().getPathString();
}
@@ -186,13 +189,13 @@ public abstract class PackageSpecification {
}
@Override
- public boolean containsPackage(PackageIdentifier packageName) {
+ protected boolean containsPackage(PackageIdentifier packageName) {
return packageName.getRepository().equals(prefix.getRepository())
&& packageName.getPackageFragment().startsWith(prefix.getPackageFragment());
}
@Override
- public String toStringWithoutRepository() {
+ protected String toStringWithoutRepository() {
return "//" + prefix.getPackageFragment().getPathString() + ALL_BENEATH_SUFFIX;
}
@@ -227,12 +230,12 @@ public abstract class PackageSpecification {
private static final PackageSpecification EVERYTHING = new AllPackages();
@Override
- public boolean containsPackage(PackageIdentifier packageName) {
+ protected boolean containsPackage(PackageIdentifier packageName) {
return true;
}
@Override
- public String toStringWithoutRepository() {
+ protected String toStringWithoutRepository() {
return "//...";
}
@@ -258,4 +261,54 @@ public abstract class PackageSpecification {
super(message);
}
}
+
+ /**
+ * A collection of {@link PackageSpecification}s from a {@code package_group}, which supports
+ * testing a given package for containment (see {@link #containedPackages()}}.
+ */
+ @Immutable
+ public static final class PackageGroupContents {
+
+ private final ImmutableList<PackageSpecification> packageSpecifications;
+
+ private PackageGroupContents(ImmutableList<PackageSpecification> packageSpecifications) {
+ this.packageSpecifications = packageSpecifications;
+ }
+
+ /**
+ * Creates a {@link PackageGroupContents} representing a collection of {@link
+ * PackageSpecification}s.
+ */
+ public static PackageGroupContents create(
+ ImmutableList<PackageSpecification> packageSpecifications) {
+ return new PackageGroupContents(packageSpecifications);
+ }
+
+ /**
+ * Returns {@code true} if the package specifications include the provided {@code packageName}.
+ * That is, at least one positive package specification matches.
+ */
+ public boolean containsPackage(PackageIdentifier packageIdentifier) {
+ return packageSpecifications.stream().anyMatch(p -> p.containsPackage(packageIdentifier));
+ }
+
+ /**
+ * Returns {@link String} representations of the component {@link PackageSpecification}s of the
+ * same format accepted by {@link #fromString}.
+ */
+ public Stream<String> containedPackages() {
+ return packageSpecifications.stream().map(PackageSpecification::toString);
+ }
+
+ /**
+ * Returns {@link String} representations of the component {@link PackageSpecification}s of the
+ * same format accepted by {@link #fromString}.
+ *
+ * <p>The returned {@link String}s are insensitive to the {@link RepositoryName} associated with
+ * the {@link PackageSpecification}.
+ */
+ public Stream<String> containedPackagesWithoutRepository() {
+ return packageSpecifications.stream().map(PackageSpecification::toStringWithoutRepository);
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryVisibility.java b/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryVisibility.java
index 427ea8483b..a2c5d78c7c 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryVisibility.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryVisibility.java
@@ -14,26 +14,26 @@
package com.google.devtools.build.lib.query2;
-import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.query2.engine.QueryVisibility;
-/** An adapter from a {@link PackageSpecification} to a {@link QueryVisibility}. */
+/** An adapter from {@link PackageGroupContents} to a {@link QueryVisibility}. */
public class BlazeQueryVisibility extends QueryVisibility<Target> {
- private final PackageSpecification packageSpecification;
+ private final PackageGroupContents packageSpecifications;
- public BlazeQueryVisibility(PackageSpecification packageSpecification) {
- this.packageSpecification = packageSpecification;
+ public BlazeQueryVisibility(PackageGroupContents packageSpecifications) {
+ this.packageSpecifications = packageSpecifications;
}
@Override
public boolean contains(Target target) {
- return packageSpecification.containsPackage(target.getLabel().getPackageIdentifier());
+ return packageSpecifications.containsPackage(target.getLabel().getPackageIdentifier());
}
@Override
public String toString() {
- return packageSpecification.toString();
+ return packageSpecifications.toString();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BlazeTargetAccessor.java b/src/main/java/com/google/devtools/build/lib/query2/BlazeTargetAccessor.java
index e4f4febbc6..62b26f5f0c 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BlazeTargetAccessor.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/BlazeTargetAccessor.java
@@ -21,7 +21,6 @@ import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
import com.google.devtools.build.lib.packages.PackageGroup;
import com.google.devtools.build.lib.packages.PackageGroupsRuleVisibility;
-import com.google.devtools.build.lib.packages.PackageSpecification;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleVisibility;
import com.google.devtools.build.lib.packages.Target;
@@ -150,9 +149,8 @@ final class BlazeTargetAccessor implements TargetAccessor<Target> {
throw new QueryException(e.getMessage());
}
}
- for (PackageSpecification spec : packageGroupsVisibility.getDirectPackages()) {
- packageSpecifications.add(new BlazeQueryVisibility(spec));
- }
+ packageSpecifications.add(
+ new BlazeQueryVisibility(packageGroupsVisibility.getDirectPackages()));
return;
} else {
throw new IllegalStateException("unknown visibility: " + ruleVisibility.getClass());
@@ -166,8 +164,6 @@ final class BlazeTargetAccessor implements TargetAccessor<Target> {
convertGroupVisibility((PackageGroup) queryEnvironment.getTarget(include),
packageSpecifications);
}
- for (PackageSpecification spec : group.getPackageSpecifications()) {
- packageSpecifications.add(new BlazeQueryVisibility(spec));
- }
+ packageSpecifications.add(new BlazeQueryVisibility(group.getPackageSpecifications()));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java b/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java
index 614c78479c..4f9edc3487 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.rules.repository;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.AliasProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -26,6 +27,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTa
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.PackageSpecification;
+import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
/**
@@ -51,6 +53,9 @@ public class Bind implements RuleConfiguredTargetFactory {
AliasProvider.fromAliasRule(ruleContext.getLabel(), actual),
VisibilityProvider.class,
new VisibilityProviderImpl(
- NestedSetBuilder.create(Order.STABLE_ORDER, PackageSpecification.everything()))));
+ NestedSetBuilder.create(
+ Order.STABLE_ORDER,
+ PackageGroupContents.create(
+ ImmutableList.of(PackageSpecification.everything()))))));
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
index 7bb8caeb17..4c48f0e62c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.packages;
+import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
@@ -146,8 +147,9 @@ public class PackageGroupTest {
public void testEverythingSpecificationWorks() throws Exception {
scratch.file("fruits/BUILD", "package_group(name = 'mango', packages = ['//...'])");
PackageGroup packageGroup = getPackageGroup("fruits", "mango");
- assertThat(packageGroup.getPackageSpecifications())
- .containsExactly(PackageSpecification.everything());
+ assertThat(
+ packageGroup.getPackageSpecifications().containedPackages().collect(toImmutableList()))
+ .containsExactly(PackageSpecification.everything().toString());
}
private Package getPackage(String packageName) throws Exception {