Skip to content

Commit 6751724

Browse files
Wyveraldcopybara-github
authored andcommitted
BEGIN_PUBLIC
Allow StarlarkValue#str to access StarlarkSemantics This allows us to alter the behavior of `str(some_starlark_value)` depending on flags. See child CL for an example. This involves adding the StarlarkSemantics argument to a rather long list of call sites and implementors, but it helps in the end to clarify that stringification is really dependent on starlark semantics. END_PUBLIC Work towards #15916 PiperOrigin-RevId: 462564920 Change-Id: I1733424a5657e54cb19f117b8b5dc7af76ca0842
1 parent f069347 commit 6751724

28 files changed

+142
-116
lines changed

src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import net.starlark.java.eval.Dict;
5252
import net.starlark.java.eval.Printer;
5353
import net.starlark.java.eval.Starlark;
54+
import net.starlark.java.eval.StarlarkSemantics;
5455

5556
/**
5657
* A {@link com.google.devtools.build.lib.analysis.ConfiguredTarget} that is produced by a rule.
@@ -179,8 +180,9 @@ public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass)
179180

180181
@Override
181182
public String getErrorMessageForUnknownField(String name) {
182-
return Starlark.format(
183-
"%r (rule '%s') doesn't have provider '%s'", this, getRuleClassString(), name);
183+
return String.format(
184+
"%s (rule '%s') doesn't have provider '%s'",
185+
Starlark.repr(this), getRuleClassString(), name);
184186
}
185187

186188
@Override
@@ -218,7 +220,7 @@ public void repr(Printer printer) {
218220
}
219221

220222
@Override
221-
public void debugPrint(Printer printer) {
223+
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
222224
// Show the names of the provider keys that this target propagates.
223225
// Provider key names might potentially be *private* information, and thus a comprehensive
224226
// list of provider keys should not be exposed in any way other than for debug information.

src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintCollection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ public boolean containsKey(StarlarkSemantics semantics, Object key) throws EvalE
252252
// It's easier to use the Starlark repr as a string form, not what AutoValue produces.
253253
@Override
254254
public final String toString() {
255-
return Starlark.str(this);
255+
return Starlark.repr(this);
256256
}
257257

258258
@Override

src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintSettingInfo.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ public int hashCode() {
8888

8989
@Override
9090
public void repr(Printer printer) {
91-
Printer.format(printer, "ConstraintSettingInfo(%s", label.toString());
91+
printer.append("ConstraintSettingInfo(").append(label.toString());
9292
if (defaultConstraintValueLabel != null) {
93-
Printer.format(
94-
printer, ", default_constraint_value=%s", defaultConstraintValueLabel.toString());
93+
printer.append(", default_constraint_value=").append(defaultConstraintValueLabel.toString());
9594
}
9695
printer.append(")");
9796
}

src/main/java/com/google/devtools/build/lib/analysis/platform/ConstraintValueInfo.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,7 @@ public ConfigMatchingProvider configMatchingProvider(PlatformInfo platformInfo)
8989

9090
@Override
9191
public void repr(Printer printer) {
92-
Printer.format(
93-
printer,
94-
"ConstraintValueInfo(setting=%s, %s)",
95-
constraint.label().toString(),
96-
label.toString());
92+
printer.append(String.format("ConstraintValueInfo(setting=%s, %s)", constraint.label(), label));
9793
}
9894

9995
/** Returns a new {@link ConstraintValueInfo} with the given data. */

