Move PrerequisiteValidator into RuleContext.
This breaks a dependency cycle between RuleContext and ConfiguredRuleClassProvider.
PiperOrigin-RevId: 305313374
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java b/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java
index 6a8a511..31179bf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java
@@ -14,7 +14,7 @@
package com.google.devtools.build.lib.analysis;
import com.google.devtools.build.lib.analysis.AliasProvider.TargetMode;
-import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.PrerequisiteValidator;
+import com.google.devtools.build.lib.analysis.RuleContext.PrerequisiteValidator;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.packages.Attribute;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index fb023bb..55ef8ab 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -25,6 +25,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.devtools.build.lib.actions.ActionEnvironment;
+import com.google.devtools.build.lib.analysis.RuleContext.PrerequisiteValidator;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -43,7 +44,6 @@
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.graph.Digraph;
import com.google.devtools.build.lib.graph.Node;
-import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
import com.google.devtools.build.lib.packages.NativeAspectClass;
import com.google.devtools.build.lib.packages.Rule;
@@ -51,7 +51,6 @@
import com.google.devtools.build.lib.packages.RuleClass.Builder.ThirdPartyLicenseExistencePolicy;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.SymbolGenerator;
-import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
import com.google.devtools.build.lib.skylarkbuildapi.core.Bootstrap;
import com.google.devtools.build.lib.skylarkinterface.SkylarkInterfaceUtils;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -100,23 +99,6 @@
}
/**
- * Custom dependency validation logic.
- */
- public interface PrerequisiteValidator {
- /**
- * Checks whether the rule in {@code contextBuilder} is allowed to depend on {@code
- * prerequisite} through the attribute {@code attribute}.
- *
- * <p>Can be used for enforcing any organization-specific policies about the layout of the
- * workspace.
- */
- void validate(
- RuleContext.Builder contextBuilder,
- ConfiguredTargetAndData prerequisite,
- Attribute attribute);
- }
-
- /**
* A coherent set of options, fragments, aspects and rules; each of these may declare a dependency
* on other such sets.
*/
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 dc09fbe..b3fb171 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
@@ -41,7 +41,6 @@
import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact;
import com.google.devtools.build.lib.actions.ArtifactRoot;
import com.google.devtools.build.lib.analysis.AliasProvider.TargetMode;
-import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.PrerequisiteValidator;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -128,9 +127,20 @@
return this.getAnalysisEnvironment().getSkylarkSemantics().experimentalAllowTagsPropagation();
}
- /**
- * The configured version of FilesetEntry.
- */
+ /** Custom dependency validation logic. */
+ public interface PrerequisiteValidator {
+ /**
+ * Checks whether the rule in {@code contextBuilder} is allowed to depend on {@code
+ * prerequisite} through the attribute {@code attribute}.
+ *
+ * <p>Can be used for enforcing any organization-specific policies about the layout of the
+ * workspace.
+ */
+ void validate(
+ Builder contextBuilder, ConfiguredTargetAndData prerequisite, Attribute attribute);
+ }
+
+ /** The configured version of FilesetEntry. */
@Immutable
public static final class ConfiguredFilesetEntry {
private final FilesetEntry entry;
@@ -1544,8 +1554,7 @@
* Returns true if {@code label} is visible from {@code prerequisite}.
*
* <p>This only computes the logic as implemented by the visibility system. The final decision
- * whether a dependency is allowed is made by {@link
- * ConfiguredRuleClassProvider.PrerequisiteValidator}.
+ * whether a dependency is allowed is made by {@link PrerequisiteValidator}.
*/
public static boolean isVisible(Label label, TransitiveInfoCollection prerequisite) {
// Check visibility attribute
@@ -1563,8 +1572,7 @@
* Returns true if {@code rule} is visible from {@code prerequisite}.
*
* <p>This only computes the logic as implemented by the visibility system. The final decision
- * whether a dependency is allowed is made by {@link
- * ConfiguredRuleClassProvider.PrerequisiteValidator}.
+ * whether a dependency is allowed is made by {@link PrerequisiteValidator}.
*/
public static boolean isVisible(Rule rule, TransitiveInfoCollection prerequisite) {
return isVisible(rule.getLabel(), prerequisite);
@@ -1989,11 +1997,10 @@
/**
* @return true if {@code rule} is visible from {@code prerequisite}.
- *
- * <p>This only computes the logic as implemented by the visibility system. The final decision
- * whether a dependency is allowed is made by
- * {@link ConfiguredRuleClassProvider.PrerequisiteValidator}, who is supposed to call this
- * method to determine whether a dependency is allowed as per visibility rules.
+ * <p>This only computes the logic as implemented by the visibility system. The final
+ * decision whether a dependency is allowed is made by {@link PrerequisiteValidator}, who is
+ * supposed to call this method to determine whether a dependency is allowed as per
+ * visibility rules.
*/
public boolean isVisible(TransitiveInfoCollection prerequisite) {
return RuleContext.isVisible(target.getAssociatedRule(), prerequisite);