Reinstate mutable maps, again.
--
MOS_MIGRATED_REVID=114860576
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
index 01d4bc3..f99f598 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
@@ -15,7 +15,6 @@
package com.google.devtools.build.lib.rules;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Attribute;
@@ -34,6 +33,7 @@
import com.google.devtools.build.lib.syntax.FuncallExpression;
import com.google.devtools.build.lib.syntax.Runtime;
import com.google.devtools.build.lib.syntax.SkylarkCallbackFunction;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
import com.google.devtools.build.lib.syntax.Type;
@@ -42,7 +42,6 @@
import com.google.devtools.build.lib.util.FileTypeSet;
import java.util.List;
-import java.util.Map;
/**
* A helper class to provide Attr module in Skylark.
@@ -106,12 +105,12 @@
"the list of allowed values for the attribute. An error is raised if any other "
+ "value is given.";
- private static boolean containsNonNoneKey(Map<String, Object> arguments, String key) {
+ private static boolean containsNonNoneKey(SkylarkDict<String, Object> arguments, String key) {
return arguments.containsKey(key) && arguments.get(key) != Runtime.NONE;
}
private static Attribute.Builder<?> createAttribute(
- Type<?> type, Map<String, Object> arguments, FuncallExpression ast, Environment env)
+ Type<?> type, SkylarkDict<String, Object> arguments, FuncallExpression ast, Environment env)
throws EvalException, ConversionException {
// We use an empty name now so that we can set it later.
// This trick makes sense only in the context of Skylark (builtin rules should not use it).
@@ -192,7 +191,7 @@
}
private static Descriptor createAttrDescriptor(
- Map<String, Object> kwargs, Type<?> type, FuncallExpression ast, Environment env)
+ SkylarkDict<String, Object> kwargs, Type<?> type, FuncallExpression ast, Environment env)
throws EvalException {
try {
return new Descriptor(createAttribute(type, kwargs, ast, env));
@@ -202,7 +201,10 @@
}
private static Descriptor createNonconfigurableAttrDescriptor(
- Map<String, Object> kwargs, Type<?> type, String whyNotConfigurable, FuncallExpression ast,
+ SkylarkDict<String, Object> kwargs,
+ Type<?> type,
+ String whyNotConfigurable,
+ FuncallExpression ast,
Environment env) throws EvalException {
try {
return new Descriptor(
@@ -242,15 +244,15 @@
public Descriptor invoke(
Integer defaultInt,
Boolean mandatory,
- SkylarkList values,
+ SkylarkList<?> values,
FuncallExpression ast,
Environment env)
throws EvalException {
// TODO(bazel-team): Replace literal strings with constants.
env.checkLoadingPhase("attr.int", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultInt, MANDATORY_ARG, mandatory, VALUES_ARG, values),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultInt, MANDATORY_ARG, mandatory, VALUES_ARG, values),
Type.INTEGER,
ast,
env);
@@ -287,14 +289,14 @@
public Descriptor invoke(
String defaultString,
Boolean mandatory,
- SkylarkList values,
+ SkylarkList<?> values,
FuncallExpression ast,
Environment env)
throws EvalException {
env.checkLoadingPhase("attr.string", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultString, MANDATORY_ARG, mandatory, VALUES_ARG, values),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultString, MANDATORY_ARG, mandatory, VALUES_ARG, values),
Type.STRING,
ast,
env);
@@ -372,7 +374,7 @@
Boolean executable,
Object allowFiles,
Boolean mandatory,
- SkylarkList providers,
+ SkylarkList<?> providers,
Object allowRules,
Boolean singleFile,
Object cfg,
@@ -381,7 +383,8 @@
throws EvalException {
env.checkLoadingPhase("attr.label", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
+ EvalUtils.<String, Object>optionMap(
+ env,
DEFAULT_ARG,
defaultO,
EXECUTABLE_ARG,
@@ -428,7 +431,7 @@
private static BuiltinFunction stringList =
new BuiltinFunction("string_list") {
public Descriptor invoke(
- SkylarkList defaultList,
+ SkylarkList<?> defaultList,
Boolean mandatory,
Boolean nonEmpty,
FuncallExpression ast,
@@ -436,8 +439,14 @@
throws EvalException {
env.checkLoadingPhase("attr.string_list", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultList, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
+ EvalUtils.<String, Object>optionMap(
+ env,
+ DEFAULT_ARG,
+ defaultList,
+ MANDATORY_ARG,
+ mandatory,
+ NON_EMPTY_ARG,
+ nonEmpty),
Type.STRING_LIST,
ast,
env);
@@ -468,7 +477,7 @@
private static BuiltinFunction intList =
new BuiltinFunction("int_list") {
public Descriptor invoke(
- SkylarkList defaultList,
+ SkylarkList<?> defaultList,
Boolean mandatory,
Boolean nonEmpty,
FuncallExpression ast,
@@ -476,8 +485,14 @@
throws EvalException {
env.checkLoadingPhase("attr.int_list", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultList, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
+ EvalUtils.<String, Object>optionMap(
+ env,
+ DEFAULT_ARG,
+ defaultList,
+ MANDATORY_ARG,
+ mandatory,
+ NON_EMPTY_ARG,
+ nonEmpty),
Type.INTEGER_LIST,
ast,
env);
@@ -558,18 +573,20 @@
Object defaultList,
Object allowFiles,
Object allowRules,
- SkylarkList providers,
- SkylarkList flags,
+ SkylarkList<?> providers,
+ SkylarkList<?> flags,
Boolean mandatory,
Boolean nonEmpty,
Object cfg,
- SkylarkList aspects,
+ SkylarkList<?> aspects,
FuncallExpression ast,
Environment env)
throws EvalException {
env.checkLoadingPhase("attr.label_list", ast.getLocation());
- ImmutableMap<String, Object> kwargs = EvalUtils.optionMap(
- DEFAULT_ARG, defaultList,
+ SkylarkDict<String, Object> kwargs = EvalUtils.<String, Object>optionMap(
+ env,
+ DEFAULT_ARG,
+ defaultList,
ALLOW_FILES_ARG,
allowFiles,
ALLOW_RULES_ARG,
@@ -587,25 +604,13 @@
try {
Attribute.Builder<?> attribute = createAttribute(
BuildType.LABEL_LIST, kwargs, ast, env);
-
- ImmutableList<SkylarkAspect> skylarkAspects = getSkylarkAspects(aspects);
+ ImmutableList<SkylarkAspect> skylarkAspects =
+ ImmutableList.copyOf(aspects.getContents(SkylarkAspect.class, "aspects"));
return new Descriptor(attribute, skylarkAspects);
- } catch (ConversionException e) {
- throw new EvalException(ast.getLocation(), e.getMessage());
+ } catch (EvalException e) {
+ throw new EvalException(ast.getLocation(), e.getMessage(), e);
}
}
-
- protected ImmutableList<SkylarkAspect> getSkylarkAspects(SkylarkList aspects)
- throws ConversionException {
- ImmutableList.Builder<SkylarkAspect> aspectBuilder = ImmutableList.builder();
- for (Object aspect : aspects) {
- if (!(aspect instanceof SkylarkAspect)) {
- throw new ConversionException("Expected a list of aspects for 'aspects'");
- }
- aspectBuilder.add((SkylarkAspect) aspect);
- }
- return aspectBuilder.build();
- }
};
@SkylarkSignature(
@@ -628,7 +633,8 @@
throws EvalException {
env.checkLoadingPhase("attr.bool", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
Type.BOOLEAN,
ast,
env);
@@ -664,7 +670,8 @@
throws EvalException {
env.checkLoadingPhase("attr.output", ast.getLocation());
return createNonconfigurableAttrDescriptor(
- EvalUtils.optionMap(DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
BuildType.OUTPUT,
"output paths are part of the static graph structure",
ast,
@@ -706,8 +713,14 @@
throws EvalException {
env.checkLoadingPhase("attr.output_list", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultList, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
+ EvalUtils.<String, Object>optionMap(
+ env,
+ DEFAULT_ARG,
+ defaultList,
+ MANDATORY_ARG,
+ mandatory,
+ NON_EMPTY_ARG,
+ nonEmpty),
BuildType.OUTPUT_LIST,
ast,
env);
@@ -722,7 +735,7 @@
objectType = SkylarkAttr.class,
returnType = Descriptor.class,
optionalNamedOnly = {
- @Param(name = DEFAULT_ARG, type = Map.class, defaultValue = "{}", doc = DEFAULT_DOC),
+ @Param(name = DEFAULT_ARG, type = SkylarkDict.class, defaultValue = "{}", doc = DEFAULT_DOC),
@Param(name = MANDATORY_ARG, type = Boolean.class, defaultValue = "False", doc = MANDATORY_DOC
),
@Param(name = NON_EMPTY_ARG, type = Boolean.class, defaultValue = "False", doc = NON_EMPTY_DOC
@@ -734,7 +747,7 @@
private static BuiltinFunction stringDict =
new BuiltinFunction("string_dict") {
public Descriptor invoke(
- Map<?, ?> defaultO,
+ SkylarkDict<?, ?> defaultO,
Boolean mandatory,
Boolean nonEmpty,
FuncallExpression ast,
@@ -742,8 +755,8 @@
throws EvalException {
env.checkLoadingPhase("attr.string_dict", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
Type.STRING_DICT,
ast,
env);
@@ -758,7 +771,7 @@
objectType = SkylarkAttr.class,
returnType = Descriptor.class,
optionalNamedOnly = {
- @Param(name = DEFAULT_ARG, type = Map.class, defaultValue = "{}", doc = DEFAULT_DOC),
+ @Param(name = DEFAULT_ARG, type = SkylarkDict.class, defaultValue = "{}", doc = DEFAULT_DOC),
@Param(name = MANDATORY_ARG, type = Boolean.class, defaultValue = "False", doc = MANDATORY_DOC
),
@Param(name = NON_EMPTY_ARG, type = Boolean.class, defaultValue = "False", doc = NON_EMPTY_DOC
@@ -770,7 +783,7 @@
private static BuiltinFunction stringListDict =
new BuiltinFunction("string_list_dict") {
public Descriptor invoke(
- Map<?, ?> defaultO,
+ SkylarkDict<?, ?> defaultO,
Boolean mandatory,
Boolean nonEmpty,
FuncallExpression ast,
@@ -778,8 +791,8 @@
throws EvalException {
env.checkLoadingPhase("attr.string_list_dict", ast.getLocation());
return createAttrDescriptor(
- EvalUtils.optionMap(
- DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory, NON_EMPTY_ARG, nonEmpty),
Type.STRING_LIST_DICT,
ast,
env);
@@ -808,7 +821,8 @@
throws EvalException {
env.checkLoadingPhase("attr.license", ast.getLocation());
return createNonconfigurableAttrDescriptor(
- EvalUtils.optionMap(DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
+ EvalUtils.<String, Object>optionMap(
+ env, DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
BuildType.LICENSE,
"loading phase license checking logic assumes non-configurable values",
ast,
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 377652b..d9ce457 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
@@ -70,6 +70,7 @@
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.packages.TestSize;
import com.google.devtools.build.lib.rules.SkylarkAttr.Descriptor;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature;
import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature.Param;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
@@ -86,6 +87,7 @@
import com.google.devtools.build.lib.syntax.Printer;
import com.google.devtools.build.lib.syntax.Runtime;
import com.google.devtools.build.lib.syntax.SkylarkCallbackFunction;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
@@ -269,7 +271,8 @@
doc = "Whether this rule is a test rule. "
+ "If True, the rule must end with <code>_test</code> (otherwise it must not), "
+ "and there must be an action that generates <code>ctx.outputs.executable</code>."),
- @Param(name = "attrs", type = Map.class, noneable = true, defaultValue = "None", doc =
+ @Param(name = "attrs", type = SkylarkDict.class, noneable = true, defaultValue = "None",
+ doc =
"dictionary to declare all the attributes of the rule. It maps from an attribute name "
+ "to an attribute object (see <a href=\"attr.html\">attr</a> module). "
+ "Attributes starting with <code>_</code> are private, and can be used to add "
@@ -278,7 +281,7 @@
+ "<code>deprecation</code>, <code>tags</code>, <code>testonly</code>, and "
+ "<code>features</code> are implicitly added and might be overriden."),
// TODO(bazel-team): need to give the types of these builtin attributes
- @Param(name = "outputs", type = Map.class, callbackEnabled = true, noneable = true,
+ @Param(name = "outputs", type = SkylarkDict.class, callbackEnabled = true, noneable = true,
defaultValue = "None", doc = "outputs of this rule. "
+ "It is a dictionary mapping from string to a template name. "
+ "For example: <code>{\"ext\": \"%{name}.ext\"}</code>. <br>"
@@ -407,7 +410,7 @@
doc = "List of attribute names. The aspect propagates along dependencies specified by "
+ " attributes of a target with this name"
),
- @Param(name = "attrs", type = Map.class, noneable = true, defaultValue = "None",
+ @Param(name = "attrs", type = SkylarkDict.class, noneable = true, defaultValue = "None",
doc = "dictionary to declare all the attributes of the aspect. "
+ "It maps from an attribute name to an attribute object "
+ "(see <a href=\"attr.html\">attr</a> module). "
@@ -751,6 +754,7 @@
/**
* A Skylark value that is a result of 'aspect(..)' function call.
*/
+ @SkylarkModule(name = "aspect", doc = "", documented = false)
public static final class SkylarkAspect implements SkylarkValue {
private final BaseFunction implementation;
private final ImmutableList<String> attributeAspects;
@@ -893,10 +897,12 @@
return aspectDefinition;
}
+ @Override
public Label getExtensionLabel() {
return extensionLabel;
}
+ @Override
public String getExportedName() {
return exportedName;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
index 309e68a..a264278 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
@@ -234,7 +234,8 @@
Location insLoc = insStruct.getCreationLoc();
FileTypeSet fileTypeSet = FileTypeSet.ANY_FILE;
if (insStruct.getKeys().contains("extensions")) {
- List<String> exts = cast("extensions", insStruct, List.class, String.class, insLoc);
+ List<String> exts = cast(
+ "extensions", insStruct, SkylarkList.class, String.class, insLoc);
if (exts.isEmpty()) {
fileTypeSet = FileTypeSet.NO_FILE;
} else {
@@ -248,12 +249,12 @@
List<String> dependencyAttributes = Collections.emptyList();
if (insStruct.getKeys().contains("dependency_attributes")) {
dependencyAttributes =
- cast("dependency_attributes", insStruct, List.class, String.class, insLoc);
+ cast("dependency_attributes", insStruct, SkylarkList.class, String.class, insLoc);
}
List<String> sourceAttributes = Collections.emptyList();
if (insStruct.getKeys().contains("source_attributes")) {
sourceAttributes =
- cast("source_attributes", insStruct, List.class, String.class, insLoc);
+ cast("source_attributes", insStruct, SkylarkList.class, String.class, insLoc);
}
InstrumentationSpec instrumentationSpec =
new InstrumentationSpec(fileTypeSet)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
index 81839d0..7fe48a0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -52,6 +52,7 @@
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.FuncallExpression.FuncallException;
import com.google.devtools.build.lib.syntax.Runtime;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
import com.google.devtools.build.lib.syntax.SkylarkType;
@@ -152,7 +153,7 @@
private final FragmentCollection hostFragments;
- private final ImmutableMap<String, String> makeVariables;
+ private final SkylarkDict<String, String> makeVariables;
private final SkylarkRuleAttributesCollection attributesCollection;
private final SkylarkRuleAttributesCollection ruleAttributesCollection;
@@ -515,7 +516,7 @@
@SkylarkCallable(structField = true,
doc = "Dictionary (String to String) of configuration variables")
- public ImmutableMap<String, String> var() {
+ public SkylarkDict<String, String> var() {
return makeVariables;
}
@@ -525,7 +526,7 @@
}
@SkylarkCallable(doc = "Splits a shell command to a list of tokens.", documented = false)
- public MutableList tokenize(String optionString) throws FuncallException {
+ public MutableList<String> tokenize(String optionString) throws FuncallException {
List<String> options = new ArrayList<>();
try {
ShellUtils.tokenize(options, optionString);
@@ -542,7 +543,8 @@
+ "Deprecated.",
documented = false
)
- public String expand(@Nullable String expression, SkylarkList artifacts, Label labelResolver)
+ public String expand(
+ @Nullable String expression, SkylarkList<Object> artifacts, Label labelResolver)
throws EvalException, FuncallException {
try {
Map<Label, Iterable<Artifact>> labelMap = new HashMap<>();
@@ -594,7 +596,7 @@
}
@SkylarkCallable(documented = false)
- public boolean checkPlaceholders(String template, SkylarkList allowedPlaceholders)
+ public boolean checkPlaceholders(String template, SkylarkList<Object> allowedPlaceholders)
throws EvalException {
List<String> actualPlaceHolders = new LinkedList<>();
Set<String> allowedPlaceholderSet =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
index 30422af..ba8852d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
@@ -13,8 +13,6 @@
// limitations under the License.
package com.google.devtools.build.lib.rules;
-import static com.google.devtools.build.lib.syntax.SkylarkType.castMap;
-
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -52,6 +50,7 @@
import com.google.devtools.build.lib.syntax.EvalUtils;
import com.google.devtools.build.lib.syntax.Printer;
import com.google.devtools.build.lib.syntax.Runtime;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
@@ -143,8 +142,8 @@
defaultValue = "None",
doc =
"shell command to execute. It is usually preferable to "
- + "use <code>executable</code> instead. Arguments are available with "
- + "<code>$1</code>, <code>$2</code>, etc."
+ + "use <code>executable</code> instead. "
+ + "Arguments are available with <code>$1</code>, <code>$2</code>, etc."
),
@Param(
name = "progress_message",
@@ -163,14 +162,14 @@
),
@Param(
name = "env",
- type = Map.class,
+ type = SkylarkDict.class,
noneable = true,
defaultValue = "None",
doc = "sets the dictionary of environment variables"
),
@Param(
name = "execution_requirements",
- type = Map.class,
+ type = SkylarkDict.class,
noneable = true,
defaultValue = "None",
doc =
@@ -179,7 +178,7 @@
),
@Param(
name = "input_manifests",
- type = Map.class,
+ type = SkylarkDict.class,
noneable = true,
defaultValue = "None",
doc =
@@ -272,7 +271,9 @@
}
if (envUnchecked != Runtime.NONE) {
builder.setEnvironment(
- ImmutableMap.copyOf(castMap(envUnchecked, String.class, String.class, "env")));
+ ImmutableMap.copyOf(
+ SkylarkDict.castSkylarkDictOrNoneToDict(
+ envUnchecked, String.class, String.class, "env")));
}
if (progressMessage != Runtime.NONE) {
builder.setProgressMessage((String) progressMessage);
@@ -283,7 +284,7 @@
if (executionRequirementsUnchecked != Runtime.NONE) {
builder.setExecutionInfo(
ImmutableMap.copyOf(
- castMap(
+ SkylarkDict.castSkylarkDictOrNoneToDict(
executionRequirementsUnchecked,
String.class,
String.class,
@@ -291,12 +292,12 @@
}
if (inputManifestsUnchecked != Runtime.NONE) {
for (Map.Entry<PathFragment, Artifact> entry :
- castMap(
- inputManifestsUnchecked,
- PathFragment.class,
- Artifact.class,
- "input manifest file map")
- .entrySet()) {
+ SkylarkDict.castSkylarkDictOrNoneToDict(
+ inputManifestsUnchecked,
+ PathFragment.class,
+ Artifact.class,
+ "input manifest file map")
+ .entrySet()) {
builder.addInputManifest(entry.getValue(), entry.getKey());
}
}
@@ -459,7 +460,7 @@
doc = "the template file"),
@Param(name = "output", type = Artifact.class,
doc = "the output file"),
- @Param(name = "substitutions", type = Map.class,
+ @Param(name = "substitutions", type = SkylarkDict.class,
doc = "substitutions to make when expanding the template")},
optionalNamedOnly = {
@Param(name = "executable", type = Boolean.class,
@@ -467,23 +468,23 @@
private static final BuiltinFunction createTemplateAction =
new BuiltinFunction("template_action", Arrays.<Object>asList(false)) {
public TemplateExpansionAction invoke(SkylarkRuleContext ctx, Artifact template,
- Artifact output, Map<?, ?> substitutionsUnchecked, Boolean executable)
+ Artifact output, SkylarkDict<?, ?> substitutionsUnchecked, Boolean executable)
throws EvalException, ConversionException {
- ImmutableList.Builder<Substitution> substitutions = ImmutableList.builder();
- for (Map.Entry<String, String> substitution : castMap(
- substitutionsUnchecked, String.class, String.class, "substitutions").entrySet()) {
+ ImmutableList.Builder<Substitution> substitutionsBuilder = ImmutableList.builder();
+ for (Map.Entry<String, String> substitution : substitutionsUnchecked.getContents(
+ String.class, String.class, "substitutions").entrySet()) {
// ParserInputSource.create(Path) uses Latin1 when reading BUILD files, which might
// contain UTF-8 encoded symbols as part of template substitution.
// As a quick fix, the substitution values are corrected before being passed on.
// In the long term, fixing ParserInputSource.create(Path) would be a better approach.
- substitutions.add(Substitution.of(
+ substitutionsBuilder.add(Substitution.of(
substitution.getKey(), convertLatin1ToUtf8(substitution.getValue())));
}
TemplateExpansionAction action = new TemplateExpansionAction(
ctx.getRuleContext().getActionOwner(),
template,
output,
- substitutions.build(),
+ substitutionsBuilder.build(),
executable);
ctx.getRuleContext().registerAction(action);
return action;
@@ -574,7 +575,8 @@
// TODO(bazel-team): find a better way to typecheck this argument.
@SuppressWarnings("unchecked")
- private static Map<Label, Iterable<Artifact>> checkLabelDict(Map<?, ?> labelDict, Location loc)
+ private static Map<Label, Iterable<Artifact>> checkLabelDict(
+ Map<?, ?> labelDict, Location loc)
throws EvalException {
for (Map.Entry<?, ?> entry : labelDict.entrySet()) {
Object key = entry.getKey();
@@ -633,7 +635,7 @@
),
@Param(
name = "make_variables",
- type = Map.class, // dict(string, string)
+ type = SkylarkDict.class, // dict(string, string)
noneable = true,
doc = "make variables to expand, or None"
),
@@ -646,7 +648,7 @@
),
@Param(
name = "label_dict",
- type = Map.class,
+ type = SkylarkDict.class,
defaultValue = "{}",
doc =
"dictionary of resolved labels and the corresponding list of Files "
@@ -654,7 +656,7 @@
),
@Param(
name = "execution_requirements",
- type = Map.class,
+ type = SkylarkDict.class,
defaultValue = "{}",
doc =
"information for scheduling the action to resolve this command."
@@ -666,15 +668,15 @@
private static final BuiltinFunction resolveCommand =
new BuiltinFunction("resolve_command") {
@SuppressWarnings("unchecked")
- public Tuple invoke(
+ public Tuple<Object> invoke(
SkylarkRuleContext ctx,
String command,
Object attributeUnchecked,
Boolean expandLocations,
Object makeVariablesUnchecked,
SkylarkList tools,
- Map<?, ?> labelDictUnchecked,
- Map<?, ?> executionRequirementsUnchecked,
+ SkylarkDict<?, ?> labelDictUnchecked,
+ SkylarkDict<?, ?> executionRequirementsUnchecked,
Location loc,
Environment env)
throws ConversionException, EvalException {
@@ -700,12 +702,11 @@
inputs.addAll(helper.getResolvedTools());
ImmutableMap<String, String> executionRequirements = ImmutableMap.copyOf(
- castMap(
+ SkylarkDict.castSkylarkDictOrNoneToDict(
executionRequirementsUnchecked,
String.class,
String.class,
"execution_requirements"));
-
List<String> argv =
helper.buildCommandLine(command, inputs, SCRIPT_SUFFIX, executionRequirements);
return Tuple.<Object>of(