In the SingleTarget case of TargetPattern#parse, store the parsed Label. Then, use this Label during TargetPattern.SingleTarget#eval.

This is a slight simplification that lets us delete some code.

RELNOTES: None
PiperOrigin-RevId: 245263195
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
index 86476d3..17afd70 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
@@ -24,8 +24,6 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException;
-import com.google.devtools.build.lib.cmdline.LabelValidator.PackageAndTarget;
 import com.google.devtools.build.lib.util.BatchCallback;
 import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.util.ThreadSafeBatchCallback;
@@ -283,8 +281,8 @@
     throw new IllegalStateException();
   }
 
-  /** For patterns of type {@link Type#SINGLE_TARGET}, returns the target path. */
-  public String getSingleTargetPath() {
+  /** For patterns of type {@link Type#SINGLE_TARGET}, returns the {@link Label} of the target. */
+  public Label getSingleTargetLabel() {
     throw new IllegalStateException();
   }
 
@@ -306,14 +304,11 @@
 
   private static final class SingleTarget extends TargetPattern {
 
-    private final String targetName;
-    private final PackageIdentifier directory;
+    private final Label label;
 
-    private SingleTarget(
-        String targetName, PackageIdentifier directory, String originalPattern, String offset) {
+    private SingleTarget(Label label, String originalPattern, String offset) {
       super(Type.SINGLE_TARGET, originalPattern, offset);
-      this.targetName = Preconditions.checkNotNull(targetName);
-      this.directory = Preconditions.checkNotNull(directory);
+      this.label = Preconditions.checkNotNull(label);
     }
 
     @Override
@@ -323,7 +318,7 @@
         ImmutableSet<PathFragment> excludedSubdirectories,
         BatchCallback<T, E> callback,
         Class<E> exceptionClass) throws TargetParsingException, E, InterruptedException {
-      callback.process(resolver.getExplicitTarget(label(targetName)).getTargets());
+      callback.process(resolver.getExplicitTarget(label).getTargets());
     }
 
     @Override
@@ -333,7 +328,7 @@
 
     @Override
     public PackageIdentifier getDirectoryForTargetOrTargetsInPackage() {
-      return directory;
+      return label.getPackageIdentifier();
     }
 
     @Override
@@ -342,8 +337,8 @@
     }
 
     @Override
-    public String getSingleTargetPath() {
-      return targetName;
+    public Label getSingleTargetLabel() {
+      return label;
     }
 
     @Override
@@ -355,12 +350,12 @@
         return false;
       }
       SingleTarget that = (SingleTarget) o;
-      return targetName.equals(that.targetName) && directory.equals(that.directory);
+      return label.equals(that.label);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(getType(), targetName, directory);
+      return Objects.hash(getType(), label);
     }
   }
 
@@ -818,18 +813,15 @@
       }
 
       if (includesRepo || wasOriginallyAbsolute || pattern.contains(":")) {
-        PackageIdentifier packageIdentifier;
-        String fullLabel = repository.getName() + "//" + pattern;
+        String fullLabelString = repository.getName() + "//" + pattern;
+        Label label;
         try {
-          PackageAndTarget packageAndTarget = LabelValidator.validateAbsoluteLabel(fullLabel);
-          packageIdentifier = PackageIdentifier.create(repository,
-              PathFragment.create(packageAndTarget.getPackageName()));
-        } catch (BadLabelException e) {
+          label = Label.parseAbsolute(fullLabelString, ImmutableMap.of());
+        } catch (LabelSyntaxException e) {
           String error = "invalid target format '" + originalPattern + "': " + e.getMessage();
           throw new TargetParsingException(error);
         }
-        return new SingleTarget(
-            fullLabel, packageIdentifier, originalPattern, relativeDirectory);
+        return new SingleTarget(label, originalPattern, relativeDirectory);
       }
 
       // This is a stripped-down version of interpretPathAsTarget that does no I/O.  We have a basic
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
index 1aea611..1daa967 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
@@ -247,15 +247,7 @@
           }
         }
       } else if (excludeSingleTargets && laterParsedPattern.getType() == Type.SINGLE_TARGET) {
-        try {
-          Label label =
-              Label.parseAbsolute(
-                  laterParsedPattern.getSingleTargetPath(),
-                  /*repositoryMapping=*/ ImmutableMap.of());
-          excludedSingleTargetsBuilder.add(label);
-        } catch (LabelSyntaxException e) {
-          indicesOfNegativePatternsThatNeedToBeIncludedBuilder.add(j);
-        }
+        excludedSingleTargetsBuilder.add(laterParsedPattern.getSingleTargetLabel());
       } else {
         indicesOfNegativePatternsThatNeedToBeIncludedBuilder.add(j);
       }