aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2015-09-15 13:56:14 +0000
committerGravatar John Field <jfield@google.com>2015-09-15 20:27:47 +0000
commita6434361097c0ee18c706bf7a86a93324f68e284 (patch)
tree98a3109cb41b1f6cbcb5bae4f9452fdb81553ae4 /src/main/java/com/google/devtools/build/lib/syntax
parent5d737d642623749c8672916548b7c7c85b2ca9e6 (diff)
Parse the label syntax "@//a:b" so that eventually we can make that the syntax that means "refer to the main repository".
There isn't an overarching plan for what we are going to do with the cmdline package, which seems to be separated from the .syntax one in all sorts of awkward ways. -- MOS_MIGRATED_REVID=103088960
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/CommaSeparatedPackageNameListConverter.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Label.java80
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java3
4 files changed, 39 insertions, 51 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
index cdd75d3d23..bbaf3b0834 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
@@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.hash.HashCode;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Location;
@@ -97,7 +98,7 @@ public class BuildFileAST extends ASTNode {
try {
Label label = Label.parseAbsolute(((StringLiteral) arg).getValue());
result.add(label);
- } catch (Label.SyntaxException e) {
+ } catch (LabelSyntaxException e) {
// Ignore. This will be reported when the BUILD file is actually evaluated.
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/CommaSeparatedPackageNameListConverter.java b/src/main/java/com/google/devtools/build/lib/syntax/CommaSeparatedPackageNameListConverter.java
index 5d5c59892c..78faf36e30 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/CommaSeparatedPackageNameListConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/CommaSeparatedPackageNameListConverter.java
@@ -16,8 +16,8 @@ package com.google.devtools.build.lib.syntax;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.common.options.Converter;
import com.google.devtools.common.options.OptionsParsingException;
@@ -40,7 +40,7 @@ public class CommaSeparatedPackageNameListConverter
for (String s : SPACE_SPLITTER.split(input)) {
try {
list.add(PackageIdentifier.parse(s));
- } catch (TargetParsingException e) {
+ } catch (LabelSyntaxException e) {
throw new OptionsParsingException(e.getMessage());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Label.java b/src/main/java/com/google/devtools/build/lib/syntax/Label.java
index c7994d9538..6c712c3ead 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Label.java
@@ -15,10 +15,10 @@ package com.google.devtools.build.lib.syntax;
import com.google.common.base.Preconditions;
import com.google.common.collect.ComparisonChain;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.LabelValidator;
import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.util.StringCanonicalizer;
@@ -42,15 +42,6 @@ import java.io.Serializable;
public final class Label implements Comparable<Label>, Serializable {
/**
- * Thrown by the parsing methods to indicate a bad label.
- */
- public static class SyntaxException extends Exception {
- public SyntaxException(String message) {
- super(message);
- }
- }
-
- /**
* Factory for Labels from absolute string form. e.g.
* <pre>
* //foo/bar
@@ -59,7 +50,7 @@ public final class Label implements Comparable<Label>, Serializable {
* {@literal @}foo//bar:baz
* </pre>
*/
- public static Label parseAbsolute(String absName) throws SyntaxException {
+ public static Label parseAbsolute(String absName) throws LabelSyntaxException {
String repo = PackageIdentifier.DEFAULT_REPOSITORY;
int packageStartPos = absName.indexOf("//");
if (packageStartPos > 0) {
@@ -71,8 +62,8 @@ public final class Label implements Comparable<Label>, Serializable {
validate(labelParts.getPackageName(), labelParts.getTargetName());
return new Label(new PackageIdentifier(repo, new PathFragment(labelParts.getPackageName())),
labelParts.getTargetName());
- } catch (BadLabelException | TargetParsingException e) {
- throw new SyntaxException(e.getMessage());
+ } catch (BadLabelException e) {
+ throw new LabelSyntaxException(e.getMessage());
}
}
@@ -86,7 +77,7 @@ public final class Label implements Comparable<Label>, Serializable {
public static Label parseAbsoluteUnchecked(String absName) {
try {
return parseAbsolute(absName);
- } catch (SyntaxException e) {
+ } catch (LabelSyntaxException e) {
throw new IllegalArgumentException(e);
}
}
@@ -99,9 +90,9 @@ public final class Label implements Comparable<Label>, Serializable {
* {@link LabelValidator#validatePackageName}.
* @param targetName The name of the target within the package. Must be
* valid according to {@link LabelValidator#validateTargetName}.
- * @throws SyntaxException if either of the arguments was invalid.
+ * @throws LabelSyntaxException if either of the arguments was invalid.
*/
- public static Label create(String packageName, String targetName) throws SyntaxException {
+ public static Label create(String packageName, String targetName) throws LabelSyntaxException {
return new Label(packageName, targetName);
}
@@ -110,7 +101,7 @@ public final class Label implements Comparable<Label>, Serializable {
* to be created.
*/
public static Label create(PackageIdentifier packageId, String targetName)
- throws SyntaxException {
+ throws LabelSyntaxException {
return new Label(packageId, targetName);
}
@@ -131,10 +122,10 @@ public final class Label implements Comparable<Label>, Serializable {
* possible, because it is sometimes necessary to resolve a relative label before the package path
* is setup; in particular, before the tools/defaults package is created.
*
- * @throws SyntaxException if the resulting label is not valid
+ * @throws LabelSyntaxException if the resulting label is not valid
*/
public static Label parseCommandLineLabel(String label, PathFragment workspaceRelativePath)
- throws SyntaxException {
+ throws LabelSyntaxException {
Preconditions.checkArgument(!workspaceRelativePath.isAbsolute());
if (LabelValidator.isAbsolute(label)) {
return parseAbsolute(label);
@@ -154,11 +145,11 @@ public final class Label implements Comparable<Label>, Serializable {
* Validates the given target name and returns a canonical String instance if it is valid.
* Otherwise it throws a SyntaxException.
*/
- private static String canonicalizeTargetName(String name) throws SyntaxException {
+ private static String canonicalizeTargetName(String name) throws LabelSyntaxException {
String error = LabelValidator.validateTargetName(name);
if (error != null) {
error = "invalid target name '" + StringUtilities.sanitizeControlChars(name) + "': " + error;
- throw new SyntaxException(error);
+ throw new LabelSyntaxException(error);
}
// TODO(bazel-team): This should be an error, but we can't make it one for legacy reasons.
@@ -173,19 +164,22 @@ public final class Label implements Comparable<Label>, Serializable {
* Validates the given package name and returns a canonical PathFragment instance if it is valid.
* Otherwise it throws a SyntaxException.
*/
- private static PathFragment validate(String packageName, String name) throws SyntaxException {
- String error = LabelValidator.validatePackageName(packageName);
- if (error != null) {
- error = "invalid package name '" + packageName + "': " + error;
+ private static PackageIdentifier validate(String packageIdentifier, String name)
+ throws LabelSyntaxException {
+ String error = null;
+ try {
+ return PackageIdentifier.parse(packageIdentifier);
+ } catch (LabelSyntaxException e) {
+ error = e.getMessage();
+ error = "invalid package name '" + packageIdentifier + "': " + error;
// This check is just for a more helpful error message
// i.e. valid target name, invalid package name, colon-free label form
// used => probably they meant "//foo:bar.c" not "//foo/bar.c".
- if (packageName.endsWith("/" + name)) {
+ if (packageIdentifier.endsWith("/" + name)) {
error += " (perhaps you meant \":" + name + "\"?)";
}
- throw new SyntaxException(error);
+ throw new LabelSyntaxException(error);
}
- return new PathFragment(packageName);
}
/** The name and repository of the package. */
@@ -201,32 +195,24 @@ public final class Label implements Comparable<Label>, Serializable {
* bazillion tests that use invalid package names (taking advantage of the fact that calling
* Label(PathFragment, String) doesn't validate the package name).
*/
- private Label(String packageName, String name) throws SyntaxException {
- this(validate(packageName, name), name);
- }
-
- /**
- * Constructor from canonical valid package name and a target name. The target
- * name is checked for validity and a SyntaxException is throw if it isn't.
- */
- private Label(PathFragment packageName, String name) throws SyntaxException {
- this(PackageIdentifier.createInDefaultRepo(packageName), name);
+ private Label(String packageIdentifier, String name) throws LabelSyntaxException {
+ this(validate(packageIdentifier, name), name);
}
private Label(PackageIdentifier packageIdentifier, String name)
- throws SyntaxException {
+ throws LabelSyntaxException {
Preconditions.checkNotNull(packageIdentifier);
Preconditions.checkNotNull(name);
try {
this.packageIdentifier = packageIdentifier;
this.name = canonicalizeTargetName(name);
- } catch (SyntaxException e) {
+ } catch (LabelSyntaxException e) {
// This check is just for a more helpful error message
// i.e. valid target name, invalid package name, colon-free label form
// used => probably they meant "//foo:bar.c" not "//foo/bar.c".
if (packageIdentifier.getPackageFragment().getPathString().endsWith("/" + name)) {
- throw new SyntaxException(e.getMessage() + " (perhaps you meant \":" + name + "\"?)");
+ throw new LabelSyntaxException(e.getMessage() + " (perhaps you meant \":" + name + "\"?)");
}
throw e;
}
@@ -317,9 +303,9 @@ public final class Label implements Comparable<Label>, Serializable {
/**
* Returns a label in the same package as this label with the given target name.
*
- * @throws SyntaxException if {@code targetName} is not a valid target name
+ * @throws LabelSyntaxException if {@code targetName} is not a valid target name
*/
- public Label getLocalTargetLabel(String targetName) throws SyntaxException {
+ public Label getLocalTargetLabel(String targetName) throws LabelSyntaxException {
return new Label(packageIdentifier, targetName);
}
@@ -341,14 +327,14 @@ public final class Label implements Comparable<Label>, Serializable {
+ "Label(\"//foo/bar:baz\").relative(\":quux\") == Label(\"//foo/bar:quux\")\n"
+ "Label(\"//foo/bar:baz\").relative(\"//wiz:quux\") == Label(\"//wiz:quux\")\n"
+ "</pre>")
- public Label getRelative(String relName) throws SyntaxException {
+ public Label getRelative(String relName) throws LabelSyntaxException {
if (relName.length() == 0) {
- throw new SyntaxException("empty package-relative label");
+ throw new LabelSyntaxException("empty package-relative label");
}
if (LabelValidator.isAbsolute(relName)) {
return parseAbsolute(relName);
} else if (relName.equals(":")) {
- throw new SyntaxException("':' is not a valid package-relative label");
+ throw new LabelSyntaxException("':' is not a valid package-relative label");
} else if (relName.charAt(0) == ':') {
return getLocalTargetLabel(relName.substring(1));
} else {
@@ -372,7 +358,7 @@ public final class Label implements Comparable<Label>, Serializable {
return new Label(
new PackageIdentifier(packageIdentifier.getRepository(), relative.getPackageFragment()),
relative.getName());
- } catch (Label.SyntaxException e) {
+ } catch (LabelSyntaxException e) {
// We are creating the new label from an existing one which is guaranteed to be valid, so
// this can't happen
throw new IllegalStateException(e);
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 97b04e67dd..2734e4ff6f 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
@@ -23,6 +23,7 @@ import com.google.common.base.Preconditions;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Location;
@@ -646,7 +647,7 @@ class Parser {
Parser parser = new Parser(lexer, eventHandler, locator, parsingMode);
parser.addIncludedFiles(this.includedFiles);
list.addAll(parser.parseFileInput());
- } catch (Label.SyntaxException e) {
+ } catch (LabelSyntaxException e) {
reportError(location, "Invalid label '" + labelName + "'");
} catch (IOException e) {
reportError(location, "Include of '" + labelName + "' failed: " + e.getMessage());