aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-09-25 20:24:24 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-09-26 07:48:01 +0000
commit94b2c8889817359705710a544d850987d535135d (patch)
tree75b78821de62860898f0d98dc1ab47d222392221 /src/main/java
parent8d76f0729ba3b6f12cf3546ab19a3437991315e3 (diff)
Native declared providers are automatically exported.
-- MOS_MIGRATED_REVID=134221884
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java71
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java2
4 files changed, 63 insertions, 14 deletions
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 c3b991d566..7666e2c6d2 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
@@ -29,7 +29,7 @@ import java.util.Objects;
import javax.annotation.Nullable;
/**
- * A constructor for {@link SkylarkClassObject}.
+ * Declared Provider (a constructor for {@link SkylarkClassObject}).
*/
@SkylarkModule(name = "provider",
doc = "A constructor for simple value objects. "
@@ -41,7 +41,7 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
* "struct" function.
*/
public static final SkylarkClassObjectConstructor STRUCT =
- new SkylarkClassObjectConstructor("struct");
+ createNative("struct");
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
@@ -50,12 +50,29 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
@Nullable
private Key key;
- public SkylarkClassObjectConstructor(String name, Location location) {
+ private SkylarkClassObjectConstructor(String name, Location location) {
super(name, SIGNATURE, location);
}
- public SkylarkClassObjectConstructor(String name) {
+ private SkylarkClassObjectConstructor(String name) {
this(name, Location.BUILTIN);
+ key = new NativeKey();
+ }
+
+ /**
+ * Create a native Declared Provider({@link SkylarkClassObject} constructor)
+ */
+ public static SkylarkClassObjectConstructor createNative(String name) {
+ return new SkylarkClassObjectConstructor(name);
+ }
+
+ /**
+ * Create a Skylark-defined Declared Provider({@link SkylarkClassObject} constructor)
+ *
+ * Needs to be exported later.
+ */
+ public static SkylarkClassObjectConstructor createSkylark(String name, Location location) {
+ return new SkylarkClassObjectConstructor(name, location);
}
@Override
@@ -85,13 +102,13 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
}
public String getPrintableName() {
- return key != null ? key.exportedName : getName();
+ return key != null ? key.getExportedName() : getName();
}
@Override
public void export(Label extensionLabel, String exportedName) {
Preconditions.checkState(!isExported());
- this.key = new Key(extensionLabel, exportedName);
+ this.key = new SkylarkKey(extensionLabel, exportedName);
}
@Override
@@ -104,16 +121,28 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
return other == this;
}
+
+ /**
+ * A representation of {@link SkylarkClassObjectConstructor}.
+ */
+ // todo(vladmos,dslomov): when we allow declared providers in `requiredProviders`,
+ // we will need to serialize this somehow.
+ public abstract static class Key {
+ private Key() {}
+
+ public abstract String getExportedName();
+ }
+
/**
- * A serializable representation of {@link SkylarkClassObjectConstructor}
+ * A serializable representation of Skylark-defined {@link SkylarkClassObjectConstructor}
* that uniquely identifies all {@link SkylarkClassObjectConstructor}s that
* are exposed to SkyFrame.
*/
- public static class Key {
+ public static class SkylarkKey extends Key {
private final Label extensionLabel;
private final String exportedName;
- public Key(Label extensionLabel, String exportedName) {
+ public SkylarkKey(Label extensionLabel, String exportedName) {
this.extensionLabel = Preconditions.checkNotNull(extensionLabel);
this.exportedName = Preconditions.checkNotNull(exportedName);
}
@@ -122,6 +151,7 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
return extensionLabel;
}
+ @Override
public String getExportedName() {
return exportedName;
}
@@ -137,12 +167,31 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements
return true;
}
- if (!(obj instanceof Key)) {
+ if (!(obj instanceof SkylarkKey)) {
return false;
}
- Key other = (Key) obj;
+ SkylarkKey other = (SkylarkKey) obj;
return Objects.equals(this.extensionLabel, other.extensionLabel)
&& Objects.equals(this.exportedName, other.exportedName);
}
}
+
+ /**
+ * A representation of {@link SkylarkClassObjectConstructor} defined in native code.
+ */
+ // todo(vladmos,dslomov): when we allow declared providers in `requiredProviders`,
+ // we will need to serialize this somehow.
+ public final class NativeKey extends Key {
+ private NativeKey() {
+ }
+
+ @Override
+ public String getExportedName() {
+ return SkylarkClassObjectConstructor.this.getName();
+ }
+
+ public SkylarkClassObjectConstructor getConstructor() {
+ return SkylarkClassObjectConstructor.this;
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index a88e096667..4144ea6704 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -211,7 +211,7 @@ public class SkylarkRuleClassFunctions {
private static final BuiltinFunction provider =
new BuiltinFunction("provider") {
public SkylarkClassObjectConstructor invoke(Location location) {
- return new SkylarkClassObjectConstructor(
+ return SkylarkClassObjectConstructor.createSkylark(
"<no name>", // name is set on export.
location);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java b/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java
index 19b940ad03..dfedd90cf2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/Platform.java
@@ -213,7 +213,7 @@ public enum Platform {
/** Returns a Skylark struct that contains the instances of this enum. */
public static SkylarkClassObject getSkylarkStruct() {
SkylarkClassObjectConstructor constructor =
- new SkylarkClassObjectConstructor("platform_types");
+ SkylarkClassObjectConstructor.createNative("platform_types");
HashMap<String, Object> fields = new HashMap<>();
for (PlatformType type : values()) {
fields.put(type.skylarkKey, type);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 40ed2b1c73..de94241127 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -418,7 +418,7 @@ public final class ObjcProvider extends SkylarkClassObject implements Transitive
private final ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems;
private static final SkylarkClassObjectConstructor OBJC_PROVIDER =
- new SkylarkClassObjectConstructor("objc_provider");
+ SkylarkClassObjectConstructor.createNative("objc_provider");
private ObjcProvider(
ImmutableMap<Key<?>, NestedSet<?>> items,