Expose two methods from JavaSkylarkApiProvider in JavaInfo

JavaSkylarkApiProvider will be deprecated soon and replaced by JavaInfo.
Methods exposed:
getCompilationInfoProvider()
getTransitiveExports()

Changed signature of JavaCommon methods to accept JavaInfoBuilder.

RELNOTES:none
PiperOrigin-RevId: 178229835
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 781bc12..d5175b4 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
@@ -61,7 +61,6 @@
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
 import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
-import com.google.devtools.build.lib.rules.java.JavaGenJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
@@ -792,18 +791,19 @@
             recursiveJavaCompilationArgs,
             compileTimeDependencyArtifacts,
             NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER));
-    javaCommon.addTransitiveInfoProviders(builder, filesToBuild, classJar, ANDROID_COLLECTION_SPEC);
 
-    JavaGenJarsProvider javaGenJarsProvider =
-        javaCommon.createJavaGenJarsProvider(genClassJar, genSourceJar);
-    javaCommon.addJavaGenJarsProvider(builder, javaGenJarsProvider);
+    JavaInfo.Builder javaInfoBuilder = JavaInfo.Builder.create();
+
+    javaCommon.addTransitiveInfoProviders(
+        builder, javaInfoBuilder, filesToBuild, classJar, ANDROID_COLLECTION_SPEC);
+
+    javaCommon.addGenJarsProvider(builder, javaInfoBuilder, genClassJar, genSourceJar);
 
     DataBinding.maybeAddProvider(builder, ruleContext);
-    JavaInfo javaInfo = JavaInfo.Builder.create()
+    JavaInfo javaInfo = javaInfoBuilder
         .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider)
         .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
         .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider)
-        .addProvider(JavaGenJarsProvider.class, javaGenJarsProvider)
         .build();
 
     return builder
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index 0842f68..87fa145 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -45,7 +45,6 @@
 import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
-import com.google.devtools.build.lib.rules.java.JavaGenJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaHelper;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaPrimaryClassProvider;
@@ -301,11 +300,10 @@
 
     JavaRuleOutputJarsProvider ruleOutputJarsProvider = javaRuleOutputJarsProviderBuilder.build();
 
-    javaCommon.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+    JavaInfo.Builder javaInfoBuilder = JavaInfo.Builder.create();
 
-    JavaGenJarsProvider javaGenJarsProvider =
-        javaCommon.createJavaGenJarsProvider(genClassJar, genSourceJar);
-    javaCommon.addJavaGenJarsProvider(builder, javaGenJarsProvider);
+    javaCommon.addTransitiveInfoProviders(builder, javaInfoBuilder, filesToBuild, classJar);
+    javaCommon.addGenJarsProvider(builder, javaInfoBuilder, genClassJar, genSourceJar);
 
     // Just confirming that there are no aliases being used here.
     AndroidFeatureFlagSetProvider.getAndValidateFlagMapFromRuleContext(ruleContext);
@@ -317,11 +315,9 @@
     NestedSet<Artifact> extraFilesToRun =
         NestedSetBuilder.create(Order.STABLE_ORDER, runfilesSupport.getRunfilesMiddleman());
 
-    JavaInfo javaInfo =
-        JavaInfo.Builder.create()
+    JavaInfo javaInfo = javaInfoBuilder
             .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider)
             .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
-            .addProvider(JavaGenJarsProvider.class, javaGenJarsProvider)
             .build();
 
     return builder
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index 73a9b35..6982f2f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -427,16 +427,14 @@
 
     JavaRuleOutputJarsProvider ruleOutputJarsProvider = ruleOutputJarsProviderBuilder.build();
 
-    common.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+    JavaInfo.Builder javaInfoBuilder = JavaInfo.Builder.create();
 
-    JavaGenJarsProvider javaGenJarsProvider =
-        common.createJavaGenJarsProvider(genClassJar, genSourceJar);
-    common.addJavaGenJarsProvider(builder, javaGenJarsProvider);
+    common.addTransitiveInfoProviders(builder, javaInfoBuilder, filesToBuild, classJar);
+    common.addGenJarsProvider(builder, javaInfoBuilder, genClassJar, genSourceJar);
 
-    JavaInfo javaInfo = JavaInfo.Builder.create()
+    JavaInfo javaInfo = javaInfoBuilder
         .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider)
         .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
