cquery --show_config_fragments:  include direct alias requirements.

The implementation for --show_config_fragments stores its data in providers. When you request an alias' provider, it defaults to the provider of its actual target. In this case we need to get the direct provider.

PiperOrigin-RevId: 420362827
diff --git a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
index dc25967..d2a1493 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.analysis.AliasProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.analysis.RequiredConfigFragmentsProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.VisibilityProvider;
@@ -66,15 +67,23 @@
       ConfiguredTarget actual,
       NestedSet<PackageGroupContents> visibility,
       ImmutableClassToInstanceMap<TransitiveInfoProvider> overrides) {
+    ImmutableClassToInstanceMap.Builder<TransitiveInfoProvider> allOverrides =
+        ImmutableClassToInstanceMap.<TransitiveInfoProvider>builder()
+            .putAll(overrides)
+            .put(AliasProvider.class, AliasProvider.fromAliasRule(ruleContext.getRule(), actual))
+            .put(VisibilityProvider.class, new VisibilityProviderImpl(visibility));
+    if (ruleContext.getRequiredConfigFragments() != null) {
+      // This causes "blaze cquery --show_config_fragments=direct" to only show the
+      // fragments/options the alias directly uses, not those of its actual target. Since alias
+      // has a narrow API this practically means whatever a select() in the alias requires.
+      allOverrides.put(
+          RequiredConfigFragmentsProvider.class, ruleContext.getRequiredConfigFragments());
+    }
     return new AliasConfiguredTarget(
         ruleContext.getLabel(),
         ruleContext.getConfigurationKey(),
         actual,
-        ImmutableClassToInstanceMap.<TransitiveInfoProvider>builder()
-            .put(AliasProvider.class, AliasProvider.fromAliasRule(ruleContext.getRule(), actual))
-            .put(VisibilityProvider.class, new VisibilityProviderImpl(visibility))
-            .putAll(overrides)
-            .build(),
+        allOverrides.build(),
         ruleContext.getConfigConditions());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/BUILD b/src/main/java/com/google/devtools/build/lib/rules/BUILD
index 6899823..6f56817 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/BUILD
@@ -159,6 +159,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/analysis:file_provider",
+        "//src/main/java/com/google/devtools/build/lib/analysis:required_config_fragments_provider",
         "//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
         "//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_provider",
         "//src/main/java/com/google/devtools/build/lib/analysis:visibility_provider",
diff --git a/src/test/shell/integration/configured_query_test.sh b/src/test/shell/integration/configured_query_test.sh
index 2d5ec9c..7f7e625 100755
--- a/src/test/shell/integration/configured_query_test.sh
+++ b/src/test/shell/integration/configured_query_test.sh
@@ -360,6 +360,37 @@
   assert_contains "//$pkg:cclib_with_py_dep .*PythonConfiguration" output
 }
 
+function test_direct_alias_requirements() {
+  # Aliases delegate many read calls to their actual targets. This test
+  # ensures we don't skip requirements that the alias has but its actual
+  # target doesn't.
+  local -r pkg=$FUNCNAME
+  mkdir -p $pkg
+  cat > $pkg/BUILD <<'EOF'
+cc_library(
+    name = "ccrule",
+    srcs = ["ccrule.cc"],
+)
+config_setting(
+    name = "cfg",
+    define_values = {"abc": "1"},
+)
+alias(
+    name = "al",
+    actual = select({
+        ":cfg": ":ccrule",
+    }),
+)
+EOF
+
+  bazel cquery "//$pkg:al" --show_config_fragments=direct --define=abc=1 \
+    > output 2>"$TEST_log" || fail "Expected success"
+
+  assert_contains "//$pkg:al .*--define:abc" output
+  # CppConfiguration is a transitive, not direct, requirement.
+  assert_not_contains "//$pkg:al .*CppConfiguration" output
+}
+
 function test_show_transitive_config_fragments_host_deps() {
   local -r pkg=$FUNCNAME
   mkdir -p $pkg