Move checking for host transitions to a few centralized places.

This is a prerequisite for adding transition factories.

Part of #7814.

PiperOrigin-RevId: 240172034
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index 078b090..6bb79d7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -200,7 +200,7 @@
               Dependency.withConfigurationAndAspects(
                   dep.getLabel(), ctgValue.getConfiguration(), dep.getAspects()));
           continue;
-        } else if (transition == HostTransition.INSTANCE) {
+        } else if (transition.isHostTransition()) {
           // The current rule's host configuration can also be used for the dep. We short-circuit
           // the standard transition logic for host transitions because these transitions are
           // uniquely frequent. It's possible, e.g., for every node in the configured target graph
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
index ae22a85..ef6b286 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
@@ -113,8 +113,7 @@
    * be composed after it.
    */
   private static boolean isFinal(ConfigurationTransition transition) {
-    return (transition == NullTransition.INSTANCE
-        || transition == HostTransition.INSTANCE);
+    return (transition == NullTransition.INSTANCE || transition.isHostTransition());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java
index 09b5173..1d543c7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java
@@ -851,7 +851,7 @@
         if (!DependencyFilter.NO_IMPLICIT_DEPS.apply(ruleContext.getRule(), attrDef)
             // We can't identify host deps by calling BuildConfiguration.isHostConfiguration()
             // because --nodistinct_host_configuration subverts that call.
-            || attrDef.getConfigurationTransition().isHostTransition()) {
+            || attrDef.hasHostConfigurationTransition()) {
           continue;
         }
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 87dd882..14ad552 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -2030,8 +2030,8 @@
         name);
     if (isLateBound(name)) {
       LateBoundDefault<?, ?> lateBoundDefault = (LateBoundDefault<?, ?>) defaultValue;
-      Preconditions.checkArgument(!lateBoundDefault.useHostConfiguration()
-          || (configTransition.isHostTransition()),
+      Preconditions.checkArgument(
+          !lateBoundDefault.useHostConfiguration() || configTransition.isHostTransition(),
           "a late bound default value using the host configuration must use the host transition");
     }
 
@@ -2196,14 +2196,23 @@
   }
 
   /**
-   * Returns true if this attribute transitions on a split transition.
-   * See {@link SplitTransition}.
+   * Returns true if this attribute transitions on a split transition. See {@link SplitTransition}.
    */
+  // TODO(https://github.com/bazelbuild/bazel/issues/7814) Remove this.
   public boolean hasSplitConfigurationTransition() {
     return (splitTransitionProvider != null);
   }
 
   /**
+   * Returns true if this attribute transitions to the host configuration. See {@link
+   * com.google.devtools.build.lib.analysis.config.HostTransition}.
+   */
+  // TODO(https://github.com/bazelbuild/bazel/issues/7814) Remove this.
+  public boolean hasHostConfigurationTransition() {
+    return configTransition.isHostTransition();
+  }
+
+  /**
    * Returns whether the target is required to be executable for label or label
    * list attributes. For other attributes it always returns {@code false}.
    */
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 f3d4971..71b451f 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
@@ -36,16 +36,16 @@
   /** Dependency predicate that excludes host dependencies */
   public static final DependencyFilter NO_HOST_DEPS =
       new DependencyFilter() {
-    @Override
-    public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) {
-      // getConfigurationTransition() is only defined for labels which introduce a dependency.
-      if (attribute.getType().getLabelClass() != LabelClass.DEPENDENCY) {
-        return true;
-      }
+        @Override
+        public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) {
+          // getConfigurationTransition() is only defined for labels which introduce a dependency.
+          if (attribute.getType().getLabelClass() != LabelClass.DEPENDENCY) {
+            return true;
+          }
 
-      return !attribute.getConfigurationTransition().isHostTransition();
-    }
-  };
+          return !attribute.hasHostConfigurationTransition();
+        }
+      };
   /** Dependency predicate that excludes implicit dependencies */
   public static final DependencyFilter NO_IMPLICIT_DEPS =
       new DependencyFilter() {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index 3545976..82fe31a 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -650,7 +650,7 @@
         attrPb.setAllowEmpty(!attr.isNonEmpty());
         attrPb.setAllowSingleFile(attr.isSingleArtifact());
         attrPb.setConfigurable(attr.isConfigurable());
-        attrPb.setCfgIsHost(attr.getConfigurationTransition().isHostTransition());
+        attrPb.setCfgIsHost(attr.hasHostConfigurationTransition());
 
         // Encode default value, if simple.
         Object v = attr.getDefaultValueUnchecked();
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
index f3014f2..71561f4 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
@@ -183,8 +183,7 @@
                 .getAssociatedRule()
                 .getRuleClassObject()
                 .getAttributeByName("tools")
-                .getConfigurationTransition()
-                .isHostTransition())
+                .hasHostConfigurationTransition())
         .isTrue();
     assertThat(getHostConfiguration().getCompilationMode()).isEqualTo(CompilationMode.OPT);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
index 8ce3e89..4a5a6b1 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
@@ -294,7 +294,7 @@
   @Test
   public void testHostTransition() throws Exception {
     Attribute attr = attr("foo", LABEL).cfg(HostTransition.INSTANCE).allowedFileTypes().build();
-    assertThat(attr.getConfigurationTransition().isHostTransition()).isTrue();
+    assertThat(attr.hasHostConfigurationTransition()).isTrue();
     assertThat(attr.hasSplitConfigurationTransition()).isFalse();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 01b0497..dd16c74 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -581,7 +581,7 @@
   @Test
   public void testAttrCfg() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label(cfg = 'host', allow_files = True)");
-    assertThat(attr.getConfigurationTransition().isHostTransition()).isTrue();
+    assertThat(attr.hasHostConfigurationTransition()).isTrue();
   }
 
   @Test