-        .addProvider(JavaGenJarsProvider.class, javaGenJarsProvider)
         .build();
 
     return builder
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 78d49c8..7dfcc4b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -702,13 +702,16 @@
 
   public void addTransitiveInfoProviders(
       RuleConfiguredTargetBuilder builder,
+      JavaInfo.Builder javaInfoBuilder,
       NestedSet<Artifact> filesToBuild,
       @Nullable Artifact classJar) {
-    addTransitiveInfoProviders(builder, filesToBuild, classJar, JAVA_COLLECTION_SPEC);
+    addTransitiveInfoProviders(
+        builder, javaInfoBuilder, filesToBuild, classJar, JAVA_COLLECTION_SPEC);
   }
 
   public void addTransitiveInfoProviders(
       RuleConfiguredTargetBuilder builder,
+      JavaInfo.Builder javaInfoBuilder,
       NestedSet<Artifact> filesToBuild,
       @Nullable Artifact classJar,
       InstrumentationSpec instrumentationSpec) {
@@ -723,6 +726,9 @@
         .add(JavaExportsProvider.class, exportsProvider)
         .addOutputGroup(OutputGroupProvider.FILES_TO_COMPILE, getFilesToCompile(classJar))
         .add(JavaCompilationInfoProvider.class, compilationInfoProvider);
+
+    javaInfoBuilder.addProvider(JavaExportsProvider.class, exportsProvider);
+    javaInfoBuilder.addProvider(JavaCompilationInfoProvider.class, compilationInfoProvider);
   }
 
   private static InstrumentedFilesProvider getInstrumentationFilesProvider(RuleContext ruleContext,
@@ -737,23 +743,24 @@
         /*withBaselineCoverage*/!TargetUtils.isTestRule(ruleContext.getTarget()));
   }
 
-  public JavaGenJarsProvider createJavaGenJarsProvider(
-      @Nullable Artifact genClassJar, @Nullable Artifact genSourceJar) {
-    return collectTransitiveGenJars(
-        javaCompilationHelper.usesAnnotationProcessing(), genClassJar, genSourceJar);
-  }
-
-  public void addJavaGenJarsProvider(
+  public void addGenJarsProvider(
       RuleConfiguredTargetBuilder builder,
-      JavaGenJarsProvider javaGenJarsProvider) {
+      JavaInfo.Builder javaInfoBuilder,
+      @Nullable Artifact genClassJar,
+      @Nullable Artifact genSourceJar) {
+    JavaGenJarsProvider genJarsProvider = collectTransitiveGenJars(
+        javaCompilationHelper.usesAnnotationProcessing(),
+        genClassJar, genSourceJar);
 
     NestedSetBuilder<Artifact> genJarsBuilder = NestedSetBuilder.stableOrder();
-    genJarsBuilder.addTransitive(javaGenJarsProvider.getTransitiveGenClassJars());
-    genJarsBuilder.addTransitive(javaGenJarsProvider.getTransitiveGenSourceJars());
+    genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenClassJars());
+    genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenSourceJars());
 
     builder
-        .addProvider(javaGenJarsProvider)
+        .add(JavaGenJarsProvider.class, genJarsProvider)
         .addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genJarsBuilder.build());
+
+    javaInfoBuilder.addProvider(JavaGenJarsProvider.class, genJarsProvider);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index 738c925..d3359e8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -161,8 +161,11 @@
         JavaSourceJarsProvider.create(transitiveJavaSourceJars, srcJars);
     JavaCompilationArgsProvider compilationArgsProvider =
         JavaCompilationArgsProvider.create(javaCompilationArgs, recursiveJavaCompilationArgs);
-    common.addTransitiveInfoProviders(ruleBuilder, filesToBuild, null);
-    JavaInfo javaInfo = JavaInfo.Builder.create()
+
+    JavaInfo.Builder javaInfoBuilder = JavaInfo.Builder.create();
+    common.addTransitiveInfoProviders(ruleBuilder, javaInfoBuilder, filesToBuild, null);
+
+    JavaInfo javaInfo = javaInfoBuilder
         .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider)
         .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
         .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 3bd850f..56c633e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
+import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -60,7 +61,9 @@
         JavaRuleOutputJarsProvider.class,
         JavaRunfilesProvider.class,
         JavaPluginInfoProvider.class,
-        JavaGenJarsProvider.class
+        JavaGenJarsProvider.class,
+        JavaExportsProvider.class,
+        JavaCompilationInfoProvider.class
       );
 
   private final TransitiveInfoProviderMap providers;
@@ -300,6 +303,16 @@
   }
 
   @SkylarkCallable(
+    name = "compilation_info",
+    structField = true,
+    allowReturnNones = true,
+    doc = "Returns compilation information for this Java target."
+  )
+  public JavaCompilationInfoProvider getCompilationInfoProvider() {
+    return getProvider(JavaCompilationInfoProvider.class);
+  }
+
+  @SkylarkCallable(
     name = "transitive_deps",
     doc = "Returns the transitive set of Jars required to build the target.",
     structField = true
@@ -335,6 +348,16 @@
         JavaSourceJarsProvider::getTransitiveSourceJars);
   }
 
