diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
4 files changed, 71 insertions, 34 deletions
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 ff90a87a64..8339c8a9c5 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 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider> 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 1292ac065a..591057e4ac 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 @@ import javax.annotation.Nullable; 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 3082275721..477f624c6f 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.ConfiguredTarget; 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.JavaCompilationArgsProvider; 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 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured 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 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured 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 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured 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 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured 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 164b582c0d..ba87bc326b 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.ConfiguredTarget; 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.JavaCompilationArgsProvider; 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 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe 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 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe 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 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe NestedSetBuilder.fromNestedSets( transform(getDeps(JavaProtoLibraryTransitiveFilesToBuildProvider.class), GET_JARS)); + JavaSkylarkApiProvider.Builder skylarkApiProvider = JavaSkylarkApiProvider.builder(); + if (shouldGenerateCode()) { Artifact sourceJar = getSourceJarArtifact(); createProtoCompileAction(sourceJar); @@ -207,21 +202,36 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe 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)); } /** |