RELNOTES[NEW]: Make actions.args() object chainable. Fixes https://github.com/bazelbuild/bazel/issues/7352 PiperOrigin-RevId: 233446566
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java index 8ab3d30..b794c48 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
@@ -62,7 +62,6 @@ import com.google.devtools.build.lib.syntax.FunctionSignature.Shape; import com.google.devtools.build.lib.syntax.Mutability; import com.google.devtools.build.lib.syntax.Runtime; -import com.google.devtools.build.lib.syntax.Runtime.NoneType; import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkMutable; @@ -604,7 +603,7 @@ private boolean useAlways; @Override - public NoneType addArgument( + public CommandLineArgsApi addArgument( Object argNameOrValue, Object value, Object format, @@ -670,11 +669,11 @@ mapFn != Runtime.NONE ? (BaseFunction) mapFn : null, loc); } - return Runtime.NONE; + return this; } @Override - public NoneType addAll( + public CommandLineArgsApi addAll( Object argNameOrValue, Object values, Object mapEach, @@ -714,11 +713,11 @@ : (Boolean) expandDirectories, terminateWith != Runtime.NONE ? (String) terminateWith : null, loc); - return Runtime.NONE; + return this; } @Override - public NoneType addJoined( + public CommandLineArgsApi addJoined( Object argNameOrValue, Object values, String joinWith, @@ -758,7 +757,7 @@ : (Boolean) expandDirectories, /* terminateWith= */ null, loc); - return Runtime.NONE; + return this; } private void addVectorArg( @@ -889,21 +888,26 @@ } @Override - public void useParamsFile(String paramFileArg, Boolean useAlways) throws EvalException { + public CommandLineArgsApi useParamsFile(String paramFileArg, Boolean useAlways) + throws EvalException { if (isImmutable()) { throw new EvalException(null, "cannot modify frozen value"); } if (!SingleStringArgFormatter.isValid(paramFileArg)) { throw new EvalException( null, - "Invalid value for parameter \"param_file_arg\": Expected string with a single \"%s\""); + String.format( + "Invalid value for parameter \"param_file_arg\": " + + "Expected string with a single \"%s\"", + paramFileArg)); } this.flagFormatString = paramFileArg; this.useAlways = useAlways; + return this; } @Override - public void setParamFileFormat(String format) throws EvalException { + public CommandLineArgsApi setParamFileFormat(String format) throws EvalException { if (isImmutable()) { throw new EvalException(null, "cannot modify frozen value"); } @@ -921,6 +925,7 @@ "Invalid value for parameter \"format\": Expected one of \"shell\", \"multiline\""); } this.parameterFileType = parameterFileType; + return this; } private Args(@Nullable Mutability mutability, SkylarkSemantics skylarkSemantics) {
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java index 4164e21..ddde04b 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java
@@ -23,7 +23,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; import com.google.devtools.build.lib.syntax.BaseFunction; import com.google.devtools.build.lib.syntax.EvalException; -import com.google.devtools.build.lib.syntax.Runtime; import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; @@ -197,7 +196,7 @@ + "of <code>add_all</code> or <code>add_joined</code> instead.") }, useLocation = true) - public Runtime.NoneType addArgument( + public CommandLineArgsApi addArgument( Object argNameOrValue, Object value, Object format, @@ -356,7 +355,7 @@ + "its items are filtered)."), }, useLocation = true) - public Runtime.NoneType addAll( + public CommandLineArgsApi addAll( Object argNameOrValue, Object values, Object mapEach, @@ -472,7 +471,7 @@ doc = "Same as for <a href='#add_all.expand_directories'><code>add_all</code></a>.") }, useLocation = true) - public Runtime.NoneType addJoined( + public CommandLineArgsApi addJoined( Object argNameOrValue, Object values, String joinWith, @@ -515,7 +514,8 @@ + "bazel will decide whether the arguments need to be spilled " + "based on your system and arg length.") }) - public void useParamsFile(String paramFileArg, Boolean useAlways) throws EvalException; + public CommandLineArgsApi useParamsFile(String paramFileArg, Boolean useAlways) + throws EvalException; @SkylarkCallable( name = "set_param_file_format", @@ -533,5 +533,5 @@ + "characters</li></ul>" + "<p>The format defaults to \"shell\" if not called.") }) - public void setParamFileFormat(String format) throws EvalException; + public CommandLineArgsApi setParamFileFormat(String format) throws EvalException; }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java index 02aedc7..e225565 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -2402,11 +2402,12 @@ SkylarkRuleContext ruleContext = createRuleContext("//foo:foo"); checkError( ruleContext, - "Invalid value for parameter \"param_file_arg\": Expected string with a single \"%s\"", + "Invalid value for parameter \"param_file_arg\": Expected string with a single \"--file=\"", "args = ruleContext.actions.args()\n" + "args.use_param_file('--file=')"); checkError( ruleContext, - "Invalid value for parameter \"param_file_arg\": Expected string with a single \"%s\"", + "Invalid value for parameter \"param_file_arg\": " + + "Expected string with a single \"--file=%s%s\"", "args = ruleContext.actions.args()\n" + "args.use_param_file('--file=%s%s')"); }