diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
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; +} |