Advertise java Skylark provider from java proto aspects.

The skylark provider is bound as "proto_java" to avoid collisions with the base, which is called "java".

--
PiperOrigin-RevId: 143960605
MOS_MIGRATED_REVID=143960605
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index ff90a87..8339c8a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -178,6 +178,12 @@
       return this;
     }
 
+    public Builder addSkylarkTransitiveInfo(String name, Object value) {
+      SkylarkProviderValidationUtil.checkSkylarkObjectSafe(value);
+      skylarkProviderBuilder.put(name, value);
+      return this;
+    }
+
     public Builder addSkylarkTransitiveInfo(String name, Object value, Location loc)
         throws EvalException {
       SkylarkProviderValidationUtil.validateAndThrowEvalException(name, value, loc);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
index 1292ac0..591057e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -42,6 +42,8 @@
 public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
   /** The name of the field in Skylark used to access this class. */
   public static final String NAME = "java";
+  /** The name of the field in Skylark proto aspects used to access this class. */
+  public static final String PROTO_NAME = "proto_java";
 
   private final JavaRuleOutputJarsProvider ruleOutputJarsProvider;
   @Nullable private final JavaSourceJarsProvider sourceJarsProvider;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index 3082275..477f624 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.rules.java.proto;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.getOnlyElement;
 import static com.google.common.collect.Iterables.transform;
 import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
 import static com.google.devtools.build.lib.cmdline.Label.parseAbsoluteUnchecked;
@@ -33,7 +34,6 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -51,7 +51,9 @@
 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.JavaLibraryHelper;
+import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
 import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
@@ -102,7 +104,8 @@
     SupportData supportData =
         checkNotNull(base.getProvider(ProtoSupportDataProvider.class)).getSupportData();
 
-    aspect.addProviders(new Impl(ruleContext, supportData, javaSemantics).createProviders());
+    Impl impl = new Impl(ruleContext, supportData, javaSemantics);
+    impl.addProviders(aspect);
 
     return aspect.build();
   }
@@ -162,9 +165,7 @@
                   GET_PROVIDER));
     }
 
-    TransitiveInfoProviderMap createProviders() {
-      TransitiveInfoProviderMap.Builder result = TransitiveInfoProviderMap.builder();
-
+    void addProviders(ConfiguredAspect.Builder aspect) {
       // Represents the result of compiling the code generated for this proto, including all of its
       // dependencies.
       JavaCompilationArgsProvider generatedCompilationArgsProvider;
@@ -175,6 +176,8 @@
           NestedSetBuilder.fromNestedSets(
               transform(getDeps(JavaProtoLibraryTransitiveFilesToBuildProvider.class), GET_JARS));
 
+      JavaSkylarkApiProvider.Builder skylarkApiProvider = JavaSkylarkApiProvider.builder();
+
       if (supportData.hasProtoSources()) {
         Artifact sourceJar = getSourceJarArtifact();
         createProtoCompileAction(sourceJar);
@@ -186,21 +189,37 @@
             NestedSetBuilder.<Artifact>stableOrder().add(sourceJar).build();
         transitiveOutputJars.add(outputJar);
 
-        result.add(
-            new JavaSourceJarsAspectProvider(
-                JavaSourceJarsProvider.create(
-                    NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars)));
+        Artifact compileTimeJar =
+            getOnlyElement(
+                generatedCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars());
+        // TODO(carmi): Expose to native rules
+        JavaRuleOutputJarsProvider ruleOutputJarsProvider =
+            JavaRuleOutputJarsProvider.builder()
+                .addOutputJar(outputJar, compileTimeJar, sourceJar)
+                .build();
+        JavaSourceJarsProvider sourceJarsProvider =
+            JavaSourceJarsProvider.create(
+                NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars);
+
+        skylarkApiProvider
+            .setRuleOutputJarsProvider(ruleOutputJarsProvider)
+            .setSourceJarsProvider(sourceJarsProvider);
+
+        aspect.addProvider(new JavaSourceJarsAspectProvider(sourceJarsProvider));
       } else {
         // No sources - this proto_library is an alias library, which exports its dependencies.
         // Simply propagate the compilation-args from its dependencies.
         generatedCompilationArgsProvider = dependencyCompilationArgs;
+        skylarkApiProvider.setRuleOutputJarsProvider(JavaRuleOutputJarsProvider.builder().build());
       }
 
-      return result
-          .add(
+      skylarkApiProvider.setCompilationArgsProvider(generatedCompilationArgsProvider);
+
+      aspect
+          .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.PROTO_NAME, skylarkApiProvider.build())
+          .addProviders(
               new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()),
-              new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider))
-          .build();
+              new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider));
     }
 
     private void createProtoCompileAction(Artifact sourceJar) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index 164b582..ba87bc32 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.rules.java.proto;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.getOnlyElement;
 import static com.google.common.collect.Iterables.transform;
 import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
 import static com.google.devtools.build.lib.cmdline.Label.parseAbsoluteUnchecked;
