aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2018-07-17 18:35:36 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-17 18:37:22 -0700
commit6b5205b000fe391faf12f84ed4f2e9ea38ae81ff (patch)
tree077b068f74df373bb635435b924af7f003e9ca08
parentf309ad3be36363070e87eef0ee04b12f4956d601 (diff)
Expose AndroidFeatureFlagSetProvider to Skylark
RELNOTES: None PiperOrigin-RevId: 205011761
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java62
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;
+ }
+}