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
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java b/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
index bb64015..8d50693 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.syntax.Label;
@@ -43,7 +44,7 @@
       PUBLIC_LABEL = Label.parseAbsolute("//visibility:public");
       LEGACY_PUBLIC_LABEL = Label.parseAbsolute("//visibility:legacy_public");
       PRIVATE_LABEL = Label.parseAbsolute("//visibility:private");
-    } catch (Label.SyntaxException e) {
+    } catch (LabelSyntaxException e) {
       throw new IllegalStateException();
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
index cfb8143..fdb63e2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
@@ -18,16 +18,15 @@
 import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
-import com.google.devtools.build.lib.cmdline.TargetParsingException;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException;
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.lib.vfs.Path;
 
 import java.util.Map;
@@ -36,9 +35,15 @@
  * This creates the //external package, where targets not homed in this repository can be bound.
  */
 public class ExternalPackage extends Package {
-  public static final String NAME = "external";
-  public static final PackageIdentifier PACKAGE_IDENTIFIER =
-      PackageIdentifier.createInDefaultRepo(NAME);
+  public static final PackageIdentifier PACKAGE_IDENTIFIER;
+
+  static {
+    try {
+      PACKAGE_IDENTIFIER = PackageIdentifier.parse("//external");
+    } catch (LabelSyntaxException e) {
+      throw new IllegalStateException();
+    }
+  }
 
   private Map<RepositoryName, Rule> repositoryMap;
 
@@ -133,15 +138,16 @@
      */
     public Builder createAndAddRepositoryRule(RuleClass ruleClass, RuleClass bindRuleClass,
         Map<String, Object> kwargs, FuncallExpression ast, Environment env)
-        throws InvalidRuleException, NameConflictException, SyntaxException, InterruptedException {
+        throws InvalidRuleException, NameConflictException, LabelSyntaxException,
+            InterruptedException {
       StoredEventHandler eventHandler = new StoredEventHandler();
       Rule tempRule = RuleFactory.createRule(
           this, ruleClass, kwargs, eventHandler, ast, ast.getLocation(), env);
       addEvents(eventHandler.getEvents());
       try {
         repositoryMap.put(RepositoryName.create("@" + tempRule.getName()), tempRule);
-      } catch (TargetParsingException e) {
-        throw new SyntaxException(e.getMessage());
+      } catch (LabelSyntaxException e) {
+        throw new LabelSyntaxException(e.getMessage());
       }
       for (Map.Entry<String, Label> entry :
         ruleClass.getExternalBindingsFunction().apply(tempRule).entrySet()) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/License.java b/src/main/java/com/google/devtools/build/lib/packages/License.java
index f4e554e..98ed31d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/License.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/License.java
@@ -20,13 +20,13 @@
 import com.google.common.collect.ImmutableTable;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Table;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -209,7 +209,7 @@
         try {
           Label label = Label.parseAbsolute(str.substring("exception=".length()));
           exceptions.add(label);
-        } catch (SyntaxException e) {
+        } catch (LabelSyntaxException e) {
           throw new LicenseParsingException(e.getMessage());
         }
       } else {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 256aab0..0fbc726 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.collect.CollectionUtils;
 import com.google.devtools.build.lib.collect.ImmutableSortedKeyMap;
@@ -36,7 +37,6 @@
 import com.google.devtools.build.lib.packages.PackageFactory.Globber;
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.Canonicalizer;
 import com.google.devtools.build.lib.vfs.Path;
@@ -586,7 +586,7 @@
       throw new NoSuchTargetException(createLabel(targetName), "target '" + targetName
           + "' not declared in package '" + name + "'" + suffix + " defined by "
           + this.filename);
-    } catch (Label.SyntaxException e) {
+    } catch (LabelSyntaxException e) {
       throw new IllegalArgumentException(targetName);
     }
   }
@@ -594,9 +594,9 @@
   /**
    * Creates a label for a target inside this package.
    *
-   * @throws SyntaxException if the {@code targetName} is invalid
+   * @throws LabelSyntaxException if the {@code targetName} is invalid
    */
-  public Label createLabel(String targetName) throws SyntaxException {
+  public Label createLabel(String targetName) throws LabelSyntaxException {
     return Label.create(packageIdentifier, targetName);
   }
 
@@ -841,7 +841,7 @@
       try {
         buildFileLabel = createLabel(filename.getBaseName());
         addInputFile(buildFileLabel, Location.fromFile(filename));
-      } catch (Label.SyntaxException e) {
+      } catch (LabelSyntaxException e) {
         // This can't actually happen.
         throw new AssertionError("Package BUILD file has an illegal name: " + filename);
       }
@@ -1105,7 +1105,7 @@
       if (existing == null) {
         try {
           return addInputFile(createLabel(targetName), location);
-        } catch (Label.SyntaxException e) {
+        } catch (LabelSyntaxException e) {
           throw new IllegalArgumentException("FileTarget in package " + pkg.getName()
                                              + " has illegal name: " + targetName);
         }
@@ -1142,9 +1142,9 @@
     /**
      * Creates a label for a target inside this package.
      *
-     * @throws SyntaxException if the {@code targetName} is invalid
+     * @throws LabelSyntaxException if the {@code targetName} is invalid
      */
-    Label createLabel(String targetName) throws SyntaxException {
+    Label createLabel(String targetName) throws LabelSyntaxException {
       return Label.create(pkg.getPackageIdentifier(), targetName);
     }
 
@@ -1153,7 +1153,7 @@
      */
     void addPackageGroup(String name, Collection<String> packages, Collection<Label> includes,
         EventHandler eventHandler, Location location)
-        throws NameConflictException, Label.SyntaxException {
+        throws NameConflictException, LabelSyntaxException {
       PackageGroup group =
           new PackageGroup(createLabel(name), pkg, packages, includes, eventHandler, location);
       Target existing = targets.get(group.getName());
@@ -1190,7 +1190,7 @@
      */
     void addEnvironmentGroup(String name, List<Label> environments, List<Label> defaults,
         EventHandler eventHandler, Location location)
-        throws NameConflictException, SyntaxException {
+        throws NameConflictException, LabelSyntaxException {
 
       if (!checkForDuplicateLabels(environments, name, "environments", location, eventHandler)
           || !checkForDuplicateLabels(defaults, name, "defaults", location, eventHandler)) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index 2f0715c..9dbb7ef 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -23,8 +23,8 @@
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
+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.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.events.NullEventHandler;
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.syntax.GlobCriteria;
 import com.google.devtools.build.lib.syntax.GlobList;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
@@ -92,7 +91,7 @@
               public Label load(String labelString) throws PackageDeserializationException {
                 try {
                   return Label.parseAbsolute(labelString);
-                } catch (SyntaxException e) {
+                } catch (LabelSyntaxException e) {
                   throw new PackageDeserializationException("Invalid label: " + e.getMessage(), e);
                 }
               }
@@ -160,7 +159,7 @@
           deserializeLabels(packageGroupPb.getIncludedPackageGroupList()),
           NullEventHandler.INSTANCE,  // TODO(bazel-team): Handle errors properly
           EmptyLocation.INSTANCE);
-    } catch (Label.SyntaxException | Package.NameConflictException e) {
+    } catch (LabelSyntaxException | Package.NameConflictException e) {
       throw new PackageDeserializationException(e);
     }
   }
@@ -183,7 +182,7 @@
       context.packageBuilder.addRule(rule);
 
       Preconditions.checkState(!rule.containsErrors());
-    } catch (NameConflictException | SyntaxException e) {
+    } catch (NameConflictException | LabelSyntaxException e) {
       throw new PackageDeserializationException(e);
     }
   }
@@ -452,7 +451,7 @@
       builder = new Package.Builder(
           new PackageIdentifier(packagePb.getRepository(), new PathFragment(packagePb.getName())),
           null);
-    } catch (TargetParsingException e) {
+    } catch (LabelSyntaxException e) {
       throw new PackageDeserializationException(e);
     }
     StoredEventHandler eventHandler = new StoredEventHandler();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 4fd5428..1a7c376 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.LabelValidator;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.Event;
@@ -626,7 +627,7 @@
                 context.pkgBuilder.addEnvironmentGroup(
                     name, environments, defaults, context.eventHandler, loc);
                 return Runtime.NONE;
-              } catch (Label.SyntaxException e) {
+              } catch (LabelSyntaxException e) {
                 throw new EvalException(loc,
                     "environment group has invalid name: " + name + ": " + e.getMessage());
               } catch (Package.NameConflictException e) {
@@ -819,7 +820,7 @@
       context.pkgBuilder.addPackageGroup(name, packages, includes, context.eventHandler,
           ast.getLocation());
       return Runtime.NONE;
-    } catch (Label.SyntaxException e) {
+    } catch (LabelSyntaxException e) {
       throw new EvalException(ast.getLocation(),
           "package group has invalid name: " + name + ": " + e.getMessage());
     } catch (Package.NameConflictException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index da1c804..4802169 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -27,6 +27,7 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
+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;
@@ -36,7 +37,6 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.GlobList;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.lib.util.BinaryPredicate;
 
 import java.util.Collection;
@@ -484,7 +484,7 @@
    * will retain the relative order in which they were declared.
    */
   void populateOutputFiles(EventHandler eventHandler, Package.Builder pkgBuilder)
-      throws SyntaxException, InterruptedException {
+      throws LabelSyntaxException, InterruptedException {
     Preconditions.checkState(outputFiles == null);
     // Order is important here: implicit before explicit
     outputFiles = Lists.newArrayList();
@@ -496,7 +496,7 @@
   }
 
   // Explicit output files are user-specified attributes of type OUTPUT.
-  private void populateExplicitOutputFiles(EventHandler eventHandler) throws SyntaxException {
+  private void populateExplicitOutputFiles(EventHandler eventHandler) throws LabelSyntaxException {
     NonconfigurableAttributeMapper nonConfigurableAttributes =
         NonconfigurableAttributeMapper.of(this);
     for (Attribute attribute : ruleClass.getAttributes()) {
@@ -525,7 +525,7 @@
       for (String out : ruleClass.getImplicitOutputsFunction().getImplicitOutputs(attributeMap)) {
         try {
           addOutputFile(pkgBuilder.createLabel(out), eventHandler);
-        } catch (SyntaxException e) {
+        } catch (LabelSyntaxException e) {
           reportError("illegal output file name '" + out + "' in rule "
                       + getLabel(), eventHandler);
         }
@@ -536,7 +536,7 @@
   }
 
   private void addLabelOutput(Attribute attribute, Label label, EventHandler eventHandler)
-      throws SyntaxException {
+      throws LabelSyntaxException {
     if (!label.getPackageIdentifier().equals(pkg.getPackageIdentifier())) {
       throw new IllegalStateException("Label for attribute " + attribute
           + " should refer to '" + pkg.getName()
@@ -544,7 +544,7 @@
           + "' (label '" + label.getName() + "')");
     }
     if (label.getName().equals(".")) {
-      throw new SyntaxException("output file name can't be equal '.'");
+      throw new LabelSyntaxException("output file name can't be equal '.'");
     }
     OutputFile outputFile = addOutputFile(label, eventHandler);
     outputFileMap.put(attribute.getName(), outputFile);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index 1e7dd2a..34ff1af 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -29,6 +29,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Ordering;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
@@ -40,7 +41,6 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.GlobList;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.util.StringUtil;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -1315,7 +1315,7 @@
    */
   Rule createRuleWithLabel(Package.Builder pkgBuilder, Label ruleLabel,
       Map<String, Object> attributeValues, EventHandler eventHandler, FuncallExpression ast,
-      Location location) throws SyntaxException, InterruptedException {
+      Location location) throws LabelSyntaxException, InterruptedException {
     Rule rule = pkgBuilder.newRuleWithLabel(ruleLabel, this, null, location);
     createRuleCommon(rule, pkgBuilder, attributeValues, eventHandler, ast);
     return rule;
@@ -1323,7 +1323,7 @@
 
   private void createRuleCommon(Rule rule, Package.Builder pkgBuilder,
       Map<String, Object> attributeValues, EventHandler eventHandler, FuncallExpression ast)
-      throws SyntaxException, InterruptedException {
+      throws LabelSyntaxException, InterruptedException {
     populateRuleAttributeValues(
         rule, pkgBuilder, attributeValues, eventHandler, ast);
     rule.populateOutputFiles(eventHandler, pkgBuilder);
@@ -1365,7 +1365,7 @@
   Rule createRuleWithParsedAttributeValues(Label label,
       Package.Builder pkgBuilder, Location ruleLocation,
       Map<String, ParsedAttributeValue> attributeValues, EventHandler eventHandler)
-          throws SyntaxException, InterruptedException {
+          throws LabelSyntaxException, InterruptedException {
     Rule rule = pkgBuilder.newRuleWithLabel(label, this, null, ruleLocation);
     rule.checkValidityPredicate(eventHandler);
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
index f647c07..1eb2834 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
@@ -16,6 +16,7 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Package.NameConflictException;
@@ -24,7 +25,6 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.Label;
-import com.google.devtools.build.lib.syntax.Label.SyntaxException;
 import com.google.devtools.build.lib.syntax.UserDefinedFunction;
 import com.google.devtools.build.lib.util.Pair;
 
@@ -98,7 +98,7 @@
       // Test that this would form a valid label name -- in particular, this
       // catches cases where Makefile variables $(foo) appear in "name".
       label = pkgBuilder.createLabel(name);
-    } catch (Label.SyntaxException e) {
+    } catch (LabelSyntaxException e) {
       throw new InvalidRuleException("illegal rule name: " + name + ": " + e.getMessage());
     }
     boolean inWorkspaceFile =
@@ -115,7 +115,7 @@
     try {
       return ruleClass.createRuleWithLabel(
           pkgBuilder, label, generator.attributes, eventHandler, ast, generator.location);
-    } catch (SyntaxException e) {
+    } catch (LabelSyntaxException e) {
       throw new RuleFactory.InvalidRuleException(ruleClass + " " + e.getMessage());
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Type.java b/src/main/java/com/google/devtools/build/lib/packages/Type.java
index b88c7a1..fa2ce67 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Type.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Type.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.packages.License.DistributionType;
 import com.google.devtools.build.lib.packages.License.LicenseParsingException;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -670,7 +671,7 @@
       try {
         return currentRule.getRelative(
             STRING.convert(x, what, currentRule));
-      } catch (Label.SyntaxException e) {
+      } catch (LabelSyntaxException e) {
         throw new ConversionException("invalid label '" + x + "' in "
             + what + ": " + e.getMessage());
       }
@@ -796,7 +797,7 @@
           throw new ConversionException("label '" + value + "' is not in the current package");
         }
         return result;
-      } catch (Label.SyntaxException e) {
+      } catch (LabelSyntaxException e) {
         throw new ConversionException(
             "illegal output file name '" + value + "' in rule " + currentRule + ": "
             + e.getMessage());
@@ -1043,7 +1044,7 @@
 
       try {
         defaultConditionLabel = Label.parseAbsolute(DEFAULT_CONDITION_KEY);
-      } catch (Label.SyntaxException e) {
+      } catch (LabelSyntaxException e) {
         throw new IllegalStateException(DEFAULT_CONDITION_KEY + " is not a valid label");
       }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index 74def59..a19b36b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -16,6 +16,7 @@
 
 import static com.google.devtools.build.lib.syntax.Runtime.NONE;
 
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.LabelValidator;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Location;
@@ -119,11 +120,11 @@
             builder.addBindRule(ruleClass, nameLabel,
                 actual == null ? null : Label.parseAbsolute(actual), loc);
           } catch (RuleFactory.InvalidRuleException | Package.NameConflictException |
-            Label.SyntaxException e) {
+              LabelSyntaxException e) {
             throw new EvalException(loc, e.getMessage());
           }
 
-        } catch (Label.SyntaxException e) {
+        } catch (LabelSyntaxException e) {
           throw new EvalException(loc, e.getMessage());
         }
         return NONE;
@@ -146,7 +147,7 @@
           RuleClass bindRuleClass = ruleFactory.getRuleClass("bind");
           builder.createAndAddRepositoryRule(ruleClass, bindRuleClass, kwargs, ast, env);
         } catch (RuleFactory.InvalidRuleException | Package.NameConflictException |
-            Label.SyntaxException e) {
+            LabelSyntaxException e) {
           throw new EvalException(ast.getLocation(), e.getMessage());
         }
         return NONE;