@@ -33,7 +34,6 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -50,7 +50,9 @@
 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.JavaLibraryHelper;
+import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.ToolchainInvocation;
@@ -110,15 +112,8 @@
     SupportData supportData =
         checkNotNull(base.getProvider(ProtoSupportDataProvider.class)).getSupportData();
 
-    aspect.addProviders(
-        new Impl(
-                ruleContext,
-                supportData,
-            javaSemantics,
-                rpcSupport
-        )
-            .createProviders());
-
+    Impl impl = new Impl(ruleContext, supportData, javaSemantics, rpcSupport);
+    impl.addProviders(aspect);
     return aspect.build();
   }
 
@@ -183,9 +178,7 @@
                   GET_PROVIDER));
     }
 
-    TransitiveInfoProviderMap createProviders() {
-      TransitiveInfoProviderMap.Builder result = TransitiveInfoProviderMap.builder();
-
+    void addProviders(ConfiguredAspect.Builder aspect) {
       // Represents the result of compiling the code generated for this proto, including all of its
       // dependencies.
       JavaCompilationArgsProvider generatedCompilationArgsProvider;
@@ -196,6 +189,8 @@
           NestedSetBuilder.fromNestedSets(
               transform(getDeps(JavaProtoLibraryTransitiveFilesToBuildProvider.class), GET_JARS));
 
+      JavaSkylarkApiProvider.Builder skylarkApiProvider = JavaSkylarkApiProvider.builder();
+
       if (shouldGenerateCode()) {
         Artifact sourceJar = getSourceJarArtifact();
         createProtoCompileAction(sourceJar);
@@ -207,21 +202,36 @@
             NestedSetBuilder.<Artifact>stableOrder().add(sourceJar).build();
         transitiveOutputJars.add(outputJar);
 
-        result.add(
-            new JavaSourceJarsAspectProvider(
-                JavaSourceJarsProvider.create(
-                    NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars)));
+        Artifact compileTimeJar =
+            getOnlyElement(
+                generatedCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars());
+        // TODO(carmi): Expose to native rules
+        JavaRuleOutputJarsProvider ruleOutputJarsProvider =
+            JavaRuleOutputJarsProvider.builder()
+                .addOutputJar(outputJar, compileTimeJar, sourceJar)
+                .build();
+        JavaSourceJarsProvider sourceJarsProvider =
+            JavaSourceJarsProvider.create(
+                NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars);
+
+        skylarkApiProvider
+            .setRuleOutputJarsProvider(ruleOutputJarsProvider)
+            .setSourceJarsProvider(sourceJarsProvider);
+
+        aspect.addProvider(new JavaSourceJarsAspectProvider(sourceJarsProvider));
       } else {
         // No sources - this proto_library is an alias library, which exports its dependencies.
         // Simply propagate the compilation-args from its dependencies.
         generatedCompilationArgsProvider = dependencyCompilationArgs;
+        skylarkApiProvider.setRuleOutputJarsProvider(JavaRuleOutputJarsProvider.builder().build());
       }
 
-      return result
-          .add(
+      skylarkApiProvider.setCompilationArgsProvider(generatedCompilationArgsProvider);
+      aspect
+          .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.PROTO_NAME, skylarkApiProvider.build())
+          .addProviders(
               new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()),
-              new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider))
-          .build();
+              new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider));
     }
 
     /**