diff options
author | 2018-02-28 11:04:31 -0800 | |
---|---|---|
committer | 2018-02-28 11:06:28 -0800 | |
commit | 4958192c09874104cc06f264f6354d1e2e97b64b (patch) | |
tree | 31415b1e47c2994acbb1d5f4d99cb114968d90b4 /src/main | |
parent | de8138f6c0c4ab8a0e14c1fc63b5f61cc21f4798 (diff) |
Tag RuleClassNamePredicate with @AutoCodec by switching to lazy
initialization of the Predicates, and storing the set of strings the
predicates are based on.
PiperOrigin-RevId: 187351700
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/RuleClass.java | 83 |
1 files changed, 57 insertions, 26 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 2d0cd749d1..51db54310a 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -42,6 +42,8 @@ import com.google.devtools.build.lib.packages.Attribute.SkylarkComputedDefaultTe import com.google.devtools.build.lib.packages.BuildType.SelectorList; import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy; import com.google.devtools.build.lib.packages.RuleFactory.AttributeValues; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.syntax.Argument; import com.google.devtools.build.lib.syntax.BaseFunction; import com.google.devtools.build.lib.syntax.Environment; @@ -65,6 +67,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.regex.Pattern; import javax.annotation.Nullable; @@ -381,38 +384,69 @@ public class RuleClass { } /** A predicate that filters rule classes based on their names. */ + @AutoCodec public static class RuleClassNamePredicate { + private static final RuleClassNamePredicate UNSPECIFIED_INSTANCE = + new RuleClassNamePredicate(ImmutableSet.of(), PredicateType.UNSPECIFIED, null); + + private final ImmutableSet<String> ruleClassNames; + + private final PredicateType predicateType; + private final Predicate<String> ruleClassNamePredicate; private final Predicate<RuleClass> ruleClassPredicate; // if non-null, used ONLY for checking overlap @Nullable private final Set<?> overlappable; - private RuleClassNamePredicate( - Predicate<String> ruleClassNamePredicate, @Nullable Set<?> overlappable) { - this( - ruleClassNamePredicate, - new DescribedPredicate<>( - Predicates.compose(ruleClassNamePredicate, RuleClass::getName), - ruleClassNamePredicate.toString()), - overlappable); + @VisibleForSerialization + enum PredicateType { + ONLY, + All_EXCEPT, + UNSPECIFIED } - private RuleClassNamePredicate( - Predicate<String> ruleClassNamePredicate, - Predicate<RuleClass> ruleClassPredicate, - @Nullable Set<?> overlappable) { - this.ruleClassNamePredicate = ruleClassNamePredicate; - this.ruleClassPredicate = ruleClassPredicate; + @VisibleForSerialization + RuleClassNamePredicate( + ImmutableSet<String> ruleClassNames, PredicateType predicateType, Set<?> overlappable) { + this.ruleClassNames = ruleClassNames; + this.predicateType = predicateType; this.overlappable = overlappable; + + switch (predicateType) { + case All_EXCEPT: + Predicate<String> containing = only(ruleClassNames).asPredicateOfRuleClassName(); + ruleClassNamePredicate = + new DescribedPredicate<>( + Predicates.not(containing), "all but " + containing.toString()); + ruleClassPredicate = + new DescribedPredicate<>( + Predicates.compose(ruleClassNamePredicate, RuleClass::getName), + ruleClassNamePredicate.toString()); + break; + case ONLY: + ruleClassNamePredicate = + new DescribedPredicate<>( + Predicates.in(ruleClassNames), StringUtil.joinEnglishList(ruleClassNames)); + ruleClassPredicate = + new DescribedPredicate<>( + Predicates.compose(ruleClassNamePredicate, RuleClass::getName), + ruleClassNamePredicate.toString()); + break; + case UNSPECIFIED: + ruleClassNamePredicate = Predicates.alwaysTrue(); + ruleClassPredicate = Predicates.alwaysTrue(); + break; + default: + // This shouldn't happen normally since the constructor is private and within this file. + throw new IllegalArgumentException( + "Predicate type was not specified when constructing a RuleClassNamePredicate."); + } } public static RuleClassNamePredicate only(Iterable<String> ruleClassNamesAsIterable) { ImmutableSet<String> ruleClassNames = ImmutableSet.copyOf(ruleClassNamesAsIterable); - return new RuleClassNamePredicate( - new DescribedPredicate<>( - Predicates.in(ruleClassNames), StringUtil.joinEnglishList(ruleClassNames)), - ruleClassNames); + return new RuleClassNamePredicate(ruleClassNames, PredicateType.ONLY, ruleClassNames); } public static RuleClassNamePredicate only(String... ruleClasses) { @@ -422,11 +456,7 @@ public class RuleClass { public static RuleClassNamePredicate allExcept(String... ruleClasses) { ImmutableSet<String> ruleClassNames = ImmutableSet.copyOf(ruleClasses); Preconditions.checkState(!ruleClassNames.isEmpty(), "Use unspecified() instead"); - Predicate<String> containing = only(ruleClassNames).asPredicateOfRuleClassName(); - return new RuleClassNamePredicate( - new DescribedPredicate<>( - Predicates.not(containing), "all but " + containing.toString()), - null); + return new RuleClassNamePredicate(ruleClassNames, PredicateType.All_EXCEPT, null); } /** @@ -436,7 +466,7 @@ public class RuleClass { * Predicates.<RuleClass>alwaysTrue()}, which is a sentinel value for other parts of bazel. */ public static RuleClassNamePredicate unspecified() { - return new RuleClassNamePredicate(Predicates.alwaysTrue(), Predicates.alwaysTrue(), null); + return UNSPECIFIED_INSTANCE; } public final Predicate<String> asPredicateOfRuleClassName() { @@ -463,7 +493,7 @@ public class RuleClass { @Override public int hashCode() { - return ruleClassNamePredicate.hashCode(); + return Objects.hash(ruleClassNames, predicateType); } @Override @@ -471,7 +501,8 @@ public class RuleClass { // NOTE: Specifically not checking equality of ruleClassPredicate. // By construction, if the name predicates are equals, the rule class predicates are, too. return obj instanceof RuleClassNamePredicate - && ruleClassNamePredicate.equals(((RuleClassNamePredicate) obj).ruleClassNamePredicate); + && ruleClassNames.equals(((RuleClassNamePredicate) obj).ruleClassNames) + && predicateType.equals(((RuleClassNamePredicate) obj).predicateType); } @Override |