diff options
author | Laurent Le Brun <laurentlb@google.com> | 2015-09-10 11:31:30 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-09-11 09:45:16 +0000 |
commit | 4aa2912d12dbcede9bf74397a4269499fc153fd4 (patch) | |
tree | deb58e0f65d194cf0936f6b4fdf0ae0337d47fbe /src/main/java/com | |
parent | f80258ed9e29f91132f8d92439ddecd0f5acf75a (diff) |
LoadStatement: Keep the location of the path argument.
--
MOS_MIGRATED_REVID=102743954
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java | 16 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/Parser.java | 37 |
2 files changed, 31 insertions, 22 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java index 8b9547a2c2..b5e6650b75 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java @@ -30,7 +30,7 @@ public final class LoadStatement extends Statement { private final ImmutableMap<Identifier, String> symbols; private final ImmutableList<Identifier> cachedSymbols; // to save time private final PathFragment importPath; - private final String pathString; + private final StringLiteral pathString; /** * Constructs an import statement. @@ -40,10 +40,10 @@ public final class LoadStatement extends Statement { * If aliasing is used, the value differs from it's key's symbol#getName(). * Otherwise, both values are identical. */ - LoadStatement(String path, Map<Identifier, String> symbols) { + LoadStatement(StringLiteral path, Map<Identifier, String> symbols) { this.symbols = ImmutableMap.copyOf(symbols); this.cachedSymbols = ImmutableList.copyOf(symbols.keySet()); - this.importPath = new PathFragment(path + ".bzl"); + this.importPath = new PathFragment(path.getValue() + ".bzl"); this.pathString = path; } @@ -87,7 +87,7 @@ public final class LoadStatement extends Statement { @Override void validate(ValidationEnvironment env) throws EvalException { validatePath(); - + if (!importPath.isAbsolute() && importPath.segmentCount() > 1) { throw new EvalException(getLocation(), String.format(PATH_ERROR_MSG, importPath)); } @@ -96,6 +96,10 @@ public final class LoadStatement extends Statement { } } + public StringLiteral getPath() { + return pathString; + } + /** * Throws an exception if the path argument to load() starts with more than one forward * slash ('/') @@ -103,9 +107,9 @@ public final class LoadStatement extends Statement { public void validatePath() throws EvalException { String error = null; - if (pathString.isEmpty()) { + if (pathString.getValue().isEmpty()) { error = "Path argument to load() must not be empty"; - } else if (pathString.startsWith("//")) { + } else if (pathString.getValue().startsWith("//")) { error = "First argument of load() is a path, not a label. " + "It should start with a single slash if it is an absolute path."; 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 9efd28e410..7d2311c98a 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 @@ -670,6 +670,24 @@ class Parser { } } + /** + * Parse a String literal value, e.g. "str". + */ + private StringLiteral parseStringLiteral() { + Preconditions.checkState(token.kind == TokenKind.STRING); + int end = token.right; + char quoteChar = lexer.charAt(token.left); + StringLiteral literal = + setLocation(new StringLiteral((String) token.value, quoteChar), token.left, end); + + nextToken(); + if (token.kind == TokenKind.STRING) { + reportError(lexer.createLocation(end, token.left), + "Implicit string concatenation is forbidden, use the + operator"); + } + return literal; + } + // primary ::= INTEGER // | STRING // | STRING '.' IDENTIFIER funcall_suffix @@ -691,17 +709,7 @@ class Parser { return literal; } case STRING: { - String value = (String) token.value; - int end = token.right; - char quoteChar = lexer.charAt(start); - nextToken(); - if (token.kind == TokenKind.STRING) { - reportError(lexer.createLocation(end, token.left), - "Implicit string concatenation is forbidden, use the + operator"); - } - StringLiteral literal = new StringLiteral(value, quoteChar); - setLocation(literal, start, end); - return literal; + return parseStringLiteral(); } case IDENTIFIER: { Identifier ident = parseIdent(); @@ -1103,10 +1111,7 @@ class Parser { return; } - Token pathToken = token; - String path = (String) token.value; - - nextToken(); + StringLiteral path = parseStringLiteral(); expect(TokenKind.COMMA); Map<Identifier, String> symbols = new HashMap<>(); @@ -1130,7 +1135,7 @@ class Parser { try { stmt.validatePath(); } catch (EvalException e) { - syntaxError(pathToken, e.getMessage()); + reportError(path.getLocation(), e.getMessage()); } list.add(setLocation(stmt, start, token.left)); |