aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Info.java57
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Provider.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProviderApi.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/StructApi.java75
4 files changed, 124 insertions, 79 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Info.java b/src/main/java/com/google/devtools/build/lib/packages/Info.java
index f1d74ac9cd..775b8e0a80 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Info.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Info.java
@@ -22,11 +22,8 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Ordering;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
@@ -44,16 +41,7 @@ import java.util.Map;
import javax.annotation.Nullable;
/** An instance (in the Skylark sense, not Java) of a {@link Provider}. */
-@SkylarkModule(
- name = "struct",
- category = SkylarkModuleCategory.BUILTIN,
- doc =
- "A generic object with fields. See the global <a href=\"globals.html#struct\"><code>struct"
- + "</code></a> function for more details."
- + "<p>Structs fields cannot be reassigned once the struct is created. Two structs are "
- + "equal if they have the same fields and if corresponding field values are equal."
-)
-public abstract class Info implements ClassObject, SkylarkValue, Serializable {
+public abstract class Info implements ClassObject, StructApi, Serializable {
/** The {@link Provider} that describes the type of this instance. */
private final Provider provider;
@@ -223,26 +211,7 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable {
printer.append(")");
}
- @SkylarkCallable(
- name = "to_proto",
- doc =
- "Creates a text message from the struct parameter. This method only works if all "
- + "struct elements (recursively) are strings, ints, booleans, other structs or a "
- + "list of these types. Quotes and new lines in strings are escaped. "
- + "Keys are iterated in the sorted order. "
- + "Examples:<br><pre class=language-python>"
- + "struct(key=123).to_proto()\n# key: 123\n\n"
- + "struct(key=True).to_proto()\n# key: true\n\n"
- + "struct(key=[1, 2, 3]).to_proto()\n# key: 1\n# key: 2\n# key: 3\n\n"
- + "struct(key='text').to_proto()\n# key: \"text\"\n\n"
- + "struct(key=struct(inner_key='text')).to_proto()\n"
- + "# key {\n# inner_key: \"text\"\n# }\n\n"
- + "struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()\n"
- + "# key {\n# inner_key: 1\n# }\n# key {\n# inner_key: 2\n# }\n\n"
- + "struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()\n"
- + "# key {\n# inner_key {\n# inner_inner_key: \"text\"\n# }\n# }\n</pre>",
- useLocation = true
- )
+ @Override
public String toProto(Location loc) throws EvalException {
StringBuilder sb = new StringBuilder();
printProtoTextMessage(this, sb, 0, loc);
@@ -321,25 +290,7 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable {
return TextFormat.escapeDoubleQuotesAndBackslashes(string).replace("\n", "\\n");
}
- @SkylarkCallable(
- name = "to_json",
- doc =
- "Creates a JSON string from the struct parameter. This method only works if all "
- + "struct elements (recursively) are strings, ints, booleans, other structs or a "
- + "list of these types. Quotes and new lines in strings are escaped. "
- + "Examples:<br><pre class=language-python>"
- + "struct(key=123).to_json()\n# {\"key\":123}\n\n"
- + "struct(key=True).to_json()\n# {\"key\":true}\n\n"
- + "struct(key=[1, 2, 3]).to_json()\n# {\"key\":[1,2,3]}\n\n"
- + "struct(key='text').to_json()\n# {\"key\":\"text\"}\n\n"
- + "struct(key=struct(inner_key='text')).to_json()\n"
- + "# {\"key\":{\"inner_key\":\"text\"}}\n\n"
- + "struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()\n"
- + "# {\"key\":[{\"inner_key\":1},{\"inner_key\":2}]}\n\n"
- + "struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()\n"
- + "# {\"key\":{\"inner_key\":{\"inner_inner_key\":\"text\"}}}\n</pre>",
- useLocation = true
- )
+ @Override
public String toJson(Location loc) throws EvalException {
StringBuilder sb = new StringBuilder();
printJson(this, sb, loc, "struct field", null);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Provider.java b/src/main/java/com/google/devtools/build/lib/packages/Provider.java
index 5afb0fbad6..895240a197 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Provider.java
@@ -15,8 +15,7 @@ package com.google.devtools.build.lib.packages;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.events.Location;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
import com.google.devtools.build.lib.syntax.ClassObject;
/**
@@ -33,31 +32,8 @@ import com.google.devtools.build.lib.syntax.ClassObject;
* <p>Prefer to use {@link Key} as a serializable identifier of {@link Provider}. In particular,
* {@link Key} should be used in all data structures exposed to Skyframe.
*/
-@SkylarkModule(
- name = "Provider",
- doc =
- "A constructor for simple value objects, known as provider instances."
- + "<br>"
- + "This value has a dual purpose:"
- + " <ul>"
- + " <li>It is a function that can be called to construct 'struct'-like values:"
- + "<pre class=\"language-python\">DataInfo = provider()\n"
- + "d = DataInfo(x = 2, y = 3)\n"
- + "print(d.x + d.y) # prints 5</pre>"
- + " Note: Some providers, defined internally, do not allow instance creation"
- + " </li>"
- + " <li>It is a <i>key</i> to access a provider instance on a"
- + " <a href=\"Target.html\">Target</a>"
- + "<pre class=\"language-python\">DataInfo = provider()\n"
- + "def _rule_impl(ctx)\n"
- + " ... ctx.attr.dep[DataInfo]</pre>"
- + " </li>"
- + " </ul>"
- + "Create a new <code>Provider</code> using the "
- + "<a href=\"globals.html#provider\">provider</a> function."
-)
@Immutable
-public interface Provider extends SkylarkValue {
+public interface Provider extends ProviderApi {
/**
* Has this {@link Provider} been exported? All native providers are always exported. Skylark
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProviderApi.java
new file mode 100644
index 0000000000..306cf97f01
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProviderApi.java
@@ -0,0 +1,43 @@
+// Copyright 2017 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;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+
+/** Interface for provider objects (constructors for {@link StructApi} objects). */
+@SkylarkModule(
+ name = "Provider",
+ doc =
+ "A constructor for simple value objects, known as provider instances."
+ + "<br>"
+ + "This value has a dual purpose:"
+ + " <ul>"
+ + " <li>It is a function that can be called to construct 'struct'-like values:"
+ + "<pre class=\"language-python\">DataInfo = provider()\n"
+ + "d = DataInfo(x = 2, y = 3)\n"
+ + "print(d.x + d.y) # prints 5</pre>"
+ + " Note: Some providers, defined internally, do not allow instance creation"
+ + " </li>"
+ + " <li>It is a <i>key</i> to access a provider instance on a"
+ + " <a href=\"Target.html\">Target</a>"
+ + "<pre class=\"language-python\">DataInfo = provider()\n"
+ + "def _rule_impl(ctx)\n"
+ + " ... ctx.attr.dep[DataInfo]</pre>"
+ + " </li>"
+ + " </ul>"
+ + "Create a new <code>Provider</code> using the "
+ + "<a href=\"globals.html#provider\">provider</a> function."
+)
+public interface ProviderApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/StructApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/StructApi.java
new file mode 100644
index 0000000000..5e7b6820ac
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/StructApi.java
@@ -0,0 +1,75 @@
+// 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;
+
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/** Interface for the "struct" object in the build API. */
+@SkylarkModule(
+ name = "struct",
+ category = SkylarkModuleCategory.BUILTIN,
+ doc =
+ "A generic object with fields. See the global <a href=\"globals.html#struct\"><code>struct"
+ + "</code></a> function for more details."
+ + "<p>Structs fields cannot be reassigned once the struct is created. Two structs are "
+ + "equal if they have the same fields and if corresponding field values are equal.")
+public interface StructApi extends SkylarkValue {
+
+ @SkylarkCallable(
+ name = "to_proto",
+ doc =
+ "Creates a text message from the struct parameter. This method only works if all "
+ + "struct elements (recursively) are strings, ints, booleans, other structs or a "
+ + "list of these types. Quotes and new lines in strings are escaped. "
+ + "Keys are iterated in the sorted order. "
+ + "Examples:<br><pre class=language-python>"
+ + "struct(key=123).to_proto()\n# key: 123\n\n"
+ + "struct(key=True).to_proto()\n# key: true\n\n"
+ + "struct(key=[1, 2, 3]).to_proto()\n# key: 1\n# key: 2\n# key: 3\n\n"
+ + "struct(key='text').to_proto()\n# key: \"text\"\n\n"
+ + "struct(key=struct(inner_key='text')).to_proto()\n"
+ + "# key {\n# inner_key: \"text\"\n# }\n\n"
+ + "struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()\n"
+ + "# key {\n# inner_key: 1\n# }\n# key {\n# inner_key: 2\n# }\n\n"
+ + "struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()\n"
+ + "# key {\n# inner_key {\n# inner_inner_key: \"text\"\n# }\n# }\n</pre>",
+ useLocation = true)
+ public String toProto(Location loc) throws EvalException;
+
+ @SkylarkCallable(
+ name = "to_json",
+ doc =
+ "Creates a JSON string from the struct parameter. This method only works if all "
+ + "struct elements (recursively) are strings, ints, booleans, other structs or a "
+ + "list of these types. Quotes and new lines in strings are escaped. "
+ + "Examples:<br><pre class=language-python>"
+ + "struct(key=123).to_json()\n# {\"key\":123}\n\n"
+ + "struct(key=True).to_json()\n# {\"key\":true}\n\n"
+ + "struct(key=[1, 2, 3]).to_json()\n# {\"key\":[1,2,3]}\n\n"
+ + "struct(key='text').to_json()\n# {\"key\":\"text\"}\n\n"
+ + "struct(key=struct(inner_key='text')).to_json()\n"
+ + "# {\"key\":{\"inner_key\":\"text\"}}\n\n"
+ + "struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()\n"
+ + "# {\"key\":[{\"inner_key\":1},{\"inner_key\":2}]}\n\n"
+ + "struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()\n"
+ + "# {\"key\":{\"inner_key\":{\"inner_inner_key\":\"text\"}}}\n</pre>",
+ useLocation = true)
+ public String toJson(Location loc) throws EvalException;
+}