Grab java artifacts from application_resources attribute is it does java compilation.

PiperOrigin-RevId: 413544678
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 9a3cdc9..dac217c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Streams;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ResourceSet;
@@ -442,7 +443,19 @@
       boolean generateExtensionRegistry)
       throws InterruptedException, RuleErrorException {
 
-    classJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR);
+    if (shouldCompileJavaSrcs) {
+      classJar =
+          ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR);
+    } else {
+      // When java compilation happens in application_resources, grab the class jar from its
+      // JavaInfo.
+      classJar =
+          Iterables.getOnlyElement(
+                  JavaInfo.getJavaInfo(ruleContext.getPrerequisite("application_resources"))
+                      .getOutputJars()
+                      .getJavaOutputs())
+              .getClassJar();
+    }
     idlHelper = new AndroidIdlHelper(ruleContext, classJar);
 
     BootClassPathInfo bootClassPathInfo;
@@ -538,21 +551,71 @@
     }
 
     JavaTargetAttributes attributes = attributesBuilder.build();
-    initJava(
-        javaSemantics,
-        helper,
-        attributes,
-        artifactsBuilder,
-        collectJavaCompilationArgs,
-        filesBuilder,
-        generateExtensionRegistry);
-    if (ruleContext.hasErrors()) {
-      return null;
+    if (shouldCompileJavaSrcs) {
+      initJava(
+          javaSemantics,
+          helper,
+          attributes,
+          artifactsBuilder,
+          collectJavaCompilationArgs,
+          filesBuilder,
+          generateExtensionRegistry);
+      if (ruleContext.hasErrors()) {
+        return null;
+      }
+      if (generatedExtensionRegistryProvider != null) {
+        jarsProducedForRuntime.add(generatedExtensionRegistryProvider.getClassJar());
+      }
+      this.jarsProducedForRuntime = jarsProducedForRuntime.add(classJar).build();
+    } else {
+      // Getting java artifacts from application_resources
+      JavaInfo javaInfo =
+          JavaInfo.getJavaInfo(ruleContext.getPrerequisite("application_resources"));
+      JavaOutput javaOutput = Iterables.getOnlyElement(javaInfo.getOutputJars().getJavaOutputs());
+      outputs = helper.createOutputs(javaOutput);
+
+      // The macro creating both the Starlark android_binary_internal and android_binary ensures
+      // that they share the same attributes, which is why we can still check the android_binary
+      // attributes when Javac happens in android_binary_internal.
+      if (attributes.hasSources() || attributes.hasResources()) {
+        // We only want to add a jar to the classpath of a dependent rule if it has content.
+        artifactsBuilder.addRuntimeJar(classJar);
+      }
+
+      artifactsBuilder.addCompileTimeJarAsFullJar(classJar);
+      javaSourceJarsProviderBuilder
+          .addAllSourceJars(javaInfo.getSourceJars())
+          .addAllTransitiveSourceJars(
+              javaCommon.collectTransitiveSourceJars(javaInfo.getSourceJars()));
+
+      if (generateExtensionRegistry) {
+        generatedExtensionRegistryProvider =
+            javaSemantics.createGeneratedExtensionRegistry(
+                ruleContext,
+                javaCommon,
+                filesBuilder,
+                artifactsBuilder,
+                javaRuleOutputJarsProviderBuilder,
+                javaSourceJarsProviderBuilder);
+      }
+
+      JavaCompilationArtifacts javaArtifacts = artifactsBuilder.build();
+      javaCommon.setJavaCompilationArtifacts(javaArtifacts);
+      filesToBuild = filesBuilder.build();
+      NestedSetBuilder<Artifact> runtimeJars =
+          NestedSetBuilder.<Artifact>naiveLinkOrder().addAll(javaInfo.getDirectRuntimeJars());
+      if (generatedExtensionRegistryProvider != null) {
+        jarsProducedForRuntime.add(generatedExtensionRegistryProvider.getClassJar());
+        runtimeJars.add(generatedExtensionRegistryProvider.getClassJar());
+      }
+      transitiveNeverlinkLibraries =
+          collectTransitiveNeverlinkLibraries(
+              ruleContext, javaCommon.getDependencies(), runtimeJars.build());
+      this.jarsProducedForRuntime = jarsProducedForRuntime.add(classJar).build();
+      if (collectJavaCompilationArgs) {
+        this.javaCompilationArgs = collectJavaCompilationArgs(asNeverLink, attributes.hasSources());
+      }
     }
-    if (generatedExtensionRegistryProvider != null) {
-      jarsProducedForRuntime.add(generatedExtensionRegistryProvider.getClassJar());
-    }
-    this.jarsProducedForRuntime = jarsProducedForRuntime.add(classJar).build();
     return attributes;
   }
 
