Fix getBuildFiles to not assume BUILD is the name of the build file.

Fixes #4056.

Change-Id: Ia7425c2146f15e9293605ee3da53007805e82275
PiperOrigin-RevId: 177813070
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 35c412f..f3bdc78 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -99,6 +99,7 @@
 import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey;
 import com.google.devtools.build.lib.skyframe.TransitiveTraversalValue;
 import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.EvaluationResult;
@@ -760,15 +761,26 @@
         }
 
         for (Label subinclude : extensions) {
-          addIfUniqueLabel(getSubincludeTarget(subinclude, pkg), seenLabels, dependentFiles);
 
+          Target subincludeTarget = getSubincludeTarget(subinclude, pkg);
+          addIfUniqueLabel(subincludeTarget, seenLabels, dependentFiles);
+
+          // Also add the BUILD file of the subinclude.
           if (buildFiles) {
-            // Also add the BUILD file of the subinclude.
-            addIfUniqueLabel(
-                getSubincludeTarget(
-                    Label.createUnvalidated(subinclude.getPackageIdentifier(), "BUILD"), pkg),
-                seenLabels,
-                dependentFiles);
+            Path buildFileForSubinclude = null;
+            try {
+              buildFileForSubinclude =
+                  pkgPath.getPackageBuildFile(subincludeTarget.getLabel().getPackageIdentifier());
+            } catch (NoSuchPackageException e) {
+              throw new QueryException(
+                  subincludeTarget.getLabel().getPackageIdentifier() + " does not exist in graph");
+            }
+            Label buildFileLabel =
+                Label.createUnvalidated(
+                    subincludeTarget.getLabel().getPackageIdentifier(),
+                    buildFileForSubinclude.getBaseName());
+
+            addIfUniqueLabel(new FakeLoadTarget(buildFileLabel, pkg), seenLabels, dependentFiles);
           }
         }
       }
@@ -782,7 +794,7 @@
     }
   }
 
-  private static Target getSubincludeTarget(Label label, Package pkg) {
+  private Target getSubincludeTarget(Label label, Package pkg) {
     return new FakeLoadTarget(label, pkg);
   }
 
@@ -793,30 +805,36 @@
   }
 
   @ThreadSafe
-  @Override
-  public Target getTarget(Label label)
-      throws TargetNotFoundException, QueryException, InterruptedException {
-    SkyKey packageKey = PackageValue.key(label.getPackageIdentifier());
-    try {
+  private Package getPackage(PackageIdentifier packageIdentifier)
+      throws InterruptedException, QueryException, NoSuchPackageException {
+    SkyKey packageKey = PackageValue.key(packageIdentifier);
       PackageValue packageValue = (PackageValue) graph.getValue(packageKey);
       if (packageValue != null) {
         Package pkg = packageValue.getPackage();
         if (pkg.containsErrors()) {
-          throw new BuildFileContainsErrorsException(label.getPackageIdentifier());
+        throw new BuildFileContainsErrorsException(packageIdentifier);
         }
-        return packageValue.getPackage().getTarget(label.getName());
+      return pkg;
       } else {
-        NoSuchThingException exception = (NoSuchThingException) graph.getException(packageKey);
+      NoSuchPackageException exception = (NoSuchPackageException) graph.getException(packageKey);
         if (exception != null) {
           throw exception;
         }
         if (graph.isCycle(packageKey)) {
-          throw new NoSuchPackageException(
-              label.getPackageIdentifier(), "Package depends on a cycle");
+        throw new NoSuchPackageException(packageIdentifier, "Package depends on a cycle");
         } else {
           throw new QueryException(packageKey + " does not exist in graph");
         }
       }
+  }
+
+  @ThreadSafe
+  @Override
+  public Target getTarget(Label label)
+      throws TargetNotFoundException, QueryException, InterruptedException {
+    try {
+      Package pkg = getPackage(label.getPackageIdentifier());
+      return pkg.getTarget(label.getName());
     } catch (NoSuchThingException e) {
       throw new TargetNotFoundException(e);
     }