bazel syntax: break dependency on lib.events.Event
This change removes nearly all dependencies on lib.event.Event,
in preparation for reversing the lib.syntax->lib.event dependency.
SyntaxError is renamed to SyntaxError.Exception, and SyntaxError
itself is a simple event-like location+message type.
PiperOrigin-RevId: 304262913
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java b/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
index 5984f04..7bec95b 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SelectTest.java
@@ -34,7 +34,8 @@
@RunWith(JUnit4.class)
public class SelectTest {
- private static Object eval(String expr) throws SyntaxError, EvalException, InterruptedException {
+ private static Object eval(String expr)
+ throws SyntaxError.Exception, EvalException, InterruptedException {
ParserInput input = ParserInput.fromLines(expr);
StarlarkThread thread =
StarlarkThread.builder(Mutability.create("test"))
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
index b1f30bc..8cb0d92 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
@@ -188,7 +188,8 @@
assertThat(rules).containsExactly("myrule", new RuleBytes("myrule").addBytes(128L));
}
- private void exec(String... lines) throws SyntaxError, EvalException, InterruptedException {
+ private void exec(String... lines)
+ throws SyntaxError.Exception, EvalException, InterruptedException {
ParserInput input = ParserInput.create(Joiner.on("\n").join(lines), "a.star");
Mutability mu = Mutability.create("test");
StarlarkThread thread =
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 62cf58e..f653a64 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -738,7 +738,7 @@
Module module = thread.getGlobals();
StarlarkFile file = EvalUtils.parseAndValidate(input, FileOptions.DEFAULT, module);
if (!file.ok()) {
- throw new SyntaxError(file.errors());
+ throw new SyntaxError.Exception(file.errors());
}
SkylarkImportLookupFunction.execAndExport(file, FAKE_LABEL, ev.getEventHandler(), thread);
}
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 5ee621c..99c63be 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
@@ -17,9 +17,10 @@
import static org.junit.Assert.assertThrows;
import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.events.EventCollector;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -32,8 +33,9 @@
@Test
public void testExecutionStopsAtFirstError() throws Exception {
- EventCollector printEvents = new EventCollector();
- StarlarkThread thread = createStarlarkThread(StarlarkThread.makeDebugPrintHandler(printEvents));
+ List<String> printEvents = new ArrayList<>();
+ StarlarkThread thread =
+ createStarlarkThread(/*printHandler=*/ (_thread, msg) -> printEvents.add(msg));
ParserInput input = ParserInput.fromLines("print('hello'); x = 1//0; print('goodbye')");
Module module = thread.getGlobals();
@@ -41,14 +43,16 @@
EvalException.class, () -> EvalUtils.exec(input, FileOptions.DEFAULT, module, thread));
// Only expect hello, should have been an error before goodbye.
- assertThat(printEvents).hasSize(1);
- assertThat(printEvents.iterator().next().getMessage()).isEqualTo("hello");
+ assertThat(printEvents.toString()).isEqualTo("[hello]");
}
@Test
public void testExecutionNotStartedOnInterrupt() throws Exception {
- EventCollector printEvents = new EventCollector();
- StarlarkThread thread = createStarlarkThread(StarlarkThread.makeDebugPrintHandler(printEvents));
+ StarlarkThread thread =
+ createStarlarkThread(
+ /*printHandler=*/ (_thread, msg) -> {
+ throw new AssertionError("print statement was reached");
+ });
ParserInput input = ParserInput.fromLines("print('hello');");
Module module = thread.getGlobals();
@@ -61,8 +65,6 @@
// Reset interrupt bit in case the test failed to do so.
Thread.interrupted();
}
-
- assertThat(printEvents).isEmpty();
}
@Test
@@ -564,7 +566,7 @@
}
private static void execBUILD(String... lines)
- throws SyntaxError, EvalException, InterruptedException {
+ throws SyntaxError.Exception, EvalException, InterruptedException {
ParserInput input = ParserInput.fromLines(lines);
StarlarkThread thread =
StarlarkThread.builder(Mutability.create("test")).useDefaultSemantics().build();
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
index 8d35d8f..f2f2f22 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
@@ -16,7 +16,6 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
-import com.google.devtools.build.lib.testutil.MoreAsserts;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
@@ -40,18 +39,6 @@
}
@Test
- public void testFunctionDefDuplicateArguments() throws Exception {
- // TODO(adonovan): move to ParserTest.
- ParserInput input =
- ParserInput.fromLines(
- "def func(a,b,a):", //
- " a = 1\n");
- StarlarkFile file = StarlarkFile.parse(input);
- MoreAsserts.assertContainsEvent(
- file.errors(), "duplicate parameter name in function definition");
- }
-
- @Test
public void testFunctionDefCallOuterFunc() throws Exception {
List<Object> params = new ArrayList<>();
createOuterFunction(params);
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
index df33118..425286a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LValueBoundNamesTest.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.syntax;
import com.google.common.truth.Truth;
-import com.google.devtools.build.lib.events.Event;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
@@ -54,8 +53,8 @@
private static void assertBoundNames(String assignment, String... expectedBoundNames) {
ParserInput input = ParserInput.fromLines(assignment);
StarlarkFile file = StarlarkFile.parse(input);
- for (Event error : file.errors()) {
- throw new AssertionError(error);
+ if (!file.ok()) {
+ throw new AssertionError(new SyntaxError.Exception(file.errors()));
}
Expression lhs = ((AssignmentStatement) file.getStatements().get(0)).getLHS();
Set<String> boundNames =
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
index 3b727eb..831052c 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
@@ -15,7 +15,7 @@
import static com.google.common.truth.Truth.assertThat;
-import com.google.devtools.build.lib.events.Event;
+import com.google.common.base.Joiner;
import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
import java.util.ArrayList;
import java.util.List;
@@ -31,7 +31,7 @@
// TODO(adonovan): make these these tests less unnecessarily stateful.
- private final List<Event> errors = new ArrayList<>();
+ private final List<SyntaxError> errors = new ArrayList<>();
private String lastError;
/**
@@ -53,9 +53,8 @@
result.add(tok.copy());
} while (tok.kind != TokenKind.EOF);
- for (Event error : errors) {
- lastError =
- error.getLocation().file() + ":" + error.getLocation().line() + ": " + error.getMessage();
+ for (SyntaxError error : errors) {
+ lastError = error.location().file() + ":" + error.location().line() + ": " + error.message();
}
return result;
@@ -516,4 +515,24 @@
public void testLexerLocationCodec() throws Exception {
new SerializationTester(createLexer("foo").createLocation(0, 2)).runTests();
}
+
+ /**
+ * Returns the first error whose string form contains the specified substring, or throws an
+ * informative AssertionError if there is none.
+ *
+ * <p>Exposed for use by other frontend tests.
+ */
+ static SyntaxError assertContainsError(List<SyntaxError> errors, String substr) {
+ for (SyntaxError error : errors) {
+ if (error.toString().contains(substr)) {
+ return error;
+ }
+ }
+ if (errors.isEmpty()) {
+ throw new AssertionError("no errors, want '" + substr + "'");
+ } else {
+ throw new AssertionError(
+ "error '" + substr + "' not found, but got these:\n" + Joiner.on("\n").join(errors));
+ }
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java b/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
index 9ae38aa..2b7dcaa 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/NodeVisitorTest.java
@@ -25,11 +25,11 @@
@RunWith(JUnit4.class)
public final class NodeVisitorTest {
- private static StarlarkFile parse(String... lines) throws SyntaxError {
+ private static StarlarkFile parse(String... lines) throws SyntaxError.Exception {
ParserInput input = ParserInput.fromLines(lines);
StarlarkFile file = StarlarkFile.parse(input);
if (!file.ok()) {
- throw new SyntaxError(file.errors());
+ throw new SyntaxError.Exception(file.errors());
}
return file;
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index f1a402b..3aebe9a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -20,10 +20,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventCollector;
import com.google.devtools.build.lib.events.Location;
-import com.google.devtools.build.lib.testutil.MoreAsserts;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -35,11 +32,11 @@
@RunWith(JUnit4.class)
public final class ParserTest {
- private final EventCollector events = new EventCollector();
+ private final List<SyntaxError> events = new ArrayList<>();
private boolean failFast = true;
- private Event assertContainsError(String expectedMessage) {
- return MoreAsserts.assertContainsEvent(events, expectedMessage);
+ private SyntaxError assertContainsError(String expectedMessage) {
+ return LexerTest.assertContainsError(events, expectedMessage);
}
private void setFailFast(boolean failFast) {
@@ -47,7 +44,7 @@
}
// Joins the lines, parse, and returns an expression.
- private static Expression parseExpression(String... lines) throws SyntaxError {
+ private static Expression parseExpression(String... lines) throws SyntaxError.Exception {
ParserInput input = ParserInput.fromLines(lines);
return Expression.parse(input);
}
@@ -59,32 +56,33 @@
try {
Expression.parse(input);
throw new AssertionError("parseExpression(%s) succeeded unexpectedly: " + src);
- } catch (SyntaxError ex) {
- return ex.errors().get(0).getMessage();
+ } catch (SyntaxError.Exception ex) {
+ return ex.errors().get(0).message();
}
}
// Joins the lines, parses, and returns a file.
// Errors are added to this.events, or thrown if this.failFast;
- private StarlarkFile parseFile(String... lines) throws SyntaxError {
+ private StarlarkFile parseFile(String... lines) throws SyntaxError.Exception {
ParserInput input = ParserInput.fromLines(lines);
StarlarkFile file = StarlarkFile.parse(input);
if (!file.ok()) {
if (failFast) {
- throw new SyntaxError(file.errors());
+ throw new SyntaxError.Exception(file.errors());
}
- Event.replayEventsOn(events, file.errors());
+ // TODO(adonovan): return these, and eliminate a stateful field.
+ events.addAll(file.errors());
}
return file;
}
// Joins the lines, parses, and returns the sole statement.
- private Statement parseStatement(String... lines) throws SyntaxError {
+ private Statement parseStatement(String... lines) throws SyntaxError.Exception {
return Iterables.getOnlyElement(parseStatements(lines));
}
// Joins the lines, parses, and returns the statements.
- private List<Statement> parseStatements(String... lines) throws SyntaxError {
+ private ImmutableList<Statement> parseStatements(String... lines) throws SyntaxError.Exception {
return parseFile(lines).getStatements();
}
@@ -341,7 +339,8 @@
assertLocation(0, 14, slice);
}
- private static void evalSlice(String statement, Object... expectedArgs) throws SyntaxError {
+ private static void evalSlice(String statement, Object... expectedArgs)
+ throws SyntaxError.Exception {
SliceExpression e = (SliceExpression) parseExpression(statement);
// There is no way to evaluate the expression here, so we rely on string comparison.
@@ -401,7 +400,7 @@
}
@Test
- public void testSecondaryLocation() throws SyntaxError {
+ public void testSecondaryLocation() throws SyntaxError.Exception {
String expr = "f(1 % 2)";
CallExpression call = (CallExpression) parseExpression(expr);
Argument arg = call.getArguments().get(0);
@@ -409,7 +408,7 @@
}
@Test
- public void testPrimaryLocation() throws SyntaxError {
+ public void testPrimaryLocation() throws SyntaxError.Exception {
String expr = "f(1 + 2)";
CallExpression call = (CallExpression) parseExpression(expr);
Argument arg = call.getArguments().get(0);
@@ -621,7 +620,7 @@
assertStatementLocationCorrect("def foo():\n pass");
}
- private void assertStatementLocationCorrect(String stmtStr) throws SyntaxError {
+ private void assertStatementLocationCorrect(String stmtStr) throws SyntaxError.Exception {
Statement stmt = parseStatement(stmtStr);
assertThat(getText(stmtStr, stmt)).isEqualTo(stmtStr);
// Also try it with another token at the end (newline), which broke the location in the past.
@@ -629,7 +628,7 @@
assertThat(getText(stmtStr, stmt)).isEqualTo(stmtStr);
}
- private static void assertExpressionLocationCorrect(String exprStr) throws SyntaxError {
+ private static void assertExpressionLocationCorrect(String exprStr) throws SyntaxError.Exception {
Expression expr = parseExpression(exprStr);
assertThat(getText(exprStr, expr)).isEqualTo(exprStr);
// Also try it with another token at the end (newline), which broke the location in the past.
@@ -866,10 +865,10 @@
" b = 2 * * 5", // parse error
"");
- assertThat(events).hasSize(3);
assertContainsError("syntax error at 'for': expected newline");
assertContainsError("syntax error at 'ada': expected newline");
assertContainsError("syntax error at '*': expected expression");
+ assertThat(events).hasSize(3);
assertThat(statements).hasSize(3);
}
@@ -1182,7 +1181,7 @@
}
private void runLoadAliasTestForSymbols(String loadSymbolString, String... expectedSymbols)
- throws SyntaxError {
+ throws SyntaxError.Exception {
List<Statement> statements =
parseStatements(String.format("load('//foo/bar:file.bzl', %s)\n", loadSymbolString));
LoadStatement stmt = (LoadStatement) statements.get(0);
@@ -1335,6 +1334,15 @@
}
@Test
+ public void testFunctionDefDuplicateArguments() throws Exception {
+ setFailFast(false);
+ parseFile(
+ "def func(a,b,a):", //
+ " a = 1\n");
+ assertContainsError("duplicate parameter name in function definition");
+ }
+
+ @Test
public void testStringsAreDeduped() throws Exception {
StarlarkFile file = parseFile("L1 = ['cat', 'dog', 'fish']", "L2 = ['dog', 'fish', 'cat']");
Set<String> uniqueStringInstances = Sets.newIdentityHashSet();
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/PrettyPrintTest.java b/src/test/java/com/google/devtools/build/lib/syntax/PrettyPrintTest.java
index e2a9a0f..cf420bb 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/PrettyPrintTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/PrettyPrintTest.java
@@ -26,20 +26,20 @@
@RunWith(JUnit4.class)
public final class PrettyPrintTest {
- private static StarlarkFile parseFile(String... lines) throws SyntaxError {
+ private static StarlarkFile parseFile(String... lines) throws SyntaxError.Exception {
ParserInput input = ParserInput.fromLines(lines);
StarlarkFile file = StarlarkFile.parse(input);
if (!file.ok()) {
- throw new SyntaxError(file.errors());
+ throw new SyntaxError.Exception(file.errors());
}
return file;
}
- private static Statement parseStatement(String... lines) throws SyntaxError {
+ private static Statement parseStatement(String... lines) throws SyntaxError.Exception {
return parseFile(lines).getStatements().get(0);
}
- private static Expression parseExpression(String... lines) throws SyntaxError {
+ private static Expression parseExpression(String... lines) throws SyntaxError.Exception {
return Expression.parse(ParserInput.fromLines(lines));
}
@@ -50,24 +50,24 @@
/**
* Asserts that the given node's pretty print at a given indent level matches the given string.
*/
- private void assertPrettyMatches(Node node, int indentLevel, String expected) {
+ private static void assertPrettyMatches(Node node, int indentLevel, String expected) {
StringBuilder buf = new StringBuilder();
new NodePrinter(buf, indentLevel).printNode(node);
assertThat(buf.toString()).isEqualTo(expected);
}
/** Asserts that the given node's pretty print with no indent matches the given string. */
- private void assertPrettyMatches(Node node, String expected) {
+ private static void assertPrettyMatches(Node node, String expected) {
assertPrettyMatches(node, 0, expected);
}
/** Asserts that the given node's pretty print with one indent matches the given string. */
- private void assertIndentedPrettyMatches(Node node, String expected) {
+ private static void assertIndentedPrettyMatches(Node node, String expected) {
assertPrettyMatches(node, 1, expected);
}
/** Asserts that the given node's {@code toString} matches the given string. */
- private void assertTostringMatches(Node node, String expected) {
+ private static void assertTostringMatches(Node node, String expected) {
assertThat(node.toString()).isEqualTo(expected);
}
@@ -75,7 +75,8 @@
* Parses the given string as an expression, and asserts that its pretty print matches the given
* string.
*/
- private void assertExprPrettyMatches(String source, String expected) throws SyntaxError {
+ private static void assertExprPrettyMatches(String source, String expected)
+ throws SyntaxError.Exception {
Expression node = parseExpression(source);
assertPrettyMatches(node, expected);
}
@@ -84,7 +85,8 @@
* Parses the given string as an expression, and asserts that its {@code toString} matches the
* given string.
*/
- private void assertExprTostringMatches(String source, String expected) throws SyntaxError {
+ private static void assertExprTostringMatches(String source, String expected)
+ throws SyntaxError.Exception {
Expression node = parseExpression(source);
assertThat(node.toString()).isEqualTo(expected);
}
@@ -93,7 +95,7 @@
* Parses the given string as an expression, and asserts that both its pretty print and {@code
* toString} return the original string.
*/
- private void assertExprBothRoundTrip(String source) throws SyntaxError {
+ private static void assertExprBothRoundTrip(String source) throws SyntaxError.Exception {
assertExprPrettyMatches(source, source);
assertExprTostringMatches(source, source);
}
@@ -102,7 +104,8 @@
* Parses the given string as a statement, and asserts that its pretty print with one indent
* matches the given string.
*/
- private void assertStmtIndentedPrettyMatches(String source, String expected) throws SyntaxError {
+ private static void assertStmtIndentedPrettyMatches(String source, String expected)
+ throws SyntaxError.Exception {
Statement node = parseStatement(source);
assertIndentedPrettyMatches(node, expected);
}
@@ -111,7 +114,8 @@
* Parses the given string as an statement, and asserts that its {@code toString} matches the
* given string.
*/
- private void assertStmtTostringMatches(String source, String expected) throws SyntaxError {
+ private static void assertStmtTostringMatches(String source, String expected)
+ throws SyntaxError.Exception {
Statement node = parseStatement(source);
assertThat(node.toString()).isEqualTo(expected);
}
@@ -119,14 +123,14 @@
// Expressions.
@Test
- public void abstractComprehension() throws SyntaxError {
+ public void abstractComprehension() throws SyntaxError.Exception {
// Covers DictComprehension and ListComprehension.
assertExprBothRoundTrip("[z for y in x if True for z in y]");
assertExprBothRoundTrip("{z: x for y in x if True for z in y}");
}
@Test
- public void binaryOperatorExpression() throws SyntaxError {
+ public void binaryOperatorExpression() throws SyntaxError.Exception {
assertExprPrettyMatches("1 + 2", "(1 + 2)");
assertExprTostringMatches("1 + 2", "1 + 2");
@@ -135,22 +139,22 @@
}
@Test
- public void conditionalExpression() throws SyntaxError {
+ public void conditionalExpression() throws SyntaxError.Exception {
assertExprBothRoundTrip("1 if True else 2");
}
@Test
- public void dictExpression() throws SyntaxError {
+ public void dictExpression() throws SyntaxError.Exception {
assertExprBothRoundTrip("{1: \"a\", 2: \"b\"}");
}
@Test
- public void dotExpression() throws SyntaxError {
+ public void dotExpression() throws SyntaxError.Exception {
assertExprBothRoundTrip("o.f");
}
@Test
- public void funcallExpression() throws SyntaxError {
+ public void funcallExpression() throws SyntaxError.Exception {
assertExprBothRoundTrip("f()");
assertExprBothRoundTrip("f(a)");
assertExprBothRoundTrip("f(a, b = B, c = C, *d, **e)");
@@ -158,22 +162,22 @@
}
@Test
- public void identifier() throws SyntaxError {
+ public void identifier() throws SyntaxError.Exception {
assertExprBothRoundTrip("foo");
}
@Test
- public void indexExpression() throws SyntaxError {
+ public void indexExpression() throws SyntaxError.Exception {
assertExprBothRoundTrip("a[i]");
}
@Test
- public void integerLiteral() throws SyntaxError {
+ public void integerLiteral() throws SyntaxError.Exception {
assertExprBothRoundTrip("5");
}
@Test
- public void listLiteralShort() throws SyntaxError {
+ public void listLiteralShort() throws SyntaxError.Exception {
assertExprBothRoundTrip("[]");
assertExprBothRoundTrip("[5]");
assertExprBothRoundTrip("[5, 6]");
@@ -183,7 +187,7 @@
}
@Test
- public void listLiteralLong() throws SyntaxError {
+ public void listLiteralLong() throws SyntaxError.Exception {
// List literals with enough elements to trigger the abbreviated toString() format.
assertExprPrettyMatches("[1, 2, 3, 4, 5, 6]", "[1, 2, 3, 4, 5, 6]");
assertExprTostringMatches("[1, 2, 3, 4, 5, 6]", "[1, 2, 3, 4, <2 more arguments>]");
@@ -193,7 +197,7 @@
}
@Test
- public void listLiteralNested() throws SyntaxError {
+ public void listLiteralNested() throws SyntaxError.Exception {
// Make sure that the inner list doesn't get abbreviated when the outer list is printed using
// prettyPrint().
assertExprPrettyMatches(
@@ -205,7 +209,7 @@
}
@Test
- public void sliceExpression() throws SyntaxError {
+ public void sliceExpression() throws SyntaxError.Exception {
assertExprBothRoundTrip("a[b:c:d]");
assertExprBothRoundTrip("a[b:c]");
assertExprBothRoundTrip("a[b:]");
@@ -216,13 +220,13 @@
}
@Test
- public void stringLiteral() throws SyntaxError {
+ public void stringLiteral() throws SyntaxError.Exception {
assertExprBothRoundTrip("\"foo\"");
assertExprBothRoundTrip("\"quo\\\"ted\"");
}
@Test
- public void unaryOperatorExpression() throws SyntaxError {
+ public void unaryOperatorExpression() throws SyntaxError.Exception {
assertExprPrettyMatches("not True", "not (True)");
assertExprTostringMatches("not True", "not True");
assertExprPrettyMatches("-5", "-(5)");
@@ -232,25 +236,25 @@
// Statements.
@Test
- public void assignmentStatement() throws SyntaxError {
+ public void assignmentStatement() throws SyntaxError.Exception {
assertStmtIndentedPrettyMatches("x = y", " x = y\n");
assertStmtTostringMatches("x = y", "x = y\n");
}
@Test
- public void augmentedAssignmentStatement() throws SyntaxError {
+ public void augmentedAssignmentStatement() throws SyntaxError.Exception {
assertStmtIndentedPrettyMatches("x += y", " x += y\n");
assertStmtTostringMatches("x += y", "x += y\n");
}
@Test
- public void expressionStatement() throws SyntaxError {
+ public void expressionStatement() throws SyntaxError.Exception {
assertStmtIndentedPrettyMatches("5", " 5\n");
assertStmtTostringMatches("5", "5\n");
}
@Test
- public void defStatement() throws SyntaxError {
+ public void defStatement() throws SyntaxError.Exception {
assertStmtIndentedPrettyMatches(
join("def f(x):",
" print(x)"),
@@ -287,7 +291,7 @@
}
@Test
- public void flowStatement() throws SyntaxError {
+ public void flowStatement() throws SyntaxError.Exception {
// The parser would complain if we tried to construct them from source.
Node breakNode = new FlowStatement(TokenKind.BREAK);
assertIndentedPrettyMatches(breakNode, " break\n");
@@ -299,7 +303,7 @@
}
@Test
- public void forStatement() throws SyntaxError {
+ public void forStatement() throws SyntaxError.Exception {
assertStmtIndentedPrettyMatches(
join("for x in y:",
" print(x)"),
@@ -324,7 +328,7 @@
}
@Test
- public void ifStatement() throws SyntaxError {
+ public void ifStatement() throws SyntaxError.Exception {
assertStmtIndentedPrettyMatches(
join("if True:",
" print(x)"),
@@ -361,7 +365,7 @@
}
@Test
- public void loadStatement() throws SyntaxError {
+ public void loadStatement() throws SyntaxError.Exception {
// load("foo.bzl", a="A", "B")
Node loadStatement =
new LoadStatement(
@@ -378,7 +382,7 @@
}
@Test
- public void returnStatement() throws SyntaxError {
+ public void returnStatement() throws SyntaxError.Exception {
assertIndentedPrettyMatches(
new ReturnStatement(new StringLiteral("foo")),
" return \"foo\"\n");
@@ -396,7 +400,7 @@
// Miscellaneous.
@Test
- public void buildFileAST() throws SyntaxError {
+ public void buildFileAST() throws SyntaxError.Exception {
Node node = parseFile("print(x)\nprint(y)");
assertIndentedPrettyMatches(
node,
@@ -407,16 +411,15 @@
}
@Test
- public void comment() throws SyntaxError {
+ public void comment() throws SyntaxError.Exception {
Comment node = new Comment("foo");
assertIndentedPrettyMatches(node, " # foo");
assertTostringMatches(node, "foo");
}
/* Not tested explicitly because they're covered implicitly by tests for other nodes:
- * - LValue
* - DictExpression.Entry
- * - passed arguments / formal parameters
- * - ConditionalStatements
+ * - Argument / Parameter
+ * - IfStatements
*/
}
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 1472976..0dd862a 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
@@ -946,7 +946,7 @@
// TODO(adonovan): move this and all tests that use it to Validation tests.
private void assertValidationError(String expectedError, final String... lines) throws Exception {
- SyntaxError error = assertThrows(SyntaxError.class, () -> exec(lines));
+ SyntaxError.Exception error = assertThrows(SyntaxError.Exception.class, () -> exec(lines));
assertThat(error).hasMessageThat().contains(expectedError);
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
index 4cd28bc..7ffd09a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFileTest.java
@@ -16,8 +16,6 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.common.base.Joiner;
-import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.testutil.MoreAsserts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -86,25 +84,25 @@
public void testFailsIfNewlinesAreMissing() throws Exception {
StarlarkFile file = parseFile("foo() bar() something = baz() bar()");
- Event event =
- MoreAsserts.assertContainsEvent(file.errors(), "syntax error at \'bar\': expected newline");
- assertThat(event.getLocation().toString()).isEqualTo("foo.star:1:7");
+ SyntaxError error =
+ LexerTest.assertContainsError(file.errors(), "syntax error at \'bar\': expected newline");
+ assertThat(error.location().toString()).isEqualTo("foo.star:1:7");
}
@Test
public void testImplicitStringConcatenationFails() throws Exception {
StarlarkFile file = parseFile("a = 'foo' 'bar'");
- Event event =
- MoreAsserts.assertContainsEvent(
+ SyntaxError error =
+ LexerTest.assertContainsError(
file.errors(), "Implicit string concatenation is forbidden, use the + operator");
- assertThat(event.getLocation().toString()).isEqualTo("foo.star:1:10");
+ assertThat(error.location().toString()).isEqualTo("foo.star:1:10");
}
@Test
public void testImplicitStringConcatenationAcrossLinesIsIllegal() throws Exception {
StarlarkFile file = parseFile("a = 'foo'\n 'bar'");
- Event event = MoreAsserts.assertContainsEvent(file.errors(), "indentation error");
- assertThat(event.getLocation().toString()).isEqualTo("foo.star:2:2");
+ SyntaxError error = LexerTest.assertContainsError(file.errors(), "indentation error");
+ assertThat(error.location().toString()).isEqualTo("foo.star:2:2");
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
index 053ea1a..c35ce1e 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
@@ -227,9 +227,9 @@
Module module = thread.getGlobals();
module.put("a", 1);
- SyntaxError e =
+ SyntaxError.Exception e =
assertThrows(
- SyntaxError.class,
+ SyntaxError.Exception.class,
() ->
EvalUtils.execAndEvalOptionalFinalExpression(
ParserInput.fromLines("b"), FileOptions.DEFAULT, module, thread));
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
index 6b790bb..b8c8230 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
@@ -58,7 +58,7 @@
@Test
public void testReference() throws Exception {
setFailFast(false);
- SyntaxError e = assertThrows(SyntaxError.class, () -> eval("foo"));
+ SyntaxError.Exception e = assertThrows(SyntaxError.Exception.class, () -> eval("foo"));
assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
update("foo", "bar");
assertThat(eval("foo")).isEqualTo("bar");
@@ -67,7 +67,7 @@
// Test assign and reference through interpreter:
@Test
public void testAssignAndReference() throws Exception {
- SyntaxError e = assertThrows(SyntaxError.class, () -> eval("foo"));
+ SyntaxError.Exception e = assertThrows(SyntaxError.Exception.class, () -> eval("foo"));
assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
exec("foo = 'bar'");
assertThat(eval("foo")).isEqualTo("bar");
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
index f3776e6..402dff6 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
@@ -14,10 +14,9 @@
package com.google.devtools.build.lib.syntax;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.devtools.build.lib.testutil.MoreAsserts.assertContainsEvent;
+import static com.google.devtools.build.lib.syntax.LexerTest.assertContainsError;
-import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventCollector;
+import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -29,36 +28,34 @@
private final FileOptions.Builder options = FileOptions.builder();
// Validates a file using the current options.
- private StarlarkFile validateFile(String... lines) throws SyntaxError {
+ private StarlarkFile validateFile(String... lines) throws SyntaxError.Exception {
ParserInput input = ParserInput.fromLines(lines);
Module module = Module.createForBuiltins(Starlark.UNIVERSE);
return EvalUtils.parseAndValidate(input, options.build(), module);
}
// Assertions that parsing and validation succeeds.
- private void assertValid(String... lines) throws SyntaxError {
+ private void assertValid(String... lines) throws SyntaxError.Exception {
StarlarkFile file = validateFile(lines);
if (!file.ok()) {
- throw new SyntaxError(file.errors());
+ throw new SyntaxError.Exception(file.errors());
}
}
// Asserts that parsing of the program succeeds but validation fails
// with at least the specified error.
- private void assertInvalid(String expectedError, String... lines) throws SyntaxError {
- EventCollector errors = getValidationErrors(lines);
- assertContainsEvent(errors, expectedError);
+ private void assertInvalid(String expectedError, String... lines) throws SyntaxError.Exception {
+ List<SyntaxError> errors = getValidationErrors(lines);
+ assertContainsError(errors, expectedError);
}
// Returns the non-empty list of validation errors of the program.
- private EventCollector getValidationErrors(String... lines) throws SyntaxError {
+ private List<SyntaxError> getValidationErrors(String... lines) throws SyntaxError.Exception {
StarlarkFile file = validateFile(lines);
if (file.ok()) {
throw new AssertionError("validation succeeded unexpectedly");
}
- EventCollector errors = new EventCollector();
- Event.replayEventsOn(errors, file.errors());
- return errors;
+ return file.errors();
}
@Test
@@ -181,16 +178,16 @@
@Test
public void testNoGlobalReassign() throws Exception {
- EventCollector errors = getValidationErrors("a = 1", "a = 2");
- assertContainsEvent(errors, ":2:1: cannot reassign global 'a'");
- assertContainsEvent(errors, ":1:1: 'a' previously declared here");
+ List<SyntaxError> errors = getValidationErrors("a = 1", "a = 2");
+ assertContainsError(errors, ":2:1: cannot reassign global 'a'");
+ assertContainsError(errors, ":1:1: 'a' previously declared here");
}
@Test
public void testTwoFunctionsWithTheSameName() throws Exception {
- EventCollector errors = getValidationErrors("def foo(): pass", "def foo(): pass");
- assertContainsEvent(errors, ":2:5: cannot reassign global 'foo'");
- assertContainsEvent(errors, ":1:5: 'foo' previously declared here");
+ List<SyntaxError> errors = getValidationErrors("def foo(): pass", "def foo(): pass");
+ assertContainsError(errors, ":2:5: cannot reassign global 'foo'");
+ assertContainsError(errors, ":1:5: 'foo' previously declared here");
}
@Test
@@ -308,18 +305,18 @@
@Test
public void testDollarErrorDoesNotLeak() throws Exception {
- EventCollector errors =
+ List<SyntaxError> errors =
getValidationErrors(
"def GenerateMapNames():", //
" a = 2",
" b = [3, 4]",
" if a not b:",
" print(a)");
- assertContainsEvent(errors, "syntax error at 'b': expected 'in'");
+ assertContainsError(errors, "syntax error at 'b': expected 'in'");
// Parser uses "$error" symbol for error recovery.
// It should not be used in error messages.
- for (Event event : errors) {
- assertThat(event.getMessage()).doesNotContain("$error$");
+ for (SyntaxError event : errors) {
+ assertThat(event.message()).doesNotContain("$error$");
}
}
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 f3314b6..5427604 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
@@ -110,7 +110,7 @@
// and evaluation.
/** Parses an expression. */
- protected final Expression parseExpression(String... lines) throws SyntaxError {
+ protected final Expression parseExpression(String... lines) throws SyntaxError.Exception {
return Expression.parse(ParserInput.fromLines(lines));
}
@@ -132,7 +132,8 @@
}
/** Joins the lines, parses them as a file, and executes it. */
- public final void exec(String... lines) throws SyntaxError, EvalException, InterruptedException {
+ public final void exec(String... lines)
+ throws SyntaxError.Exception, EvalException, InterruptedException {
ParserInput input = ParserInput.fromLines(lines);
EvalUtils.exec(input, FileOptions.DEFAULT, thread.getGlobals(), thread);
}
@@ -141,7 +142,7 @@
try {
exec(input);
fail("Expected error '" + msg + "' but got no error");
- } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
+ } catch (SyntaxError.Exception | EvalException | EventCollectionApparatus.FailFastException e) {
assertThat(e).hasMessageThat().isEqualTo(msg);
}
}
@@ -150,7 +151,7 @@
try {
exec(input);
fail("Expected error containing '" + msg + "' but got no error");
- } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
+ } catch (SyntaxError.Exception | EvalException | EventCollectionApparatus.FailFastException e) {
assertThat(e).hasMessageThat().contains(msg);
}
}
@@ -158,7 +159,7 @@
public void checkEvalErrorDoesNotContain(String msg, String... input) throws Exception {
try {
exec(input);
- } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
+ } catch (SyntaxError.Exception | EvalException | EventCollectionApparatus.FailFastException e) {
assertThat(e).hasMessageThat().doesNotContain(msg);
}
}