Revert recent change to TargetPattern.SingleTarget. It made a pending unrelated Bazel FR (https://github.com/bazelbuild/bazel/issues/7773) more cumbersome to implement.

RELNOTES: None
PiperOrigin-RevId: 246007951
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 17afd70..be65076 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,6 +24,8 @@
 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;
@@ -281,8 +283,8 @@
     throw new IllegalStateException();
   }
 
-  /** For patterns of type {@link Type#SINGLE_TARGET}, returns the {@link Label} of the target. */
-  public Label getSingleTargetLabel() {
+  /** For patterns of type {@link Type#SINGLE_TARGET}, returns the target path. */
+  public String getSingleTargetPath() {
     throw new IllegalStateException();
   }
 
@@ -304,11 +306,14 @@
 
   private static final class SingleTarget extends TargetPattern {
 
-    private final Label label;
+    private final String targetName;
+    private final PackageIdentifier directory;
 
-    private SingleTarget(Label label, String originalPattern, String offset) {
+    private SingleTarget(
+        String targetName, PackageIdentifier directory, String originalPattern, String offset) {
       super(Type.SINGLE_TARGET, originalPattern, offset);
-      this.label = Preconditions.checkNotNull(label);
+      this.targetName = Preconditions.checkNotNull(targetName);
+      this.directory = Preconditions.checkNotNull(directory);
     }
 
     @Override
@@ -318,7 +323,7 @@
         ImmutableSet<PathFragment> excludedSubdirectories,
         BatchCallback<T, E> callback,
         Class<E> exceptionClass) throws TargetParsingException, E, InterruptedException {
-      callback.process(resolver.getExplicitTarget(label).getTargets());
+      callback.process(resolver.getExplicitTarget(label(targetName)).getTargets());
     }
 
     @Override
@@ -328,7 +333,7 @@
 
     @Override
     public PackageIdentifier getDirectoryForTargetOrTargetsInPackage() {
-      return label.getPackageIdentifier();
+      return directory;
     }
 
     @Override
@@ -337,8 +342,8 @@
     }
 
     @Override
-    public Label getSingleTargetLabel() {
-      return label;
+    public String getSingleTargetPath() {
+      return targetName;
     }
 
     @Override
@@ -350,12 +355,12 @@
         return false;
       }
       SingleTarget that = (SingleTarget) o;
-      return label.equals(that.label);
+      return targetName.equals(that.targetName) && directory.equals(that.directory);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(getType(), label);
+      return Objects.hash(getType(), targetName, directory);
     }
   }
 
@@ -813,15 +818,18 @@
       }
 
       if (includesRepo || wasOriginallyAbsolute || pattern.contains(":")) {
-        String fullLabelString = repository.getName() + "//" + pattern;
-        Label label;
+        PackageIdentifier packageIdentifier;
+        String fullLabel = repository.getName() + "//" + pattern;
         try {
-          label = Label.parseAbsolute(fullLabelString, ImmutableMap.of());
-        } catch (LabelSyntaxException e) {
+          PackageAndTarget packageAndTarget = LabelValidator.validateAbsoluteLabel(fullLabel);
+          packageIdentifier =
+              PackageIdentifier.create(
+                  repository, PathFragment.create(packageAndTarget.getPackageName()));
+        } catch (BadLabelException e) {
           String error = "invalid target format '" + originalPattern + "': " + e.getMessage();
           throw new TargetParsingException(error);
         }
-        return new SingleTarget(label, originalPattern, relativeDirectory);
+        return new SingleTarget(fullLabel, packageIdentifier, originalPattern, relativeDirectory);
       }
 
       // This is a stripped-down version of interpretPathAsTarget that does no I/O.  We have a basic