diff options
author | 2017-11-15 08:59:27 -0800 | |
---|---|---|
committer | 2017-11-15 09:01:28 -0800 | |
commit | 34ff85ef30f483dc617493e64166c1e8a767c708 (patch) | |
tree | 71035fd859ef377d8101e1df592ee4b39981f67b | |
parent | 275ae45b1228bdd0f912c4fbd634b29ba4180383 (diff) |
Refactor the representation of a collection of package specifications
PiperOrigin-RevId: 175832159
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 { |