diff options
author | Googler <noreply@google.com> | 2018-07-17 14:24:30 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-07-17 14:25:47 -0700 |
commit | 27e81776f6dd684aca01c1066216a3c127821da5 (patch) | |
tree | fb035b41aebd8397320ebfd3a636b39d2fe2c131 | |
parent | 86e007fdeced120cda3108e97044db4fd817d5f0 (diff) |
Expose ProguardSpecProvider to skylark.
RELNOTES: None
PiperOrigin-RevId: 204974291
12 files changed, 102 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index cbbbaaefcb..869267d318 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -407,7 +407,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .list() : ImmutableList.<Artifact>of(), ruleContext.getPrerequisiteArtifacts(":extra_proguard_specs", Mode.TARGET).list(), - ruleContext.getPrerequisites("deps", Mode.TARGET, ProguardSpecProvider.class)); + ruleContext.getPrerequisites("deps", Mode.TARGET, ProguardSpecProvider.PROVIDER)); // TODO(bazel-team): Verify that proguard spec files don't contain -printmapping directions // which this -printmapping command line flag will override. diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java index 8748454bdb..1fcdb2c6d5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java @@ -189,7 +189,7 @@ public class AndroidIdlHelper { if (aidlLib == null) { return; } - ProguardSpecProvider provider = aidlLib.getProvider(ProguardSpecProvider.class); + ProguardSpecProvider provider = aidlLib.get(ProguardSpecProvider.PROVIDER); if (provider == null) { return; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index d2afb8e678..26115c36fa 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -246,7 +246,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { JavaSourceInfoProvider.fromJavaTargetAttributes(javaTargetAttributes, javaSemantics)) .addNativeDeclaredProvider( new AndroidCcLinkParamsProvider(androidCommon.getCcLinkParamsStore())) - .add(ProguardSpecProvider.class, new ProguardSpecProvider(transitiveProguardConfigs)) + .addNativeDeclaredProvider(new ProguardSpecProvider(transitiveProguardConfigs)) .addNativeDeclaredProvider( new AndroidProguardInfo(proguardLibrary.collectLocalProguardSpecs())) .addOutputGroup(OutputGroupInfo.HIDDEN_TOP_LEVEL, transitiveProguardConfigs) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index c3a0c8634d..97583f4def 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java @@ -623,7 +623,7 @@ public abstract class AndroidSkylarkData binaryDataInfo.getManifestInfo().getManifest(), filesFromConfiguredTargets(localProguardSpecs), filesFromConfiguredTargets(extraProguardSpecs), - getProviders(deps, ProguardSpecProvider.class)); + getProviders(deps, ProguardSpecProvider.PROVIDER)); // TODO(asteinb): There should never be more than one direct resource exposed in the provider. // Can we adjust its structure to take this into account? 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 e09e95a663..c8e9e97308 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 @@ -158,7 +158,7 @@ public class JavaImport implements RuleConfiguredTargetFactory { JavaNativeLibraryProvider.class, new JavaNativeLibraryProvider(transitiveJavaNativeLibraries)) .add(JavaSourceInfoProvider.class, javaSourceInfoProvider) - .add(ProguardSpecProvider.class, new ProguardSpecProvider(proguardSpecs)) + .addNativeDeclaredProvider(new ProguardSpecProvider(proguardSpecs)) .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveJavaSourceJars) .addOutputGroup(OutputGroupInfo.HIDDEN_TOP_LEVEL, proguardSpecs) .build(); 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 c40d186e19..f71a1bde3b 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 @@ -215,12 +215,11 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { .setFilesToBuild(filesToBuild) .addProvider(new JavaNativeLibraryProvider(transitiveJavaNativeLibraries)) .addProvider(JavaSourceInfoProvider.fromJavaTargetAttributes(attributes, semantics)) - .addProvider(new ProguardSpecProvider(proguardSpecs)) + .addNativeDeclaredProvider(new ProguardSpecProvider(proguardSpecs)) .addNativeDeclaredProvider(javaInfo) .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars) .addOutputGroup(OutputGroupInfo.HIDDEN_TOP_LEVEL, proguardSpecs); - if (ruleContext.hasErrors()) { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java index 7328701eb7..4c27def83d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java @@ -253,7 +253,7 @@ public abstract class ProguardHelper { ruleContext.attributes().has(PROGUARD_SPECS, BuildType.LABEL_LIST) ? ruleContext.getPrerequisiteArtifacts(PROGUARD_SPECS, Mode.TARGET).list() : ImmutableList.<Artifact>of(), - ruleContext.getPrerequisites("deps", Mode.TARGET, ProguardSpecProvider.class)); + ruleContext.getPrerequisites("deps", Mode.TARGET, ProguardSpecProvider.PROVIDER)); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardLibrary.java index 0cdc265a31..f2c1cb4c9c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardLibrary.java @@ -106,7 +106,7 @@ public final class ProguardLibrary { } NestedSetBuilder<Artifact> dependencySpecsBuilder = NestedSetBuilder.naiveLinkOrder(); for (ProguardSpecProvider provider : - ruleContext.getPrerequisites(attributeName, mode, ProguardSpecProvider.class)) { + ruleContext.getPrerequisites(attributeName, mode, ProguardSpecProvider.PROVIDER)) { dependencySpecsBuilder.addTransitive(provider.getTransitiveProguardSpecs()); } return dependencySpecsBuilder.build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java index 0db1e3371e..79f1c69fad 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java @@ -14,23 +14,30 @@ package com.google.devtools.build.lib.rules.java; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; 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.packages.BuiltinProvider; +import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.skylarkbuildapi.java.ProguardSpecProviderApi; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; /** A target that can provide proguard specifications to Android binaries. */ @Immutable -@AutoCodec -public final class ProguardSpecProvider implements TransitiveInfoProvider { +public final class ProguardSpecProvider extends NativeInfo + implements ProguardSpecProviderApi<Artifact> { + + public static final String PROVIDER_NAME = "ProguardSpecProvider"; + public static final Provider PROVIDER = new Provider(); private final NestedSet<Artifact> transitiveProguardSpecs; public ProguardSpecProvider(NestedSet<Artifact> transitiveProguardSpecs) { + super(PROVIDER); this.transitiveProguardSpecs = transitiveProguardSpecs; } + @Override public NestedSet<Artifact> getTransitiveProguardSpecs() { return transitiveProguardSpecs; } @@ -43,4 +50,23 @@ public final class ProguardSpecProvider implements TransitiveInfoProvider { return new ProguardSpecProvider(specs.build()); } + /** Provider class for {@link ProguardSpecProvider} objects. */ + public static class Provider extends BuiltinProvider<ProguardSpecProvider> + implements ProguardSpecProviderApi.Provider<Artifact> { + private Provider() { + super(PROVIDER_NAME, ProguardSpecProvider.class); + } + + public String getName() { + return PROVIDER_NAME; + } + + @Override + public ProguardSpecProvider create(SkylarkNestedSet specs) { + return new ProguardSpecProvider( + NestedSetBuilder.<Artifact>stableOrder() + .addTransitive(specs.getSet(Artifact.class)) + .build()); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java index 6e38294284..cb9be32ef6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java @@ -92,9 +92,8 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory { .addSkylarkTransitiveInfo( JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext()) .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles)) - .addOutputGroup( - OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER)) - .addProvider(getJavaLiteRuntimeSpec(ruleContext)) + .addOutputGroup(OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER)) + .addNativeDeclaredProvider(getJavaLiteRuntimeSpec(ruleContext)) .addNativeDeclaredProvider(javaInfo) .addProvider(createCcLinkParamsStore(ruleContext, ImmutableList.of())) .build(); @@ -110,7 +109,7 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory { return new ProguardSpecProvider(specs); } - ProguardSpecProvider specProvider = runtime.getProvider(ProguardSpecProvider.class); + ProguardSpecProvider specProvider = runtime.get(ProguardSpecProvider.PROVIDER); if (specProvider == null) { return new ProguardSpecProvider(specs); } diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java new file mode 100644 index 0000000000..39b2cafe69 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java @@ -0,0 +1,60 @@ +// 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.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 proguard specs for Android binaries. */ +@SkylarkModule( + name = "ProguardSpecProvider", + doc = "Proguard specifications used for Android binaries.", + category = SkylarkModuleCategory.PROVIDER) +public interface ProguardSpecProviderApi<FileT extends FileApi> extends StructApi { + + public static final String NAME = "ProguardSpecProvider"; + + @SkylarkCallable(name = "specs", structField = true, doc = "", documented = false) + NestedSet<FileT> getTransitiveProguardSpecs(); + + /** The provider implementing this can construct the ProguardSpecProvider. */ + @SkylarkModule(name = "Provider", doc = "", documented = false) + public interface Provider<FileT extends FileApi> extends ProviderApi { + + @SkylarkCallable( + name = NAME, + doc = "The <code>ProguardSpecProvider</code> constructor.", + parameters = { + @Param( + name = "specs", + doc = "Transitive proguard specs.", + positional = true, + named = false, + type = SkylarkNestedSet.class, + generic1 = FileApi.class), + }, + selfCall = true) + @SkylarkConstructor(objectType = ProguardSpecProviderApi.class) + ProguardSpecProviderApi<FileT> create(SkylarkNestedSet specs) throws EvalException; + } +} diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java index bbb35bf536..ad2cb1d405 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java @@ -284,7 +284,7 @@ public class SkylarkJavaLiteProtoLibraryTest extends BuildViewTestCase { "proto_library(name = 'bar')"); NestedSet<Artifact> providedSpecs = getConfiguredTarget("//x:lite_pb2") - .getProvider(ProguardSpecProvider.class) + .get(ProguardSpecProvider.PROVIDER) .getTransitiveProguardSpecs(); assertThat(ActionsTestUtil.baseArtifactNames(providedSpecs)) |