Add the source location of the import string to the LoadStatement AST node, for use in tools. -- MOS_MIGRATED_REVID=111142252
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 d373c46..2bc348a 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
@@ -17,6 +17,7 @@ import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.syntax.compiler.DebugInfo; import com.google.devtools.build.lib.syntax.compiler.LoopLabels; import com.google.devtools.build.lib.syntax.compiler.VariableScope; @@ -33,6 +34,7 @@ private final ImmutableMap<Identifier, String> symbols; private final ImmutableList<Identifier> cachedSymbols; // to save time private final SkylarkImport imp; + private final Location importLocation; /** * Constructs an import statement. @@ -41,12 +43,17 @@ * the bzl file that should be loaded. If aliasing is used, the value differs from its key's * {@code symbol.getName()}. Otherwise, both values are identical. */ - LoadStatement(SkylarkImport imp, Map<Identifier, String> symbols) { + LoadStatement(SkylarkImport imp, Location importLocation, Map<Identifier, String> symbols) { this.imp = imp; + this.importLocation = importLocation; this.symbols = ImmutableMap.copyOf(symbols); this.cachedSymbols = ImmutableList.copyOf(symbols.keySet()); } + public Location getImportLocation() { + return importLocation; + } + public ImmutableList<Identifier> getSymbols() { return cachedSymbols; }
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 023a85b..aa37796 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
@@ -1052,7 +1052,7 @@ return; } - StringLiteral path = parseStringLiteral(); + StringLiteral importString = parseStringLiteral(); expect(TokenKind.COMMA); Map<Identifier, String> symbols = new HashMap<>(); @@ -1070,13 +1070,13 @@ SkylarkImport imp; try { - imp = SkylarkImports.create(path.getValue()); - LoadStatement stmt = new LoadStatement(imp, symbols); + imp = SkylarkImports.create(importString.getValue()); + LoadStatement stmt = new LoadStatement(imp, importString.getLocation(), symbols); list.add(setLocation(stmt, start, token.left)); } catch (SkylarkImportSyntaxException e) { - String msg = "Load statement parameter '" + path + "' is invalid. " + String msg = "Load statement parameter '" + importString + "' is invalid. " + e.getMessage(); - reportError(path.getLocation(), msg); + reportError(importString.getLocation(), msg); } }
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 2985fd1..8e51987 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
@@ -1083,13 +1083,22 @@ @Test public void testValidAbsoluteImportPath() { + String importString = "/some/skylark/file"; List<Statement> statements = - parseFileForSkylark("load('/some/skylark/file', 'fun_test')\n"); + parseFileForSkylark("load('" + importString + "', 'fun_test')\n"); LoadStatement stmt = (LoadStatement) statements.get(0); SkylarkImport imp = stmt.getImport(); - assertThat(imp.getImportString()).isEqualTo("/some/skylark/file"); - assertThat(imp.hasAbsolutePath()).isTrue(); - assertThat(imp.getAbsolutePath()).isEqualTo(new PathFragment("/some/skylark/file.bzl")); + + assertThat(imp.getImportString()).named("getImportString()").isEqualTo("/some/skylark/file"); + assertThat(imp.hasAbsolutePath()).named("hasAbsolutePath()").isTrue(); + assertThat(imp.getAbsolutePath()).named("getAbsolutePath()") + .isEqualTo(new PathFragment("/some/skylark/file.bzl")); + + int startOffset = stmt.getImportLocation().getStartOffset(); + int endOffset = stmt.getImportLocation().getEndOffset(); + assertThat(startOffset).named("getStartOffset()").isEqualTo(5); + assertThat(endOffset).named("getEndOffset()") + .isEqualTo(startOffset + importString.length() + 2); } private void validNonAbsoluteImportTest(String importString, String containingFileLabelString, @@ -1098,11 +1107,19 @@ parseFileForSkylark("load('" + importString + "', 'fun_test')\n"); LoadStatement stmt = (LoadStatement) statements.get(0); SkylarkImport imp = stmt.getImport(); - assertThat(imp.getImportString()).isEqualTo(importString); - assertThat(imp.hasAbsolutePath()).isFalse(); + + assertThat(imp.getImportString()).named("getImportString()").isEqualTo(importString); + assertThat(imp.hasAbsolutePath()).named("hasAbsolutePath()").isFalse(); + Label containingFileLabel = Label.parseAbsoluteUnchecked(containingFileLabelString); - assertThat(imp.getLabel(containingFileLabel)) - .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString)); + assertThat(imp.getLabel(containingFileLabel)).named("containingFileLabel()") + .isEqualTo(Label.parseAbsoluteUnchecked(expectedLabelString)); + + int startOffset = stmt.getImportLocation().getStartOffset(); + int endOffset = stmt.getImportLocation().getEndOffset(); + assertThat(startOffset).named("getStartOffset()").isEqualTo(5); + assertThat(endOffset).named("getEndOffset()") + .isEqualTo(startOffset + importString.length() + 2); } private void invalidImportTest(String importString, String expectedMsg) {