diff options
author | Googler <noreply@google.com> | 2018-07-17 18:35:36 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-07-17 18:37:22 -0700 |
commit | 6b5205b000fe391faf12f84ed4f2e9ea38ae81ff (patch) | |
tree | 077b068f74df373bb635435b924af7f003e9ca08 | |
parent | f309ad3be36363070e87eef0ee04b12f4956d601 (diff) |
Expose AndroidFeatureFlagSetProvider to Skylark
RELNOTES: None
PiperOrigin-RevId: 205011761
3 files changed, 108 insertions, 10 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 869267d318..cd4833c4be 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 @@ -658,8 +658,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { applicationManifest.getManifest(), AndroidCommon.getApkDebugSigningKey(ruleContext))) .addNativeDeclaredProvider(new AndroidPreDexJarProvider(jarToDex)) - .addProvider( - AndroidFeatureFlagSetProvider.class, + .addNativeDeclaredProvider( AndroidFeatureFlagSetProvider.create( AndroidFeatureFlagSetProvider.getAndValidateFlagMapFromRuleContext(ruleContext))) .addOutputGroup("android_deploy_info", deployInfo); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java index 3746a85c8d..dae015df42 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java @@ -14,22 +14,25 @@ package com.google.devtools.build.lib.rules.android; -import com.google.auto.value.AutoValue; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.BuiltinProvider; +import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.config.ConfigFeatureFlag; +import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidFeatureFlagSetProviderApi; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkDict; import java.util.Map; /** @@ -40,18 +43,25 @@ import java.util.Map; * of the android_test will be compiled with different flags from the android_binary code which runs * in the same Android virtual machine, which may cause compatibility issues at runtime. */ -@AutoValue @Immutable -public abstract class AndroidFeatureFlagSetProvider implements TransitiveInfoProvider { +public final class AndroidFeatureFlagSetProvider extends NativeInfo + implements AndroidFeatureFlagSetProviderApi { + + public static final String PROVIDER_NAME = "AndroidFeatureFlagSetProvider"; + public static final Provider PROVIDER = new Provider(); /** The name of the attribute used by Android rules to set config_feature_flags. */ public static final String FEATURE_FLAG_ATTR = "feature_flags"; - AndroidFeatureFlagSetProvider() {} + private final Optional<ImmutableMap<Label, String>> flags; + + AndroidFeatureFlagSetProvider(Optional<? extends Map<Label, String>> flags) { + super(PROVIDER); + this.flags = flags.transform(ImmutableMap::copyOf); + } - /** Creates a new AndroidFeatureFlagSetProvider with the given flags. */ public static AndroidFeatureFlagSetProvider create(Optional<? extends Map<Label, String>> flags) { - return new AutoValue_AndroidFeatureFlagSetProvider(flags.transform(ImmutableMap::copyOf)); + return new AndroidFeatureFlagSetProvider(flags.transform(ImmutableMap::copyOf)); } /** @@ -123,5 +133,32 @@ public abstract class AndroidFeatureFlagSetProvider implements TransitiveInfoPro || (targetFlags.isPresent() && targetFlags.get().equals(depFlags.get())); } - public abstract Optional<ImmutableMap<Label, String>> getFlags(); + public Optional<ImmutableMap<Label, String>> getFlags() { + return flags; + } + + @Override + public ImmutableMap<Label, String> getFlagMap() { + return flags.or(ImmutableMap.of()); + } + + /** Provider class for {@link AndroidFeatureFlagSetProvider} objects. */ + public static class Provider extends BuiltinProvider<AndroidFeatureFlagSetProvider> + implements AndroidFeatureFlagSetProviderApi.Provider { + private Provider() { + super(PROVIDER_NAME, AndroidFeatureFlagSetProvider.class); + } + + public String getName() { + return PROVIDER_NAME; + } + + @Override + public AndroidFeatureFlagSetProvider create(SkylarkDict<Label, String> flags) + throws EvalException { + return new AndroidFeatureFlagSetProvider( + Optional.of( + SkylarkDict.castSkylarkDictOrNoneToDict(flags, Label.class, String.class, "flags"))); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java new file mode 100644 index 0000000000..2a7ec22380 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java @@ -0,0 +1,62 @@ +// 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.android; + +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.cmdline.Label; +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.SkylarkDict; + +/** */ +@SkylarkModule( + name = "AndroidFeatureFlagSetInfo", + doc = "Information about the android_binary feature flags", + category = SkylarkModuleCategory.PROVIDER) +public interface AndroidFeatureFlagSetProviderApi extends StructApi { + + public static final String NAME = "AndroidFeatureFlagSet"; + + @SkylarkCallable( + name = "flags", + doc = "Returns the flags contained by the provider.", + structField = true) + ImmutableMap<Label, String> getFlagMap(); + + /** The provider implementing this can construct the AndroidIdeInfo provider. */ + @SkylarkModule(name = "Provider", doc = "", documented = false) + public interface Provider extends ProviderApi { + + @SkylarkCallable( + name = NAME, + doc = "The <code>AndroidFeatureFlagSetProvider</code> constructor.", + parameters = { + @Param( + name = "flags", + doc = "Map of flags", + positional = true, + named = false, + type = SkylarkDict.class), + }, + selfCall = true) + @SkylarkConstructor(objectType = AndroidFeatureFlagSetProviderApi.class) + AndroidFeatureFlagSetProviderApi create(SkylarkDict<Label, String> flags) throws EvalException; + } +} |