aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-10-06 12:14:43 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-10-07 08:04:02 +0000
commit299f57221bcd4b062f185ce1fc7840a8f29df217 (patch)
tree42eeeb39093cb57d57b194f92d39368dfa662a2e /src
parentc23a997dd98bdaf5730044e3f73a921d160cf4b1 (diff)
Add cc_common.link_params declared provider.
-- MOS_MIGRATED_REVID=135346927
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java4
4 files changed, 46 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index aa925d5a7f..51d2e6fe0a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -45,7 +45,6 @@ import com.google.devtools.build.lib.util.Preconditions;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.TreeMap;
/**
@@ -297,6 +296,13 @@ public final class RuleConfiguredTargetBuilder {
return this;
}
+ public RuleConfiguredTargetBuilder addNativeDeclaredProvider(SkylarkClassObject provider) {
+ SkylarkClassObjectConstructor constructor = provider.getConstructor();
+ Preconditions.checkState(constructor.isExported());
+ skylarkDeclaredProviders.put(constructor.getKey(), provider);
+ return this;
+ }
+
/**
* Add a Skylark transitive info. The provider value must be safe.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
index 0854822e43..e4788334c3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
@@ -41,7 +41,7 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
* "struct" function.
*/
public static final SkylarkClassObjectConstructor STRUCT =
- createNative("struct");
+ createNativeConstructable("struct");
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
@@ -50,22 +50,39 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
@Nullable
private Key key;
+ /**
+ * Some native declared providers are not constructable from Skylark.
+ */
+ private final boolean isConstructable;
+
private SkylarkClassObjectConstructor(String name, Location location) {
super(name, SIGNATURE, location);
+ // All Skylark-defined declared providers are constructable.
+ this.isConstructable = true;
}
- private SkylarkClassObjectConstructor(String name) {
- this(name, Location.BUILTIN);
- key = new NativeKey();
+ private SkylarkClassObjectConstructor(String name, boolean isConstructable) {
+ super(name, SIGNATURE, Location.BUILTIN);
+ this.key = new NativeKey();
+ this.isConstructable = isConstructable;
}
/**
* Create a native Declared Provider ({@link SkylarkClassObject} constructor)
*/
public static SkylarkClassObjectConstructor createNative(String name) {
- return new SkylarkClassObjectConstructor(name);
+ return new SkylarkClassObjectConstructor(name, false);
+ }
+
+ /**
+ * Create a native Declared Provider ({@link SkylarkClassObject} constructor)
+ * that can be constructed from Skylark.
+ */
+ public static SkylarkClassObjectConstructor createNativeConstructable(String name) {
+ return new SkylarkClassObjectConstructor(name, true);
}
+
/**
* Create a Skylark-defined Declared Provider ({@link SkylarkClassObject} constructor)
*
@@ -78,6 +95,11 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
@Override
protected Object call(Object[] args, @Nullable FuncallExpression ast, @Nullable Environment env)
throws EvalException, InterruptedException {
+ if (!isConstructable) {
+ Location loc = ast != null ? ast.getLocation() : Location.BUILTIN;
+ throw new EvalException(loc,
+ String.format("'%s' cannot be constructed from Skylark", getPrintableName()));
+ }
@SuppressWarnings("unchecked")
Map<String, Object> kwargs = (Map<String, Object>) args[0];
return new SkylarkClassObject(this, kwargs, ast != null ? ast.getLocation() : Location.BUILTIN);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java
index a433850b36..965cc9ef7b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java
@@ -15,16 +15,20 @@
package com.google.devtools.build.lib.rules.cpp;
import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
+import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore.CcLinkParamsStoreImpl;
-/**
- * A target that provides C linker parameters.
- */
+/** A target that provides C linker parameters. */
@Immutable
-public final class CcLinkParamsProvider implements TransitiveInfoProvider {
+public final class CcLinkParamsProvider extends SkylarkClassObject
+ implements TransitiveInfoProvider {
+ public static final SkylarkClassObjectConstructor CC_LINK_PARAMS =
+ SkylarkClassObjectConstructor.createNative("link_params");
public static final Function<TransitiveInfoCollection, CcLinkParamsStore> TO_LINK_PARAMS =
new Function<TransitiveInfoCollection, CcLinkParamsStore>() {
@Override
@@ -38,6 +42,7 @@ public final class CcLinkParamsProvider implements TransitiveInfoProvider {
private final CcLinkParamsStoreImpl store;
public CcLinkParamsProvider(CcLinkParamsStore store) {
+ super(CC_LINK_PARAMS, ImmutableMap.<String, Object>of());
this.store = new CcLinkParamsStoreImpl(store);
}
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 a6239ff270..6104833c31 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
@@ -168,6 +168,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs();
+ CcLinkParamsProvider ccLinkParamsProvider = new CcLinkParamsProvider(ccLinkParamsStore);
builder
.add(
JavaRuleOutputJarsProvider.class,
@@ -190,7 +191,8 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
JavaCompilationArgsProvider.create(
javaCompilationArgs, recursiveJavaCompilationArgs,
compileTimeJavaDepArtifacts, runTimeJavaDepArtifacts))
- .add(CcLinkParamsProvider.class, new CcLinkParamsProvider(ccLinkParamsStore))
+ .add(CcLinkParamsProvider.class, ccLinkParamsProvider)
+ .addNativeDeclaredProvider(ccLinkParamsProvider)
.add(
JavaNativeLibraryProvider.class,
new JavaNativeLibraryProvider(transitiveJavaNativeLibraries))