src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ public ImmutableMap<String, String> execProperties() {
143143

144144
@Override
145145
public void repr(Printer printer) {
146-
Printer.format(
147-
printer, "PlatformInfo(%s, constraints=%s)", label.toString(), constraints.toString());
146+
printer.append(String.format("PlatformInfo(%s, constraints=%s)", label, constraints));
148147
}
149148

150149
/** Returns a new {@link Builder} for creating a fresh {@link PlatformInfo} instance. */

src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainTypeInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public Label typeLabel() {
5454

5555
@Override
5656
public void repr(Printer printer) {
57-
Printer.format(printer, "ToolchainTypeInfo(%s)", typeLabel);
57+
printer.append(String.format("ToolchainTypeInfo(%s)", typeLabel));
5858
}
5959

6060
@Override

src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void repr(Printer printer) {
6969
}
7070

7171
@Override
72-
public void debugPrint(Printer printer) {
72+
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
7373
try {
7474
printer.append(Joiner.on(" ").join(build().arguments()));
7575
} catch (CommandLineExpansionException e) {

src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,9 @@ private static ResolvedEvent resolveBind(Rule rule) {
255255
String name = rule.getName();
256256
Label actual = (Label) rule.getAttr("actual");
257257
String nativeCommand =
258-
Starlark.format("bind(name = %r, actual = %r)", name, actual.getCanonicalForm());
258+
String.format(
259+
"bind(name = %s, actual = %s)",
260+
Starlark.repr(name), Starlark.repr(actual.getCanonicalForm()));
259261

260262
return new ResolvedEvent() {
261263
@Override

src/main/java/com/google/devtools/build/lib/cmdline/Label.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ public void repr(Printer printer) {
619619
}
620620

621621
@Override
622-
public void str(Printer printer) {
622+
public void str(Printer printer, StarlarkSemantics semantics) {
623623
printer.append(getCanonicalForm());
624624
}
625625

src/main/java/com/google/devtools/build/lib/packages/BuildType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ public Map<Label, ValueT> convert(Object x, Object what, LabelConverter labelCon
280280
errorMessage.append(',');
281281
}
282282
errorMessage.append(' ');
283-
errorMessage.str(entry.getKey());
283+
errorMessage.append(entry.getKey().getCanonicalForm());
284284
errorMessage.append(" (as ");
285285
errorMessage.repr(entry.getValue());
286286
errorMessage.append(')');

src/main/java/com/google/devtools/build/lib/query2/cquery/StarlarkOutputFormatterCallback.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public void processOutput(Iterable<KeyedConfiguredTarget> partialResult)
239239
Starlark.fastcall(
240240
thread, this.formatFn, new Object[] {target.getConfiguredTarget()}, NO_ARGS);
241241

242-
addResult(Starlark.str(result));
242+
addResult(Starlark.str(result, thread.getSemantics()));
243243
} catch (EvalException ex) {
244244
eventHandler.handle(
245245
Event.error(

src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingContext.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,23 +275,23 @@ public Sequence<Linkstamp> getLinkstampsForStarlark() {
275275
}
276276

277277
@Override
278-
public void debugPrint(Printer printer) {
278+
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
279279
printer.append("<LinkerInput(owner=");
280280
if (owner == null) {
281281
printer.append("[null owner, uses old create_linking_context API]");
282282
} else {
283-
owner.debugPrint(printer);
283+
owner.debugPrint(printer, semantics);
284284
}
285285
printer.append(", libraries=[");
286286
for (LibraryToLink libraryToLink : libraries) {
287-
libraryToLink.debugPrint(printer);
287+
libraryToLink.debugPrint(printer, semantics);
288288
printer.append(", ");
289289
}
290290
printer.append("], userLinkFlags=[");
291291
printer.append(Joiner.on(", ").join(userLinkFlags));
292292
printer.append("], nonCodeInputs=[");
293293
for (Artifact nonCodeInput : nonCodeInputs) {
294-
nonCodeInput.debugPrint(printer);
294+
nonCodeInput.debugPrint(printer, semantics);
295295
printer.append(", ");
296296
}
297297
// TODO(cparsons): Add debug repesentation of linkstamps.
@@ -396,10 +396,10 @@ public String toString() {
396396
@Nullable private final ExtraLinkTimeLibraries extraLinkTimeLibraries;
397397

398398
@Override
399-
public void debugPrint(Printer printer) {
399+
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
400400
printer.append("<CcLinkingContext([");
401401
for (LinkerInput linkerInput : linkerInputs.toList()) {
402-
linkerInput.debugPrint(printer);
402+
linkerInput.debugPrint(printer, semantics);
403403
printer.append(", ");
404404
}
405405
printer.append("])>");

src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureConfigurationForStarlark.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
2121
import com.google.devtools.build.lib.starlarkbuildapi.cpp.FeatureConfigurationApi;
2222
import net.starlark.java.eval.Printer;
23+
import net.starlark.java.eval.StarlarkSemantics;
2324

2425
/**
2526
* Wrapper for {@link FeatureConfiguration}, {@link CppConfiguration}, and {@link BuildOptions}.
@@ -58,7 +59,7 @@ public FeatureConfiguration getFeatureConfiguration() {
5859
}
5960

6061
@Override
61-
public void str(Printer printer) {
62+
public void str(Printer printer, StarlarkSemantics semantics) {
6263
printer.append("<FeatureConfiguration(");
6364
printer.append("ENABLED:");
6465
printer.append(Joiner.on(", ").join(featureConfiguration.getEnabledFeatureNames()));
@@ -68,7 +69,7 @@ public void str(Printer printer) {
6869
}
6970

7071
@Override
71-
public void debugPrint(Printer printer) {
72+
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
7273
printer.append("<FeatureConfiguration(");
7374
printer.append(Joiner.on(", ").join(featureConfiguration.getEnabledFeatureNames()));
7475
printer.append(")>");

src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import net.starlark.java.eval.Printer;
3333
import net.starlark.java.eval.Sequence;
3434
import net.starlark.java.eval.StarlarkList;
35+
import net.starlark.java.eval.StarlarkSemantics;
3536
import net.starlark.java.eval.StarlarkThread;
3637

3738
/** Encapsulates information for linking a library. */
@@ -226,7 +227,7 @@ LinkerInputs.LibraryToLink getInterfaceLibraryToLink() {
226227
abstract boolean getDisableWholeArchive();
227228

228229
@Override
229-
public final void debugPrint(Printer printer) {
230+
public final void debugPrint(Printer printer, StarlarkSemantics semantics) {
230231
printer.append("<LibraryToLink(");
231232
printer.append(
232233
Joiner.on(", ")

src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ private static ResolvedEvent resolve(Rule rule, BlazeDirectories directories) {
8383
} else {
8484
pathArg = Starlark.repr(path);
8585
}
86-
String repr = Starlark.format("local_repository(name = %r, path = %s)", name, pathArg);
86+
String repr =
87+
String.format("local_repository(name = %s, path = %s)", Starlark.repr(name), pathArg);
8788
return new ResolvedEvent() {
8889
@Override
8990
public String getName() {

src/main/java/net/starlark/java/eval/EvalUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,9 @@ static Object binaryOp(TokenKind op, Object x, Object y, StarlarkThread starlark
304304
String xs = (String) x;
305305
try {
306306
if (y instanceof Tuple) {
307-
return Starlark.formatWithList(xs, (Tuple) y);
307+
return Starlark.formatWithList(semantics, xs, (Tuple) y);
308308
} else {
309-
return Starlark.format(xs, y);
309+
return Starlark.format(semantics, xs, y);
310310
}
311311
} catch (IllegalFormatException ex) {
312312
throw new EvalException(ex);

src/main/java/net/starlark/java/eval/FormatParser.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ final class FormatParser {
4646
* @param kwargs Named arguments
4747
* @return The formatted string
4848
*/
49-
String format(String input, List<Object> args, Map<String, Object> kwargs) throws EvalException {
49+
String format(
50+
String input, List<Object> args, Map<String, Object> kwargs, StarlarkSemantics semantics)
51+
throws EvalException {
5052
char[] chars = input.toCharArray();
5153
StringBuilder output = new StringBuilder();
5254
History history = new History();
@@ -56,7 +58,7 @@ String format(String input, List<Object> args, Map<String, Object> kwargs) throw
5658
int advancePos = 0;
5759

5860
if (current == '{') {
59-
advancePos = processOpeningBrace(chars, pos, args, kwargs, history, output);
61+
advancePos = processOpeningBrace(chars, pos, args, kwargs, history, output, semantics);
6062
} else if (current == '}') {
6163
advancePos = processClosingBrace(chars, pos, output);
6264
} else {
@@ -88,7 +90,8 @@ private int processOpeningBrace(
8890
List<Object> args,
8991
Map<String, Object> kwargs,
9092
History history,
91-
StringBuilder output)
93+
StringBuilder output,
94+
StarlarkSemantics semantics)
9295
throws EvalException {
9396
Printer printer = new Printer(output);
9497
if (has(chars, pos + 1, '{')) {
@@ -120,7 +123,7 @@ private int processOpeningBrace(
120123
}
121124

122125
// Format object for output
123-
printer.str(value);
126+
printer.str(value, semantics);
124127

125128
// Advances the current position to the index of the closing brace of the
126129
// replacement field. Due to the definition of the enclosing for() loop,

src/main/java/net/starlark/java/eval/MethodLibrary.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,10 @@ public int len(Object x, StarlarkThread thread) throws EvalException {
285285
"Converts any object to string. This is useful for debugging."
286286
+ "<pre class=\"language-python\">str(\"ab\") == \"ab\"\n"
287287
+ "str(8) == \"8\"</pre>",
288-
parameters = {@Param(name = "x", doc = "The object to convert.")})
289-
public String str(Object x) throws EvalException {
290-
return Starlark.str(x);
288+
parameters = {@Param(name = "x", doc = "The object to convert.")},
289+
useStarlarkThread = true)
290+
public String str(Object x, StarlarkThread thread) throws EvalException {
291+
return Starlark.str(x, thread.getSemantics());
291292
}
292293

293294
@StarlarkMethod(
@@ -679,15 +680,17 @@ public StarlarkList<?> dir(Object object, StarlarkThread thread) throws EvalExce
679680
name = "args",
680681
doc =
681682
"A list of values, formatted with str and joined with spaces, that appear in the"
682-
+ " error message."))
683-
public void fail(Object msg, Object attr, Tuple args) throws EvalException {
683+
+ " error message."),
684+
useStarlarkThread = true)
685+
public void fail(Object msg, Object attr, Tuple args, StarlarkThread thread)
686+
throws EvalException {
684687
List<String> elems = new ArrayList<>();
685688
// msg acts like a leading element of args.
686689
if (msg != Starlark.NONE) {
687-
elems.add(Starlark.str(msg));
690+
elems.add(Starlark.str(msg, thread.getSemantics()));
688691
}
689692
for (Object arg : args) {
690-
elems.add(Starlark.str(arg));
693+
elems.add(Starlark.str(arg, thread.getSemantics()));
691694
}
692695
String str = Joiner.on(" ").join(elems);
693696
if (attr != Starlark.NONE) {
@@ -724,7 +727,7 @@ public void print(String sep, Sequence<?> args, StarlarkThread thread) throws Ev
724727
String separator = "";
725728
for (Object x : args) {
726729
p.append(separator);
727-
p.debugPrint(x);
730+
p.debugPrint(x, thread.getSemantics());
728731
separator = sep;
729732
}
730733
// The PRINT_TEST_MARKER key is used in tests to verify the effects of command-line options.

src/main/java/net/starlark/java/eval/Printer.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@ public final String toString() {
114114
*
115115
* <p>Implementations of StarlarkValue may define their own behavior of {@code debugPrint}.
116116
*/
117-
public Printer debugPrint(Object o) {
117+
public Printer debugPrint(Object o, StarlarkSemantics semantics) {
118118
if (o instanceof StarlarkValue) {
119-
((StarlarkValue) o).debugPrint(this);
119+
((StarlarkValue) o).debugPrint(this, semantics);
120120
return this;
121121
}
122122

123-
return this.str(o);
123+
return this.str(o, semantics);
124124
}
125125

126126
/**
@@ -130,12 +130,12 @@ public Printer debugPrint(Object o) {
130130
*
131131
* <p>Implementations of StarlarkValue may define their own behavior of {@code str}.
132132
*/
133-
public Printer str(Object o) {
133+
public Printer str(Object o, StarlarkSemantics semantics) {
134134
if (o instanceof String) {
135135
return this.append((String) o);
136136

137137
} else if (o instanceof StarlarkValue) {
138-
((StarlarkValue) o).str(this);
138+
((StarlarkValue) o).str(this, semantics);
139139
return this;
140140

141141
} else {
@@ -299,13 +299,15 @@ private void pop() {
299299
* @param arguments an array containing arguments to substitute into the format operators in order
300300
* @throws IllegalFormatException if the format string is invalid or the arguments do not match it
301301
*/
302-
public static void format(Printer printer, String format, Object... arguments) {
303-
formatWithList(printer, format, Arrays.asList(arguments));
302+
public static void format(
303+
Printer printer, StarlarkSemantics semantics, String format, Object... arguments) {
304+
formatWithList(printer, semantics, format, Arrays.asList(arguments));
304305
}
305306

306307
/** Same as {@link #format}, but with a list instead of variadic args. */
307308
@SuppressWarnings("FormatString") // see b/178189609
308-
public static void formatWithList(Printer printer, String pattern, List<?> arguments) {
309+
public static void formatWithList(
310+
Printer printer, StarlarkSemantics semantics, String pattern, List<?> arguments) {
309311
// N.B. MissingFormatWidthException is the only kind of IllegalFormatException
310312
// whose constructor can take and display arbitrary error message, hence its use below.
311313
// TODO(adonovan): this suggests we're using the wrong exception. Throw IAE?
@@ -370,7 +372,7 @@ public static void formatWithList(Printer printer, String pattern, List<?> argum
370372
String.format(
371373
"got %s for '%%%c' format, want int or float", Starlark.type(arg), conv));
372374
}
373-
printer.str(
375+
printer.append(
374376
String.format(
375377
conv == 'd' ? "%d" : conv == 'o' ? "%o" : conv == 'x' ? "%x" : "%X", n));
376378
continue;
@@ -394,15 +396,15 @@ public static void formatWithList(Printer printer, String pattern, List<?> argum
394396
String.format(
395397
"got %s for '%%%c' format, want int or float", Starlark.type(arg), conv));
396398
}
397-
printer.str(StarlarkFloat.format(v, conv));
399+
printer.append(StarlarkFloat.format(v, conv));
398400
continue;
399401

400402
case 'r':
401403
printer.repr(arg);
402404
continue;
403405

404406
case 's':
405-
printer.str(arg);
407+
printer.str(arg, semantics);
406408
continue;
407409

408410
default:

0 commit comments

Comments
 (0)