+  @SkylarkCallable(
+      name = "transitive_exports",
+      structField = true,
+      doc = "Returns transitive set of labels that are being exported from this rule."
+  )
+  public NestedSet<Label> getTransitiveExports() {
+    return getProviderAsNestedSet(
+        JavaExportsProvider.class,
+        JavaExportsProvider::getTransitiveExports);
+  }
 
   /**
    * Gets Provider, check it for not null and call function to get NestedSet&lt;S&gt; from it.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 890b07b..df75390 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -208,11 +208,11 @@
     JavaRuleOutputJarsProvider ruleOutputJarsProvider = ruleOutputJarsProviderBuilder.build();
 
     NestedSet<Artifact> filesToBuild = filesBuilder.build();
-    common.addTransitiveInfoProviders(builder, filesToBuild, classJar);
 
-    JavaGenJarsProvider javaGenJarsProvider =
-        common.createJavaGenJarsProvider(genClassJar, genSourceJar);
-    common.addJavaGenJarsProvider(builder, javaGenJarsProvider);
+    JavaInfo.Builder javaInfoBuilder = JavaInfo.Builder.create();
+
+    common.addTransitiveInfoProviders(builder, javaInfoBuilder, filesToBuild, classJar);
+    common.addGenJarsProvider(builder, javaInfoBuilder, genClassJar, genSourceJar);
 
     NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs();
 
@@ -224,14 +224,13 @@
         : JavaCommon.getTransitivePlugins(ruleContext);
 
     // java_library doesn't need to return JavaRunfilesProvider
-    JavaInfo javaInfo = JavaInfo.Builder.create()
+    JavaInfo javaInfo = javaInfoBuilder
         .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider)
         .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider)
         .addProvider(ProtoJavaApiInfoAspectProvider.class, protoAspectBuilder.build())
         .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
         // TODO(bazel-team): this should only happen for java_plugin
         .addProvider(JavaPluginInfoProvider.class, pluginInfoProvider)
-        .addProvider(JavaGenJarsProvider.class, javaGenJarsProvider)
         .build();
 
     builder
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index 4ec72da..dcfe291 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -1058,6 +1058,37 @@
 
 
   @Test
+  public void testJavaInfoGetTransitiveExports() throws Exception {
+    scratch.file(
+        "foo/extension.bzl",
+        "result = provider()",
+        "def _impl(ctx):",
+        "  return [result(property = ctx.attr.dep[JavaInfo].transitive_exports)]",
+        "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })");
+
+    scratch.file(
+        "foo/BUILD",
+        "load(':extension.bzl', 'my_rule')",
+        "java_library(name = 'my_java_lib_c', srcs = ['java/C.java'])",
+        "java_library(name = 'my_java_lib_b', srcs = ['java/B.java'])",
+        "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'], ",
+        "             deps = [':my_java_lib_b', ':my_java_lib_c'], ",
+        "             exports = [':my_java_lib_b']) ",
+        "my_rule(name = 'my_skylark_rule', dep = ':my_java_lib_a')");
+    assertNoEvents();
+    ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_skylark_rule");
+    Info info = myRuleTarget.get(
+        new SkylarkKey(Label.parseAbsolute("//foo:extension.bzl"), "result"));
+
+    @SuppressWarnings("unchecked") SkylarkNestedSet exports =
+        (SkylarkNestedSet) (info.getValue("property"));
+
+    assertThat(exports.getSet(Label.class))
+        .containsExactly(Label.parseAbsolute("//foo:my_java_lib_b"));
+  }
+
+
+  @Test
   public void testJavaInfoGetGenJarsProvider() throws Exception {
     scratch.file(
         "foo/extension.bzl",
@@ -1070,7 +1101,7 @@
         "foo/BUILD",
         "load(':extension.bzl', 'my_rule')",
         "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'], ",
-        "javacopts = ['-processor com.google.process.Processor'])",
+        "             javacopts = ['-processor com.google.process.Processor'])",
         "my_rule(name = 'my_skylark_rule', dep = ':my_java_lib_a')");
     assertNoEvents();
     ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_skylark_rule");
@@ -1087,6 +1118,33 @@
 
 
   @Test
+  public void javaInfoGetCompilationInfoProvider() throws Exception {
+    scratch.file(
+        "foo/extension.bzl",
+        "result = provider()",
+        "def _impl(ctx):",
+        "  return [result(property = ctx.attr.dep[JavaInfo].compilation_info)]",
+        "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })");
+
+    scratch.file(
+        "foo/BUILD",
+        "load(':extension.bzl', 'my_rule')",
+        "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'])",
+        "my_rule(name = 'my_skylark_rule', dep = ':my_java_lib_a')");
+    assertNoEvents();
+    ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_skylark_rule");
+    Info info = myRuleTarget.get(
+        new SkylarkKey(Label.parseAbsolute("//foo:extension.bzl"), "result"));
+
+    JavaCompilationInfoProvider javaCompilationInfoProvider =
+        (JavaCompilationInfoProvider) info.getValue("property");
+
+    assertThat(prettyJarNames(javaCompilationInfoProvider.getRuntimeClasspath()))
+        .containsExactly("foo/libmy_java_lib_a.jar");
+  }
+
+
+  @Test
   public void strictDepsEnabled() throws Exception {
     scratch.file(
         "foo/custom_library.bzl",