aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java22
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java9
2 files changed, 15 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index 187f11bbf0..3ce949dac6 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -240,11 +240,11 @@ class Parser {
}
}
- private void syntaxError(Token token) {
+ private void syntaxError(Token token, String message) {
if (!recoveryMode) {
String msg = token.kind == TokenKind.INDENT
? "indentation error"
- : "syntax error at '" + token + "'";
+ : "syntax error at '" + token + "': " + message;
reportError(lexer.createLocation(token.left, token.right), msg);
recoveryMode = true;
}
@@ -255,7 +255,7 @@ class Parser {
private boolean expect(TokenKind kind) {
boolean expected = token.kind == kind;
if (!expected) {
- syntaxError(token);
+ syntaxError(token, "expected " + kind.getPrettyName());
}
nextToken();
return expected;
@@ -454,7 +454,7 @@ class Parser {
return setLocation(new DotExpression(receiver, ident), start, token.right);
}
} else {
- syntaxError(token);
+ syntaxError(token, "expected identifier after dot");
int end = syncTo(EXPR_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
@@ -632,7 +632,7 @@ class Parser {
nextToken();
return expression;
}
- syntaxError(token);
+ expect(TokenKind.RPAREN);
int end = syncTo(EXPR_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
@@ -646,7 +646,7 @@ class Parser {
start, token.right);
}
default: {
- syntaxError(token);
+ syntaxError(token, "expected expression");
int end = syncTo(EXPR_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
@@ -772,7 +772,7 @@ class Parser {
}
} while (token.kind == TokenKind.FOR);
- syntaxError(token);
+ syntaxError(token, "expected 'for' or ']'");
int end = syncPast(LIST_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
@@ -787,12 +787,12 @@ class Parser {
nextToken();
return literal;
}
- syntaxError(token);
+ expect(TokenKind.RBRACKET);
int end = syncPast(LIST_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
default: {
- syntaxError(token);
+ syntaxError(token, "expected ',', 'for' or ']'");
int end = syncPast(LIST_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
@@ -834,14 +834,14 @@ class Parser {
nextToken();
return literal;
}
- syntaxError(token);
+ expect(TokenKind.RBRACE);
int end = syncPast(DICT_TERMINATOR_SET);
return makeErrorExpression(start, end);
}
private Ident parseIdent() {
if (token.kind != TokenKind.IDENTIFIER) {
- syntaxError(token);
+ expect(TokenKind.IDENTIFIER);
return makeErrorExpression(token.left, token.right);
}
Ident ident = new Ident(((String) token.value));
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
index 5a0b0a3921..5a1eaad14b 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
@@ -119,7 +119,7 @@ public class BuildFileASTTest {
parseBuildFile("foo() bar() something = baz() bar()");
Event event = events.collector().iterator().next();
- assertEquals("syntax error at \'bar\'", event.getMessage());
+ assertEquals("syntax error at \'bar\': expected newline", event.getMessage());
assertEquals("/a/build/file/BUILD",
event.getLocation().getPath().toString());
assertEquals(1, event.getLocation().getStartLineAndColumn().getLine());
@@ -173,8 +173,7 @@ public class BuildFileASTTest {
public void testWithSyntaxErrorsDoesNotPrintDollarError() throws Exception {
events.setFailFast(false);
BuildFileAST buildFile = parseBuildFile(
- "abi = cxx_abi + '-glibc-' + glibc_version + '-' + "
- + "generic_cpu + '-' + sysname",
+ "abi = cxx_abi + '-glibc-' + glibc_version + '-' + generic_cpu + '-' + sysname",
"libs = [abi + opt_level + '/lib/libcc.a']",
"shlibs = [abi + opt_level + '/lib/libcc.so']",
"+* shlibs", // syntax error at '+'
@@ -183,7 +182,7 @@ public class BuildFileASTTest {
" includes = [ abi + opt_level + '/include' ])");
assertTrue(buildFile.containsErrors());
Event event = events.collector().iterator().next();
- assertEquals("syntax error at '+'", event.getMessage());
+ assertEquals("syntax error at '+': expected expression", event.getMessage());
Environment env = new Environment();
assertFalse(buildFile.exec(env, events.reporter()));
assertNull(findEvent(events.collector(), "$error$"));
@@ -313,7 +312,7 @@ public class BuildFileASTTest {
// Check the location is properly reported
Event event = events.collector().iterator().next();
assertEquals("/foo/bar/file:1:9", event.getLocation().print());
- assertEquals("syntax error at '%'", event.getMessage());
+ assertEquals("syntax error at '%': expected expression", event.getMessage());
}
@Test