From 0f232691719ef89a0a1c7be631a84f435894a6ce Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 8 Aug 2018 10:20:08 -0700 Subject: Expose GeneratedExtensionRegistryProvider to Skylark. RELNOTES: None PiperOrigin-RevId: 207905848 --- .../build/lib/rules/android/AndroidCommon.java | 2 +- .../lib/rules/android/AndroidLocalTestBase.java | 3 +- .../devtools/build/lib/rules/java/JavaBinary.java | 2 +- .../devtools/build/lib/rules/java/JavaLibrary.java | 2 +- .../proto/GeneratedExtensionRegistryProvider.java | 132 +++++++++++++++++---- .../GeneratedExtensionRegistryProviderApi.java | 103 ++++++++++++++++ 6 files changed, 216 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java 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 9466d7060a..e18857f31e 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 @@ -678,7 +678,7 @@ public class AndroidCommon { idlHelper.addTransitiveInfoProviders(builder, classJar, manifestProtoOutput); if (generatedExtensionRegistryProvider != null) { - builder.add(GeneratedExtensionRegistryProvider.class, generatedExtensionRegistryProvider); + builder.addNativeDeclaredProvider(generatedExtensionRegistryProvider); } OutputJar resourceJar = null; if (resourceApk.getResourceJavaClassJar() != null && resourceSourceJar != null) { 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 5700cf35d0..b484479169 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 @@ -324,8 +324,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext); if (generatedExtensionRegistryProvider != null) { - builder.addProvider( - GeneratedExtensionRegistryProvider.class, generatedExtensionRegistryProvider); + builder.addNativeDeclaredProvider(generatedExtensionRegistryProvider); } JavaRuleOutputJarsProvider ruleOutputJarsProvider = javaRuleOutputJarsProviderBuilder.build(); 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 6bba8faf1b..45edf6c647 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 @@ -306,7 +306,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory { new JavaPrimaryClassProvider( semantics.getPrimaryClass(ruleContext, common.getSrcsArtifacts()))); if (generatedExtensionRegistryProvider != null) { - builder.add(GeneratedExtensionRegistryProvider.class, generatedExtensionRegistryProvider); + builder.addNativeDeclaredProvider(generatedExtensionRegistryProvider); } Artifact deployJar = 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 317b169c97..2d3e7deacd 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 @@ -177,7 +177,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { semantics.addProviders(ruleContext, common, genSourceJar, builder); if (generatedExtensionRegistryProvider != null) { - builder.add(GeneratedExtensionRegistryProvider.class, generatedExtensionRegistryProvider); + builder.addNativeDeclaredProvider(generatedExtensionRegistryProvider); } JavaCompilationArgsProvider compilationArgsProvider = javaCompilationArgs; diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java index 4aae6dbce7..0c03339c36 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java @@ -14,15 +14,17 @@ package com.google.devtools.build.lib.rules.java.proto; -import com.google.auto.value.AutoValue; import com.google.common.base.Verify; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; 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; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; +import com.google.devtools.build.lib.packages.BuiltinProvider; +import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.skylarkbuildapi.java.GeneratedExtensionRegistryProviderApi; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; /** * A {@link TransitiveInfoProvider} for {@link Artifact}s created and used to generate the proto @@ -30,54 +32,138 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec. * from a target, that the top most target produces a registry that is a superset of any child * registries. */ -@AutoCodec(strategy = Strategy.AUTO_VALUE_BUILDER) -@AutoValue @Immutable -public abstract class GeneratedExtensionRegistryProvider implements TransitiveInfoProvider { +public final class GeneratedExtensionRegistryProvider extends NativeInfo + implements GeneratedExtensionRegistryProviderApi { + + public static final String PROVIDER_NAME = "GeneratedExtensionRegistryProvider"; + public static final Provider PROVIDER = new Provider(); + + private final Label generatingRuleLabel; + private final boolean isLite; + private final Artifact classJar; + private final Artifact srcJar; + private final NestedSet inputs; /** @return the rule label for which this registry was built. */ - public abstract Label getGeneratingRuleLabel(); + @Override + public Label getGeneratingRuleLabel() { + return generatingRuleLabel; + } /** @return if this registry was generated for lite or full runtime. */ - public abstract boolean isLite(); + @Override + public boolean isLite() { + return isLite; + } /** @return the class jar generated by the registry. */ - public abstract Artifact getClassJar(); + @Override + public Artifact getClassJar() { + return classJar; + } /** @return the source jar generated by the registry. */ - public abstract Artifact getSrcJar(); + @Override + public Artifact getSrcJar() { + return srcJar; + } /** @return the proto jars used to generate the registry. */ - public abstract NestedSet getInputs(); + @Override + public NestedSet getInputs() { + return inputs; + } public static Builder builder() { - return new AutoValue_GeneratedExtensionRegistryProvider.Builder(); + return new GeneratedExtensionRegistryProvider.Builder(); + } + + GeneratedExtensionRegistryProvider( + Label generatingRuleLabel, + boolean isLite, + Artifact classJar, + Artifact srcJar, + NestedSet inputs) { + super(PROVIDER); + this.generatingRuleLabel = generatingRuleLabel; + this.isLite = isLite; + this.classJar = classJar; + this.srcJar = srcJar; + this.inputs = inputs; } /** A builder for {@link GeneratedExtensionRegistryProvider}. */ - @AutoValue.Builder - public abstract static class Builder { + public static class Builder { + private Label generatingRuleLabel = null; + private boolean isLite = false; + private Artifact classJar = null; + private Artifact srcJar = null; + private NestedSet inputs = null; /** Sets the rule label for which this registry was built. */ - public abstract Builder setGeneratingRuleLabel(Label label); + public Builder setGeneratingRuleLabel(Label label) { + this.generatingRuleLabel = label; + return this; + } /** Indicates this registry was built for lite runtime if true, full otherwise. */ - public abstract Builder setLite(boolean lite); + public Builder setLite(boolean lite) { + this.isLite = lite; + return this; + } /** Sets the class jar containing the generated extension registry. */ - public abstract Builder setClassJar(Artifact classJar); + public Builder setClassJar(Artifact classJar) { + this.classJar = classJar; + return this; + } /** Sets the source jar containing the generated extension registry. */ - public abstract Builder setSrcJar(Artifact srcJar); + public Builder setSrcJar(Artifact srcJar) { + this.srcJar = srcJar; + return this; + } /** Sets the transitive set of protos used to produce the generated extension registry. */ - public abstract Builder setInputs(NestedSet inputs); + public Builder setInputs(NestedSet inputs) { + this.inputs = inputs; + return this; + } - abstract GeneratedExtensionRegistryProvider autoBuild(); public GeneratedExtensionRegistryProvider build() { - GeneratedExtensionRegistryProvider result = autoBuild(); - Verify.verify(!result.getInputs().isEmpty()); - return autoBuild(); + Verify.verify(!inputs.isEmpty()); + return new GeneratedExtensionRegistryProvider( + generatingRuleLabel, isLite, classJar, srcJar, inputs); + } + } + + /** Provider class for {@link GeneratedExtensionRegistryProvider} objects. */ + public static class Provider extends BuiltinProvider + implements GeneratedExtensionRegistryProviderApi.Provider { + private Provider() { + super(PROVIDER_NAME, GeneratedExtensionRegistryProvider.class); + } + + public String getName() { + return PROVIDER_NAME; + } + + @Override + public GeneratedExtensionRegistryProvider create( + Label generatingRuleLabel, + boolean isLite, + Artifact classJar, + Artifact srcJar, + SkylarkNestedSet inputs) { + return new GeneratedExtensionRegistryProvider( + generatingRuleLabel, + isLite, + classJar, + srcJar, + NestedSetBuilder.stableOrder() + .addTransitive(inputs.getSet(Artifact.class)) + .build()); } } } diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java new file mode 100644 index 0000000000..0f32860fac --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java @@ -0,0 +1,103 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.skylarkbuildapi.java; + +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.skylarkbuildapi.FileApi; +import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi; +import com.google.devtools.build.lib.skylarkbuildapi.StructApi; +import com.google.devtools.build.lib.skylarkinterface.Param; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; + +/** Provides information about generated proto extensions. */ +@SkylarkModule( + name = "GeneratedExtensionRegistryProvider", + doc = "Information about generated proto extensions.", + category = SkylarkModuleCategory.PROVIDER) +public interface GeneratedExtensionRegistryProviderApi extends StructApi { + + public static final String NAME = "GeneratedExtensionRegistryProvider"; + + @SkylarkCallable(name = "rule_label", structField = true, doc = "", documented = false) + Label getGeneratingRuleLabel(); + + @SkylarkCallable(name = "lite", structField = true, doc = "", documented = false) + boolean isLite(); + + @SkylarkCallable(name = "class_jar", structField = true, doc = "", documented = false) + FileT getClassJar(); + + @SkylarkCallable(name = "src_jar", structField = true, doc = "", documented = false) + FileT getSrcJar(); + + @SkylarkCallable(name = "inputs", structField = true, doc = "", documented = false) + NestedSet getInputs(); + + /** The provider implementing this can construct the GeneratedExtensionRegistryProvider. */ + @SkylarkModule(name = "Provider", doc = "", documented = false) + public interface Provider extends ProviderApi { + + @SkylarkCallable( + name = NAME, + doc = "The GeneratedExtensionRegistryProvider constructor.", + parameters = { + @Param( + name = "generatingRuleLabel", + doc = "Rule label for which this registry was built", + positional = true, + named = false, + type = Label.class), + @Param( + name = "isLite", + doc = "If this registry was generated for lite or full runtime", + positional = true, + named = false, + type = Boolean.class), + @Param( + name = "classJar", + doc = "Class jar generated by the registry", + positional = true, + named = false, + type = FileApi.class), + @Param( + name = "srcJar", + doc = "Source jar generated by the registry", + positional = true, + named = false, + type = FileApi.class), + @Param( + name = "inputs", + doc = "Proto jars used to generate the registry", + positional = true, + named = false, + type = SkylarkNestedSet.class, + generic1 = FileApi.class), + }, + selfCall = true) + @SkylarkConstructor(objectType = GeneratedExtensionRegistryProviderApi.class) + GeneratedExtensionRegistryProviderApi create( + Label generatingRuleLabel, + boolean isLite, + FileT classJar, + FileT srcJar, + SkylarkNestedSet inputs) + throws EvalException; + } +} -- cgit v1.2.3