Put aspect_hints behind an experimental flag

RELNOTES:None.
PiperOrigin-RevId: 399179406
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
index 6a13252..ae769d7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java
@@ -246,6 +246,14 @@
       metadataTags = {OptionMetadataTag.INTERNAL})
   public String transitionDirectoryNameFragment;
 
+  @Option(
+      name = "experimental_enable_aspect_hints",
+      defaultValue = "true",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
+      metadataTags = {OptionMetadataTag.EXPERIMENTAL})
+  public boolean enableAspectHints;
+
   /** Regardless of input, converts to an empty list. For use with affectedByStarlarkTransition */
   public static class EmptyListConverter implements Converter<List<String>> {
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
index c32d52e..f7042ef 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
@@ -44,6 +44,7 @@
 import com.google.devtools.build.lib.analysis.ShToolchain;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.FragmentCollection;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
@@ -260,6 +261,17 @@
       StarlarkAttributesCollection.Builder ruleBuilder = StarlarkAttributesCollection.builder(this);
 
       for (Attribute attribute : rule.getAttributes()) {
+        // The aspect_hints attribute is experimental. When not enabled through the
+        // --enable_aspect_hints flag, we don't add it to the list of attributes that the aspect
+        // has access to.
+        if (attribute.getName().equals("aspect_hints")
+            && !ruleContext
+                .getConfiguration()
+                .getOptions()
+                .get(CoreOptions.class)
+                .enableAspectHints) {
+          continue;
+        }
         Object value = ruleContext.attributes().get(attribute.getName(), attribute.getType());
         ruleBuilder.addAttribute(attribute, value);
       }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index d4fde85..f7f29fe 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -120,6 +120,7 @@
 
   @Test
   public void testAspectHintsChanged() throws Exception {
+    useConfiguration("--experimental_enable_aspect_hints");
     scratch.file(
         "foo/rule.bzl",
         "def _rule_impl(ctx):",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 618b6ae..9a15bc4 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -1159,6 +1159,7 @@
 
   @Test
   public void aspectSeesAspectHintsAttributeOnNativeRule() throws Exception {
+    useConfiguration("--experimental_enable_aspect_hints");
     setupAspectHints();
     scratch.file(
         "aspect_hints/BUILD",
@@ -1179,6 +1180,7 @@
 
   @Test
   public void aspectSeesAspectHintsAttributeOnStarlarkRule() throws Exception {
+    useConfiguration("--experimental_enable_aspect_hints");
     setupAspectHints();
     setupStarlarkRule();
     scratch.file(
diff --git a/src/test/shell/integration/aspect_test.sh b/src/test/shell/integration/aspect_test.sh
index bb3e7c7..dcfeb20 100755
--- a/src/test/shell/integration/aspect_test.sh
+++ b/src/test/shell/integration/aspect_test.sh
@@ -652,18 +652,49 @@
 count_hints(name = "cnt", deps = [":cc_foo"])
 EOF
 
-  bazel build "//${package}:cnt" --output_groups=out || fail "Build failed"
+  bazel build "//${package}:cnt" --experimental_enable_aspect_hints \
+    --output_groups=out \
+    || fail "Build failed"
   assert_contains "Used hints: 5" "./${PRODUCT_NAME}-bin/${package}/cnt_res"
 }
 
 function test_aspect_has_access_to_aspect_hints_attribute_in_starlark_rules() {
   local package="aspect_hints"
   mkdir -p "${package}"
+  setup_aspect_hints "${package}"
+
+  bazel build "//${package}:cnt" --experimental_enable_aspect_hints \
+    --output_groups=out \
+    || fail "Build failed"
+  assert_contains "Used hints: 22" "./${PRODUCT_NAME}-bin/${package}/cnt_res"
+}
+
+function test_aspect_hints_disabled() {
+  local package="aspect_hints_disabled"
+  mkdir -p "${package}"
+  setup_aspect_hints "${package}"
+
+  bazel build "//${package}:cnt" --noexperimental_enable_aspect_hints \
+    --output_groups=out &>"${TEST_log}" \
+    && fail "The aspect found 'aspect_hints' although it was disabled"
+
+  expect_log "Error: No attribute 'aspect_hints' in attr."
+}
+
+function setup_aspect_hints() {
+  local package="$1"
+  mkdir -p "${package}"
 
   create_aspect_hints_rule_and_aspect "${package}"
   create_aspect_hints_custom_rule "${package}"
+  create_aspect_hints_BUILD_file "${package}"
+}
 
-  cat > "${package}/BUILD" <<EOF
+function create_aspect_hints_BUILD_file() {
+  local package="$1"
+  mkdir -p "${package}"
+
+cat > "${package}/BUILD" <<EOF
 load("//${package}:hints_counter.bzl", "count_hints")
 load("//${package}:custom_rule.bzl", "custom_rule")
 load("//${package}:hints.bzl", "hint")
@@ -683,9 +714,6 @@
 
 count_hints(name = "cnt", deps = [":custom_foo"])
 EOF
-
-  bazel build "//${package}:cnt" --output_groups=out || fail "Build failed"
-  assert_contains "Used hints: 22" "./${PRODUCT_NAME}-bin/${package}/cnt_res"
 }
 
 function create_aspect_hints_rule_and_aspect() {
diff --git a/src/test/shell/integration/bazel_query_test.sh b/src/test/shell/integration/bazel_query_test.sh
index f60e7ad..f8f7442 100755
--- a/src/test/shell/integration/bazel_query_test.sh
+++ b/src/test/shell/integration/bazel_query_test.sh
@@ -1034,8 +1034,8 @@
 )
 EOF
 
-  bazel query "somepath(//${package}:foo, //${package}:hint)" >& $TEST_log \
-     || fail "Expected success"
+  bazel query "somepath(//${package}:foo, //${package}:hint)"  >& $TEST_log \
+    || fail "Expected success"
 
   expect_log "//${package}:hint"
 }