@@ -872,9 +935,12 @@
       boolean isLibrary,
       boolean shouldCompileJavaSrcs) {
 
+    ImmutableList<Artifact> ruleSources = ruleContext.getPrerequisiteArtifacts("srcs").list();
+
     /**
      * When within the context of an android_binary rule and shouldCompileJavaSrcs is False, the
-     * Java compilation happens within the Starlark rule.
+     * Java compilation happens within the Starlark rule. We still list the srcs to know if the
+     * class jar has content and should be included.
      */
     if (!isLibrary && !shouldCompileJavaSrcs) {
       ImmutableList<TransitiveInfoCollection> runtimeDeps =
@@ -882,17 +948,14 @@
       return new JavaCommon(
           ruleContext,
           semantics,
-          ImmutableList.of(),
+          ruleSources,
           runtimeDeps, /* compileDeps */
           runtimeDeps,
           runtimeDeps); /* bothDeps */
     }
 
-    ImmutableList<Artifact> ruleSources = ruleContext.getPrerequisiteArtifacts("srcs").list();
-
     ImmutableList<Artifact> dataBindingSources =
         dataBindingContext.getAnnotationSourceFiles(ruleContext);
-
     ImmutableList<Artifact> srcs =
         ImmutableList.<Artifact>builder().addAll(ruleSources).addAll(dataBindingSources).build();
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
index ac66506..c25e2a01 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.FilesToRunProvider;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
@@ -228,6 +229,13 @@
       for (DataBindingV2Provider provider : providers) {
         setterStoreFiles.addTransitive(provider.getSetterStores());
       }
+      if (context.attributes().has("application_resources")) {
+        DataBindingV2Provider p =
+            context.getPrerequisite("application_resources", DataBindingV2Provider.PROVIDER);
+        if (p != null) {
+          setterStoreFiles.addAll(p.getSetterStores().toList());
+        }
+      }
     }
     return setterStoreFiles.build();
   }
@@ -406,6 +414,13 @@
   }
 
   private static Artifact getClassInfoFile(RuleContext context) {
+    if (shouldGetDatabindingArtifactsFromApplicationResources(context)) {
+      DataBindingV2Provider p =
+          context.getPrerequisite("application_resources", DataBindingV2Provider.PROVIDER);
+      if (p != null) {
+        return Iterables.getOnlyElement(p.getClassInfos().toList());
+      }
+    }
     return context.getUniqueDirectoryArtifact("databinding", "class-info.zip");
   }
 
@@ -418,7 +433,8 @@
 
   private static boolean shouldGetDatabindingArtifactsFromApplicationResources(
       RuleContext context) {
-    if (!context.attributes().isAttributeValueExplicitlySpecified("application_resources")) {
+    if (!context.attributes().has("application_resources")
+        || !context.attributes().isAttributeValueExplicitlySpecified("application_resources")) {
       return false;
     }
     AndroidApplicationResourceInfo androidApplicationResourceInfo =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index 86f0388..438246c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -40,6 +40,7 @@
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode;
 import com.google.devtools.build.lib.rules.java.JavaPluginInfo.JavaPluginData;
+import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.JavaOutput;
 import com.google.devtools.build.lib.rules.java.JavaToolchainProvider.JspecifyInfo;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -174,6 +175,21 @@
     return result;
   }
 
+  public JavaCompileOutputs<Artifact> createOutputs(JavaOutput output) {
+    JavaCompileOutputs.Builder<Artifact> builder =
+        JavaCompileOutputs.builder()
+            .output(output.getClassJar())
+            .manifestProto(output.getManifestProto())
+            .nativeHeader(output.getNativeHeadersJar());
+    if (generatesOutputDeps()) {
+      builder.depsProto(output.getJdeps());
+    }
+    if (usesAnnotationProcessing()) {
+      builder.genClass(output.getGeneratedClassJar()).genSource(output.getGeneratedSourceJar());
+    }
+    return builder.build();
+  }
+
   public void createCompileAction(JavaCompileOutputs<Artifact> outputs)
       throws InterruptedException {
     if (outputs.genClass() != null) {