diff options
author | 2016-01-21 22:04:01 +0000 | |
---|---|---|
committer | 2016-01-22 15:54:15 +0000 | |
commit | cb14c5e7e0a0f623aaf0911295f19caf9dcd6a8e (patch) | |
tree | 1fcde5a4567be7756ec51321cf0c89269dd74cb9 /src/main/java/com/google/devtools/build/lib | |
parent | 6073eb6b98026e75b87bc5ec6da31ce3a40c1824 (diff) |
Extract AttributeInfoProvider interface for DependencyFilters.
This is in preparation of implementing dependency filtering correctly
for aspects.
--
MOS_MIGRATED_REVID=112721440
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
8 files changed, 43 insertions, 25 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java index 43704f2143..5c905ba4b2 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy; import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory; +import com.google.devtools.build.lib.util.BinaryPredicate; import com.google.devtools.build.lib.util.Preconditions; import java.util.Collection; @@ -188,7 +189,7 @@ public final class AspectDefinition { Rule from, Multimap<Attribute, Label> labelBuilder, AspectDefinition aspectDefinition, - DependencyFilter predicate) { + BinaryPredicate<? super Rule, Attribute> predicate) { ImmutableMap<String, Attribute> attributes = aspectDefinition.getAttributes(); for (Attribute aspectAttribute : attributes.values()) { if (!predicate.apply(from, aspectAttribute)) { diff --git a/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java b/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java index 6d1b943d41..a5d41ee631 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java +++ b/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.packages; import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition; +import com.google.devtools.build.lib.packages.DependencyFilter.AttributeInfoProvider; import com.google.devtools.build.lib.util.BinaryPredicate; /** @@ -21,13 +22,14 @@ import com.google.devtools.build.lib.util.BinaryPredicate; * <code>blaze query</code>. * Used to implement <code>--[no]implicit_deps</code>, <code>--[no]host_deps</code> etc. */ -public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribute> { +public abstract class DependencyFilter + implements BinaryPredicate<AttributeInfoProvider, Attribute> { /** Dependency predicate that includes all dependencies */ public static final DependencyFilter ALL_DEPS = new DependencyFilter() { @Override - public boolean apply(Rule x, Attribute y) { + public boolean apply(AttributeInfoProvider x, Attribute y) { return true; } }; @@ -35,7 +37,7 @@ public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribut public static final DependencyFilter NO_HOST_DEPS = new DependencyFilter() { @Override - public boolean apply(Rule rule, Attribute attribute) { + public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) { // isHostConfiguration() is only defined for labels and label lists. if (attribute.getType() != BuildType.LABEL && attribute.getType() != BuildType.LABEL_LIST) { return true; @@ -48,8 +50,8 @@ public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribut public static final DependencyFilter NO_IMPLICIT_DEPS = new DependencyFilter() { @Override - public boolean apply(Rule rule, Attribute attribute) { - return rule.isAttributeValueExplicitlySpecified(attribute); + public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) { + return infoProvider.isAttributeValueExplicitlySpecified(attribute); } }; /** @@ -59,7 +61,7 @@ public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribut public static final DependencyFilter NO_NODEP_ATTRIBUTES = new DependencyFilter() { @Override - public boolean apply(Rule rule, Attribute attribute) { + public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) { return attribute.getType() != BuildType.NODEP_LABEL && attribute.getType() != BuildType.NODEP_LABEL_LIST; } @@ -70,7 +72,7 @@ public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribut public static final DependencyFilter DIRECT_COMPILE_TIME_INPUT = new DependencyFilter() { @Override - public boolean apply(Rule rule, Attribute attribute) { + public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) { return attribute.isDirectCompileTimeInput(); } }; @@ -79,7 +81,7 @@ public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribut * Returns true if a given attribute should be processed. */ @Override - public abstract boolean apply(Rule rule, Attribute attribute); + public abstract boolean apply(AttributeInfoProvider infoProvider, Attribute attribute); /** * Returns a predicate that computes the logical and of the two given predicates. @@ -88,9 +90,21 @@ public abstract class DependencyFilter implements BinaryPredicate<Rule, Attribut final DependencyFilter a, final DependencyFilter b) { return new DependencyFilter() { @Override - public boolean apply(Rule rule, Attribute attribute) { - return a.apply(rule, attribute) && b.apply(rule, attribute); + public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) { + return a.apply(infoProvider, attribute) && b.apply(infoProvider, attribute); } }; } + + /** + * Interface to provide information about attributes to dependency filters. + */ + public interface AttributeInfoProvider { + /** + * Returns true iff the value of the specified attribute is explicitly set in + * the BUILD file (as opposed to its default value). This also returns true if + * the value from the BUILD file is the same as the default value. + */ + boolean isAttributeValueExplicitlySpecified(Attribute attribute); + } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java index c18d7639ea..d4d4f17b56 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java @@ -35,6 +35,7 @@ import com.google.devtools.build.lib.packages.License.DistributionType; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.GlobList; import com.google.devtools.build.lib.syntax.Type; +import com.google.devtools.build.lib.util.BinaryPredicate; import com.google.devtools.build.lib.util.Preconditions; import java.util.Collection; @@ -58,7 +59,7 @@ import java.util.Set; * deps = ['bar']) * </pre> */ -public final class Rule implements Target { +public final class Rule implements Target, DependencyFilter.AttributeInfoProvider { /** Label predicate that allows every label. */ public static final Predicate<Label> ALL_LABELS = Predicates.alwaysTrue(); @@ -305,11 +306,7 @@ public final class Rule implements Target { return ruleClass.hasAttr(attrName, type); } - /** - * Returns true iff the value of the specified attribute is explicitly set in - * the BUILD file (as opposed to its default value). This also returns true if - * the value from the BUILD file is the same as the default value. - */ + @Override public boolean isAttributeValueExplicitlySpecified(Attribute attribute) { return attributes.isAttributeValueExplicitlySpecified(attribute); } @@ -399,7 +396,7 @@ public final class Rule implements Target { * the attribute that contains the label. The label will be contained in the * result iff (the predicate returned {@code true} and the labels are not outputs) */ - public Collection<Label> getLabels(DependencyFilter predicate) { + public Collection<Label> getLabels(BinaryPredicate<? super Rule, Attribute> predicate) { return ImmutableSortedSet.copyOf(getTransitions(predicate).values()); } @@ -412,7 +409,8 @@ public final class Rule implements Target { * the attribute that contains the label. The label will be contained in the * result iff (the predicate returned {@code true} and the labels are not outputs) */ - public Multimap<Attribute, Label> getTransitions(final DependencyFilter predicate) { + public Multimap<Attribute, Label> getTransitions( + final BinaryPredicate<? super Rule, Attribute> predicate) { final Multimap<Attribute, Label> transitions = HashMultimap.create(); // TODO(bazel-team): move this to AttributeMap, too. Just like visitLabels, which labels should // be visited may depend on the calling context. We shouldn't implicitly decide this for diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java b/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java index 48fff568df..85766dac93 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.packages.RawAttributeMapper; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.Target; +import com.google.devtools.build.lib.util.BinaryPredicate; import java.util.Collections; import java.util.Comparator; @@ -117,8 +118,8 @@ final class CompileOneDependencyTransformer { // For each rule, see if it has directCompileTimeInputAttribute, // and if so check the targets listed in that attribute match the label. - DependencyFilter directCompileTimeInput = - new DependencyFilter() { + BinaryPredicate<Rule, Attribute> directCompileTimeInput = + new BinaryPredicate<Rule, Attribute>() { @Override public boolean apply(Rule rule, Attribute attribute) { return DependencyFilter.DIRECT_COMPILE_TIME_INPUT.apply(rule, attribute) diff --git a/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java index 348ce70aa6..99da369f4b 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java @@ -83,7 +83,8 @@ public abstract class AbstractBlazeQueryEnvironment<T> implements QueryEnvironme this.extraFunctions = ImmutableList.copyOf(extraFunctions); } - private static DependencyFilter constructDependencyFilter(Set<Setting> settings) { + private static DependencyFilter constructDependencyFilter( + Set<Setting> settings) { DependencyFilter specifiedFilter = settings.contains(Setting.NO_HOST_DEPS) ? DependencyFilter.NO_HOST_DEPS diff --git a/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java b/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java index 1734977528..d2015c988e 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java +++ b/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java @@ -203,7 +203,8 @@ final class LabelVisitor { * @param packageProvider how to resolve labels to targets. * @param edgeFilter which edges may be traversed. */ - public LabelVisitor(PackageProvider packageProvider, DependencyFilter edgeFilter) { + public LabelVisitor( + PackageProvider packageProvider, DependencyFilter edgeFilter) { this.packageProvider = packageProvider; this.lastVisitation = new VisitationAttributes(); this.edgeFilter = edgeFilter; diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java index aa1b742acf..a4cc45d0f9 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java +++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java @@ -140,7 +140,8 @@ public abstract class OutputFormatter implements Serializable { * Given a set of query options, returns a BinaryPredicate suitable for * passing to {@link Rule#getLabels()}, {@link XmlOutputFormatter}, etc. */ - public static DependencyFilter getDependencyFilter(QueryOptions queryOptions) { + public static DependencyFilter getDependencyFilter( + QueryOptions queryOptions) { // TODO(bazel-team): Optimize: and(ALL_DEPS, x) -> x, etc. return DependencyFilter.and( queryOptions.includeHostDeps ? DependencyFilter.ALL_DEPS : DependencyFilter.NO_HOST_DEPS, diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java b/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java index 7ec288448f..2abe834737 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java +++ b/src/main/java/com/google/devtools/build/lib/query2/output/PreciseAspectResolver.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.PackageProvider; +import com.google.devtools.build.lib.util.BinaryPredicate; import java.util.LinkedHashSet; import java.util.Map.Entry; @@ -92,7 +93,7 @@ public class PreciseAspectResolver implements AspectResolver { Multimap<Attribute, Label> depsWithPossibleAspects = ((Rule) target) .getTransitions( - new DependencyFilter() { + new BinaryPredicate<Rule, Attribute>() { @Override public boolean apply(@Nullable Rule rule, Attribute attribute) { for (Aspect aspectWithParameters : attribute.getAspects(rule)) { |