Clean up string representations for labels
If --incompatible_descriptive_string_representations is passed, labels are converted
to strings using `repr` differently: `Label("//package:name")` instead of
`"//package:name"`
This CL doesn't affect representations of other object types but provides the
necessary infrastructure for it.
PiperOrigin-RevId: 160955284
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index 5e9391f..0e1bdab 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -47,8 +47,8 @@
* <p>If a test uses this method, it allows potential subclasses to run the very same test in a
* different mode in subclasses
*/
- protected ModalTestCase newTest() {
- return new BuildTest();
+ protected ModalTestCase newTest(String... skylarkOptions) {
+ return new BuildTest(skylarkOptions);
}
@Test
@@ -601,7 +601,12 @@
return new SkylarkValue() {
@Override
public void repr(SkylarkPrinter printer) {
- printer.append("str marker");
+ printer.append("<str marker>");
+ }
+
+ @Override
+ public void reprLegacy(SkylarkPrinter printer) {
+ printer.append("<str legacy marker>");
}
@Override
@@ -615,36 +620,45 @@
return new Object() {
@Override
public String toString() {
- return "unknown object";
+ return "<unknown object>";
}
};
}
@Test
public void testPercOnObject() throws Exception {
- newTest()
+ newTest("--incompatible_descriptive_string_representations=true")
.update("obj", createObjWithStr())
- .testStatement("'%s' % obj", "str marker");
+ .testStatement("'%s' % obj", "<str marker>");
+ newTest("--incompatible_descriptive_string_representations=false")
+ .update("obj", createObjWithStr())
+ .testStatement("'%s' % obj", "<str legacy marker>");
newTest()
.update("unknown", createUnknownObj())
- .testStatement("'%s' % unknown", "unknown object");
+ .testStatement("'%s' % unknown", "<unknown object>");
}
@Test
public void testPercOnObjectList() throws Exception {
- newTest()
+ newTest("--incompatible_descriptive_string_representations=true")
.update("obj", createObjWithStr())
- .testStatement("'%s %s' % (obj, obj)", "str marker str marker");
+ .testStatement("'%s %s' % (obj, obj)", "<str marker> <str marker>");
+ newTest("--incompatible_descriptive_string_representations=false")
+ .update("obj", createObjWithStr())
+ .testStatement("'%s %s' % (obj, obj)", "<str legacy marker> <str legacy marker>");
newTest()
.update("unknown", createUnknownObj())
- .testStatement("'%s %s' % (unknown, unknown)", "unknown object unknown object");
+ .testStatement("'%s %s' % (unknown, unknown)", "<unknown object> <unknown object>");
}
@Test
public void testPercOnObjectInvalidFormat() throws Exception {
- newTest()
+ newTest("--incompatible_descriptive_string_representations=true")
.update("obj", createObjWithStr())
- .testIfExactError("invalid argument str marker for format pattern %d", "'%d' % obj");
+ .testIfExactError("invalid argument <str marker> for format pattern %d", "'%d' % obj");
+ newTest("--incompatible_descriptive_string_representations=false")
+ .update("obj", createObjWithStr())
+ .testIfExactError("invalid argument <str marker> for format pattern %d", "'%d' % obj");
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java b/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
index fdf4327..f1e5691 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
@@ -21,6 +21,8 @@
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
import java.util.Arrays;
@@ -55,7 +57,7 @@
assertThat(Printer.repr(Runtime.NONE)).isEqualTo("None");
assertThat(Printer.str(Label.parseAbsolute("//x"))).isEqualTo("//x:x");
- assertThat(Printer.repr(Label.parseAbsolute("//x"))).isEqualTo("\"//x:x\"");
+ assertThat(Printer.repr(Label.parseAbsolute("//x"))).isEqualTo("Label(\"//x:x\")");
List<?> list = MutableList.of(null, "foo", "bar");
List<?> tuple = Tuple.of("foo", "bar");
@@ -215,6 +217,14 @@
assertThat(Printer.str(list)).isEqualTo(String.format("[%s]", Joiner.on(", ").join(list)));
}
+ @Test
+ public void testLegacyPrinter() throws Exception {
+ assertThat(new Printer.LegacyPrinter().str(createObjWithStr()).toString())
+ .isEqualTo("<str legacy marker>");
+ assertThat(new Printer.LegacyPrinter().repr(createObjWithStr()).toString())
+ .isEqualTo("<repr legacy marker>");
+ }
+
private String printListWithLimit(List<?> list) {
return printList(list, Printer.SUGGESTED_CRITICAL_LIST_ELEMENTS_COUNT,
Printer.SUGGESTED_CRITICAL_LIST_ELEMENTS_STRING_LENGTH);
@@ -224,4 +234,33 @@
return Printer.printAbbreviatedList(
list, "[", ", ", "]", "", criticalElementsCount, criticalStringLength);
}
+
+ private SkylarkValue createObjWithStr() {
+ return new SkylarkValue() {
+ @Override
+ public void repr(SkylarkPrinter printer) {
+ printer.append("<repr marker>");
+ }
+
+ @Override
+ public void reprLegacy(SkylarkPrinter printer) {
+ printer.append("<repr legacy marker>");
+ }
+
+ @Override
+ public void str(SkylarkPrinter printer) {
+ printer.append("<str marker>");
+ }
+
+ @Override
+ public void strLegacy(SkylarkPrinter printer) {
+ printer.append("<str legacy marker>");
+ }
+
+ @Override
+ public boolean isImmutable() {
+ return false;
+ }
+ };
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 256985c..b5c6a70 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -55,8 +55,8 @@
* Skylark context
*/
@Override
- protected ModalTestCase newTest() {
- return new SkylarkTest();
+ protected ModalTestCase newTest(String... skylarkOptions) {
+ return new SkylarkTest(skylarkOptions);
}
@Immutable
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index 19665c6..70604c6 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -579,11 +579,15 @@
* A class that runs all tests in Build mode
*/
protected class BuildTest extends ModalTestCase {
- public BuildTest() {}
+ private final String[] skylarkOptions;
+
+ public BuildTest(String... skylarkOptions) {
+ this.skylarkOptions = skylarkOptions;
+ }
@Override
protected void run(Testable testable) throws Exception {
- enableBuildMode();
+ enableBuildMode(skylarkOptions);
testable.run();
}
}