supply transitive and direct deps for aar_import deps checking. This allows producing add_dep commands where possible and avoids the need for direct dependencies on supertypes of directly depended types
RELNOTES: None.

PiperOrigin-RevId: 203164113
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 1d9c759..220df0e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -174,14 +174,12 @@
             .build());
 
     JavaConfiguration javaConfig = ruleContext.getFragment(JavaConfiguration.class);
-    // TODO(cnsun): need to pass the transitive classpath too to emit add dep command.
-    NestedSet<Artifact> directDeps = getCompileTimeJarsFromCollection(targets, /*isStrict=*/ true);
-      NestedSet<Artifact> bootclasspath = getBootclasspath(ruleContext);
     Artifact depsCheckerResult =
         createAarArtifact(ruleContext, "aar_import_deps_checker_result.txt");
     ImportDepsCheckActionBuilder.newBuilder()
-        .bootcalsspath(bootclasspath)
-        .declareDeps(directDeps)
+        .bootcalsspath(getBootclasspath(ruleContext))
+        .declareDeps(getCompileTimeJarsFromCollection(targets, /*isDirect=*/ true))
+        .transitiveDeps(getCompileTimeJarsFromCollection(targets, /*isDirect=*/ false))
         .checkJars(NestedSetBuilder.<Artifact>stableOrder().add(mergedJar).build())
         .outputArtifiact(depsCheckerResult)
         .importDepsCheckingLevel(javaConfig.getImportDepsCheckingLevel())
@@ -235,10 +233,10 @@
     return ruleBuilder.build();
   }
 
-  private NestedSet<Artifact> getCompileTimeJarsFromCollection(
-      ImmutableList<TransitiveInfoCollection> deps, boolean isStrict) {
+  private static NestedSet<Artifact> getCompileTimeJarsFromCollection(
+      ImmutableList<TransitiveInfoCollection> deps, boolean isDirect) {
     JavaCompilationArgsProvider provider = JavaCompilationArgsProvider.legacyFromTargets(deps);
-    return isStrict ? provider.getDirectCompileTimeJars() : provider.getTransitiveCompileTimeJars();
+    return isDirect ? provider.getDirectCompileTimeJars() : provider.getTransitiveCompileTimeJars();
   }
 
   private NestedSet<Artifact> getBootclasspath(RuleContext ruleContext) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ImportDepsCheckActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/ImportDepsCheckActionBuilder.java
index 0cc64da..0ed123e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/ImportDepsCheckActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/ImportDepsCheckActionBuilder.java
@@ -39,6 +39,7 @@
   private NestedSet<Artifact> jarsToCheck;
   private NestedSet<Artifact> bootclasspath;
   private NestedSet<Artifact> declaredDeps;
+  private NestedSet<Artifact> transitiveDeps;
   private ImportDepsCheckingLevel importDepsCheckingLevel;
 
   private ImportDepsCheckActionBuilder() {}
@@ -86,11 +87,18 @@
     return this;
   }
 
+  public ImportDepsCheckActionBuilder transitiveDeps(NestedSet<Artifact> transitiveDeps) {
+    checkState(this.transitiveDeps == null);
+    this.transitiveDeps = checkNotNull(transitiveDeps);
+    return this;
+  }
+
   public void buildAndRegister(RuleContext ruleContext) {
     checkNotNull(outputArtifact);
     checkNotNull(jarsToCheck);
     checkNotNull(bootclasspath);
     checkNotNull(declaredDeps);
+    checkNotNull(transitiveDeps);
     checkNotNull(importDepsCheckingLevel);
     checkNotNull(jdepsArtifact);
     checkNotNull(ruleLabel);
@@ -101,6 +109,7 @@
             .setExecutable(ruleContext.getExecutablePrerequisite("$import_deps_checker", Mode.HOST))
             .addTransitiveInputs(jarsToCheck)
             .addTransitiveInputs(declaredDeps)
+            .addTransitiveInputs(transitiveDeps)
             .addTransitiveInputs(bootclasspath)
             .addOutput(outputArtifact)
             .addOutput(jdepsArtifact)
@@ -120,7 +129,8 @@
     return CustomCommandLine.builder()
         .addExecPath("--output", outputArtifact)
         .addExecPaths(VectorArg.addBefore("--input").each(jarsToCheck))
-        .addExecPaths(VectorArg.addBefore("--classpath_entry").each(declaredDeps))
+        .addExecPaths(VectorArg.addBefore("--directdep").each(declaredDeps))
+        .addExecPaths(VectorArg.addBefore("--classpath_entry").each(transitiveDeps))
         .addExecPaths(VectorArg.addBefore("--bootclasspath_entry").each(bootclasspath))
         .addDynamicString(convertErrorFlag(importDepsCheckingLevel))
         .addExecPath("--jdeps_output", jdepsArtifact)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
index 82b9455..b94c2e3 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
@@ -231,6 +231,7 @@
         .containsAllOf(
             "--bootclasspath_entry",
             "--classpath_entry",
+            "--directdep",
             "--input",
             "--output",
             "--checking_mode=error",
@@ -239,7 +240,9 @@
     ensureArgumentsHaveClassEntryOptionWithSuffix(
         arguments, "/intermediate/classes_and_libs_merged.jar");
     assertThat(arguments.stream().filter(arg -> "--classpath_entry".equals(arg)).count())
-        .isEqualTo(1);
+        .isEqualTo(5);  // transitive classpath
+    assertThat(arguments.stream().filter(arg -> "--directdep".equals(arg)).count())
+        .isEqualTo(1);  // 1 declared dep
   }
 
   @Test
@@ -270,6 +273,7 @@
         .containsAllOf(
             "--bootclasspath_entry",
             "--classpath_entry",
+            "--directdep",
             "--input",
             "--output",
             "--checking_mode=error",
@@ -278,7 +282,9 @@
     ensureArgumentsHaveClassEntryOptionWithSuffix(
         arguments, "/intermediate/classes_and_libs_merged.jar");
     assertThat(arguments.stream().filter(arg -> "--classpath_entry".equals(arg)).count())
-        .isEqualTo(1);
+        .isEqualTo(5);  // transitive classpath
+    assertThat(arguments.stream().filter(arg -> "--directdep".equals(arg)).count())
+        .isEqualTo(1);  // 1 declared dep
   }
 
   @Test