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/pkgcache/PackageManager.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java
index d38e16e..08761f3 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java
@@ -14,14 +14,13 @@
 package com.google.devtools.build.lib.pkgcache;
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
-import com.google.devtools.build.lib.packages.CachingPackageLocator;
 import java.io.PrintStream;
 
 /**
- * A PackageManager keeps state about loaded packages around for quick lookup, and provides
- * related functionality: Recursive package finding, loaded package checking, etc.
+ * A PackageManager keeps state about loaded packages around for quick lookup, and provides related
+ * functionality: Recursive package finding, loaded package checking, etc.
  */
-public interface PackageManager extends PackageProvider, CachingPackageLocator {
+public interface PackageManager extends PackageProvider {
   PackageManagerStatistics getAndClearStatistics();
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java
index e04a7c6..f42ea3d 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
+import com.google.devtools.build.lib.packages.CachingPackageLocator;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.Package;
 
@@ -24,7 +25,7 @@
  *
  * <p><b>Concurrency</b>: Implementations should be thread safe for {@link #getPackage}.
  */
-public interface PackageProvider extends TargetProvider {
+public interface PackageProvider extends TargetProvider, CachingPackageLocator {
 
   /**
    * Returns the {@link Package} named "packageName". If there is no such package (e.g. {@code
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java
index 1fbc8d9..5445d40 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java
@@ -33,9 +33,9 @@
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.pkgcache.PackageProvider;
 import com.google.devtools.build.lib.pkgcache.TargetEdgeObserver;
 import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
-import com.google.devtools.build.lib.pkgcache.TargetProvider;
 import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader;
 import com.google.devtools.build.lib.query2.engine.Callback;
 import com.google.devtools.build.lib.query2.engine.DigraphQueryEvalResult;
@@ -50,6 +50,7 @@
 import com.google.devtools.build.lib.query2.engine.SkyframeRestartQueryException;
 import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
 import com.google.devtools.build.lib.query2.engine.Uniquifier;
+import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -70,7 +71,7 @@
   private final Map<String, Set<Target>> resolvedTargetPatterns = new HashMap<>();
   private final TargetPatternEvaluator targetPatternEvaluator;
   private final TransitivePackageLoader transitivePackageLoader;
-  private final TargetProvider targetProvider;
+  private final PackageProvider packageProvider;
   private final Digraph<Target> graph = new Digraph<>();
   private final ErrorPrintingTargetEdgeErrorObserver errorObserver;
   private final LabelVisitor labelVisitor;
@@ -92,7 +93,7 @@
    */
   BlazeQueryEnvironment(
       TransitivePackageLoader transitivePackageLoader,
-      TargetProvider targetProvider,
+      PackageProvider packageProvider,
       TargetPatternEvaluator targetPatternEvaluator,
       boolean keepGoing,
       boolean strictScope,
@@ -104,10 +105,10 @@
     super(keepGoing, strictScope, labelFilter, eventHandler, settings, extraFunctions);
     this.targetPatternEvaluator = targetPatternEvaluator;
     this.transitivePackageLoader = transitivePackageLoader;
-    this.targetProvider = targetProvider;
+    this.packageProvider = packageProvider;
     this.errorObserver = new ErrorPrintingTargetEdgeErrorObserver(this.eventHandler);
     this.loadingPhaseThreads = loadingPhaseThreads;
-    this.labelVisitor = new LabelVisitor(targetProvider, dependencyFilter);
+    this.labelVisitor = new LabelVisitor(packageProvider, dependencyFilter);
   }
 
   @Override
@@ -365,7 +366,7 @@
 
   private Target getTargetOrThrow(Label label)
       throws NoSuchThingException, SkyframeRestartQueryException, InterruptedException {
-    Target target = targetProvider.getTarget(eventHandler, label);
+    Target target = packageProvider.getTarget(eventHandler, label);
     if (target == null) {
       throw new SkyframeRestartQueryException();
     }
@@ -406,15 +407,21 @@
         }
 
         for (Label subinclude : extensions) {
-          addIfUniqueLabel(getSubincludeTarget(subinclude, pkg), seenLabels, dependentFiles);
+
+          Node<Target> subincludeTarget = getSubincludeTarget(subinclude, pkg);
+          addIfUniqueLabel(subincludeTarget, seenLabels, dependentFiles);
 
           // Also add the BUILD file of the subinclude.
           if (buildFiles) {
+            Path buildFileForSubinclude =
+                packageProvider.getBuildFileForPackage(
+                    subincludeTarget.getLabel().getLabel().getPackageIdentifier());
+            Label buildFileLabel =
+                Label.createUnvalidated(
+                    subincludeTarget.getLabel().getLabel().getPackageIdentifier(),
+                    buildFileForSubinclude.getBaseName());
             addIfUniqueLabel(
-                getSubincludeTarget(
-                    Label.createUnvalidated(subinclude.getPackageIdentifier(), "BUILD"), pkg),
-                seenLabels,
-                dependentFiles);
+                getNode(new FakeLoadTarget(buildFileLabel, pkg)), seenLabels, dependentFiles);
           }
         }
       }
@@ -440,7 +447,7 @@
     }
   }
 
-  private Node<Target> getSubincludeTarget(final Label label, Package pkg) {
+  private Node<Target> getSubincludeTarget(Label label, Package pkg) {
     return getNode(new FakeLoadTarget(label, pkg));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java b/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java
index 0f52e88..da08aa2 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java
@@ -19,9 +19,9 @@
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.pkgcache.PackageProvider;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
-import com.google.devtools.build.lib.pkgcache.TargetProvider;
 import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Setting;
@@ -36,7 +36,7 @@
   public AbstractBlazeQueryEnvironment<Target> create(
       TransitivePackageLoader transitivePackageLoader,
       WalkableGraphFactory graphFactory,
-      TargetProvider targetProvider,
+      PackageProvider packageProvider,
       TargetPatternEvaluator targetPatternEvaluator,
       boolean keepGoing,
       boolean strictScope,
@@ -63,9 +63,17 @@
           packagePath,
           blockUniverseEvaluationErrors);
     } else {
-      return new BlazeQueryEnvironment(transitivePackageLoader, targetProvider,
-          targetPatternEvaluator, keepGoing, strictScope, loadingPhaseThreads, labelFilter,
-          eventHandler, settings, functions);
+      return new BlazeQueryEnvironment(
+          transitivePackageLoader,
+          packageProvider,
+          targetPatternEvaluator,
+          keepGoing,
+          strictScope,
+          loadingPhaseThreads,
+          labelFilter,
+          eventHandler,
+          settings,
+          functions);
     }
   }
 
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);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
index f14db5a..af785a5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
@@ -77,6 +77,7 @@
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.Fingerprint;
 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.skyframe.LegacySkyKey;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -560,6 +561,15 @@
     public boolean isPackage(ExtendedEventHandler eventHandler, PackageIdentifier packageName) {
       throw new UnsupportedOperationException();
     }
+
+    @Override
+    public Path getBuildFileForPackage(PackageIdentifier packageId) {
+      Package pkg = pkgMap.get(packageId);
+      if (pkg == null) {
+        return null;
+      }
+      return pkg.getBuildFile().getPath();
+    }
   }
 
   private static class BrokenQueryScopeException extends Exception {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
index 81c7c7a..285c45f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
@@ -52,9 +52,11 @@
 public final class EnvironmentBackedRecursivePackageProvider implements RecursivePackageProvider {
 
   private final Environment env;
+  private final PathPackageLocator pkgPath;
 
-  public EnvironmentBackedRecursivePackageProvider(Environment env) {
+  public EnvironmentBackedRecursivePackageProvider(Environment env, PathPackageLocator pkgPath) {
     this.env = env;
+    this.pkgPath = pkgPath;
   }
 
   @Override
@@ -94,6 +96,15 @@
   }
 
   @Override
+  public Path getBuildFileForPackage(PackageIdentifier packageName) {
+    try {
+      return pkgPath.getPackageBuildFile(packageName);
+    } catch (NoSuchPackageException e) {
+      return null;
+    }
+  }
+
+  @Override
   public boolean isPackage(ExtendedEventHandler eventHandler, PackageIdentifier packageId)
       throws MissingDepException, InterruptedException {
     SkyKey packageLookupKey = PackageLookupValue.key(packageId);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
index 7985fcf..d7e74ff 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
@@ -132,6 +132,14 @@
     return pkgResults.build();
   }
 
+  @Override
+  public Path getBuildFileForPackage(PackageIdentifier packageName) {
+    try {
+      return pkgPath.getPackageBuildFile(packageName);
+    } catch (NoSuchPackageException e) {
+      return null;
+    }
+  }
 
   @Override
   public boolean isPackage(ExtendedEventHandler eventHandler, PackageIdentifier packageName)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
index a137551..fd0f08f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
@@ -144,7 +144,7 @@
 
     public DepsOfPatternPreparer(Environment env, PathPackageLocator pkgPath) {
       this.env = env;
-      this.packageProvider = new EnvironmentBackedRecursivePackageProvider(env);
+      this.packageProvider = new EnvironmentBackedRecursivePackageProvider(env, pkgPath);
       this.pkgPath = pkgPath;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index f93c96e..4e68fb7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -260,7 +260,9 @@
           SkyFunctions.TARGET_PATTERN,
           SkyFunctions.PREPARE_DEPS_OF_PATTERN,
           SkyFunctions.WORKSPACE_FILE,
-          SkyFunctions.EXTERNAL_PACKAGE);
+          SkyFunctions.EXTERNAL_PACKAGE,
+          SkyFunctions.TARGET_PATTERN,
+          SkyFunctions.TARGET_PATTERN_PHASE);
 
   @Override
   protected void onNewPackageLocator(PathPackageLocator oldLocator, PathPackageLocator pkgLocator) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 6ab30a3..1e89fe5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -374,7 +374,7 @@
         SkyFunctions.SKYLARK_IMPORTS_LOOKUP,
         newSkylarkImportLookupFunction(ruleClassProvider, pkgFactory));
     map.put(SkyFunctions.GLOB, newGlobFunction());
-    map.put(SkyFunctions.TARGET_PATTERN, new TargetPatternFunction());
+    map.put(SkyFunctions.TARGET_PATTERN, new TargetPatternFunction(pkgLocator));
     map.put(SkyFunctions.PREPARE_DEPS_OF_PATTERNS, new PrepareDepsOfPatternsFunction());
     map.put(SkyFunctions.PREPARE_DEPS_OF_PATTERN, new PrepareDepsOfPatternFunction(pkgLocator));
     map.put(
@@ -387,7 +387,7 @@
     map.put(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, new BlacklistedPackagePrefixesFunction());
     map.put(SkyFunctions.TESTS_IN_SUITE, new TestsInSuiteFunction());
     map.put(SkyFunctions.TEST_SUITE_EXPANSION, new TestSuiteExpansionFunction());
-    map.put(SkyFunctions.TARGET_PATTERN_PHASE, new TargetPatternPhaseFunction());
+    map.put(SkyFunctions.TARGET_PATTERN_PHASE, new TargetPatternPhaseFunction(pkgLocator));
     map.put(SkyFunctions.RECURSIVE_PKG, new RecursivePkgFunction(directories));
     map.put(
         SkyFunctions.PACKAGE,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
index b97e51a..b4a012f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.concurrent.MultisetSemaphore;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.pkgcache.ParsingFailedEvent;
+import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.skyframe.EnvironmentBackedRecursivePackageProvider.MissingDepException;
 import com.google.devtools.build.lib.util.BatchCallback;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -33,6 +34,7 @@
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
 
 /**
@@ -41,7 +43,10 @@
  */
 public class TargetPatternFunction implements SkyFunction {
 
-  public TargetPatternFunction() {
+  private final AtomicReference<PathPackageLocator> pkgPath;
+
+  public TargetPatternFunction(AtomicReference<PathPackageLocator> pkgPath) {
+    this.pkgPath = pkgPath;
   }
 
   @Override
@@ -52,7 +57,7 @@
     ResolvedTargets<Target> resolvedTargets;
     try {
       EnvironmentBackedRecursivePackageProvider provider =
-          new EnvironmentBackedRecursivePackageProvider(env);
+          new EnvironmentBackedRecursivePackageProvider(env, pkgPath.get());
       RecursivePackageProviderBackedTargetPatternResolver resolver =
           new RecursivePackageProviderBackedTargetPatternResolver(
               provider,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java
index b3fd6e9..5a00582 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java
@@ -28,6 +28,7 @@
 import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
 import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner;
 import com.google.devtools.build.lib.pkgcache.ParsingFailedEvent;
+import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.pkgcache.TargetParsingCompleteEvent;
 import com.google.devtools.build.lib.pkgcache.TargetProvider;
 import com.google.devtools.build.lib.pkgcache.TestFilter;
@@ -45,6 +46,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
 
 /**
@@ -53,6 +55,12 @@
  */
 final class TargetPatternPhaseFunction implements SkyFunction {
 
+  private final AtomicReference<PathPackageLocator> pkgPath;
+
+  public TargetPatternPhaseFunction(AtomicReference<PathPackageLocator> pkgPath) {
+    this.pkgPath = pkgPath;
+  }
+
   @Override
   public TargetPatternPhaseValue compute(SkyKey key, Environment env) throws InterruptedException {
     TargetPatternPhaseKey options = (TargetPatternPhaseKey) key.argument();
@@ -74,7 +82,7 @@
     }
 
     // Determine targets to build:
-    ResolvedTargets<Target> targets = getTargetsToBuild(env, options);
+    ResolvedTargets<Target> targets = getTargetsToBuild(env, options, pkgPath.get());
 
     // If the --build_tests_only option was specified or we want to run tests, we need to determine
     // the list of targets to test. For that, we remove manual tests and apply the command-line
@@ -197,7 +205,8 @@
    * @param options the command-line arguments in structured form
    */
   private static ResolvedTargets<Target> getTargetsToBuild(
-      Environment env, TargetPatternPhaseKey options) throws InterruptedException {
+      Environment env, TargetPatternPhaseKey options, PathPackageLocator pkgPath)
+      throws InterruptedException {
     List<TargetPatternKey> patternSkyKeys = new ArrayList<>();
     for (TargetPatternSkyKeyOrException keyOrException :
         TargetPatternValue.keys(
@@ -249,7 +258,7 @@
         .filter(TargetUtils.tagFilter(options.getBuildTargetFilter()))
         .build();
     if (options.getCompileOneDependency()) {
-      TargetProvider targetProvider = new EnvironmentBackedRecursivePackageProvider(env);
+      TargetProvider targetProvider = new EnvironmentBackedRecursivePackageProvider(env, pkgPath);
       try {
         return new CompileOneDependencyTransformer(targetProvider)
             .transformCompileOneDependency(env.getListener(), result);
diff --git a/src/test/shell/integration/bazel_query_test.sh b/src/test/shell/integration/bazel_query_test.sh
index eed50de..f5de27c 100755
--- a/src/test/shell/integration/bazel_query_test.sh
+++ b/src/test/shell/integration/bazel_query_test.sh
@@ -26,6 +26,7 @@
 #### TESTS #############################################################
 
 function test_does_not_fail_horribly() {
+  rm -rf peach
   mkdir -p peach
   cat > peach/BUILD <<EOF
 sh_library(name='brighton', deps=[':harken'])
@@ -39,6 +40,7 @@
 }
 
 function test_visibility_affects_xml_output() {
+  rm -rf kiwi
   mkdir -p kiwi
 
   cat > kiwi/BUILD <<EOF
@@ -71,6 +73,7 @@
 }
 
 function test_visibility_affects_proto_output() {
+  rm -rf kiwi
   mkdir -p kiwi
 
   cat > kiwi/BUILD <<EOF
@@ -97,6 +100,8 @@
 }
 
 function make_depth_tests() {
+  rm -rf depth
+  rm -rf depth2
   mkdir -p depth depth2 || die "Could not create test directory"
   cat > "depth/BUILD" <<EOF
 sh_binary(name = 'one', srcs = ['one.sh'], deps = [':two'])
@@ -154,6 +159,7 @@
 }
 
 function test_universe_scope_with_without_star() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't mkdir"
   echo "sh_library(name = 'foo')" > foo/BUILD || fail "Couldn't write BUILD"
   bazel query --order_output=no \
@@ -171,6 +177,8 @@
 }
 
 function test_outside_universe_ok() {
+  rm -rf foo
+  rm -rf bar
   mkdir -p foo bar || fail "Couldn't mkdir"
   echo "sh_library(name = 'foo', deps = ['//bar:bar'])" > foo/BUILD ||
       fail "Couldn't write BUILD"
@@ -209,6 +217,8 @@
 }
 
 function test_skylark_dep_in_sky_query() {
+  rm -rf foo
+  rm -rf bar
   mkdir -p foo bar || fail "Couldn't make directories"
   echo 'load("//bar:fakerule.bzl", "const")' > foo/BUILD || fail "Couldn't write"
   touch bar/BUILD || fail "Couldn't touch bar/BUILD"
@@ -221,6 +231,7 @@
 }
 
 function test_skylark_regular_file_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't make directories"
   echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl"
   echo 'sh_library(name = "foo", srcs = ["baz.bzl"])' > foo/BUILD
@@ -233,6 +244,7 @@
 }
 
 function test_skylark_symlink_source_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't make directories"
   echo "moo" > "foo/moo" || fail "Couldn't create moo"
   ln -s "foo/moo" "foo/baz.bzl" || fail "Couldn't create baz.bzl symlink"
@@ -246,6 +258,7 @@
 }
 
 function test_skylark_symlink_target_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't make directories"
   echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl"
   ln -s "foo/baz.bzl" "foo/Moo.java" || fail "Couldn't create Moo.java symlink"
@@ -259,6 +272,7 @@
 }
 
 function test_skylark_glob_regular_file_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't make directories"
   echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl"
   echo 'sh_library(name = "foo", srcs = glob(["*.bzl"]))' > foo/BUILD
@@ -271,6 +285,7 @@
 }
 
 function test_skylark_glob_symlink_source_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't make directories"
   echo "moo" > "foo/moo" || fail "Couldn't create moo"
   ln -s "foo/moo" "foo/baz.bzl" || fail "Couldn't create baz.bzl symlink"
@@ -284,6 +299,7 @@
 }
 
 function test_skylark_glob_symlink_target_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo || fail "Couldn't make directories"
   echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl"
   ln -s "foo/baz.bzl" "foo/Moo.java" || fail "Couldn't create Moo.java symlink"
@@ -297,6 +313,7 @@
 }
 
 function test_skylark_recursive_glob_regular_file_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo/bar || fail "Couldn't make directories"
   echo "baz" > "foo/bar/baz.bzl" || fail "Couldn't create baz.bzl"
   echo 'sh_library(name = "foo", srcs = glob(["**/*.bzl"]))' > foo/BUILD
@@ -309,6 +326,7 @@
 }
 
 function test_skylark_recursive_glob_symlink_source_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo/bar || fail "Couldn't make directories"
   echo "moo" > "foo/moo" || fail "Couldn't create moo"
   ln -s "foo/moo" "foo/bar/baz.bzl" || fail "Couldn't create baz.bzl symlink"
@@ -322,6 +340,7 @@
 }
 
 function test_skylark_recursive_glob_symlink_target_not_included_in_rbuildfiles() {
+  rm -rf foo
   mkdir -p foo/bar || fail "Couldn't make directories"
   echo "baz" > "foo/bar/baz.bzl" || fail "Couldn't create baz.bzl"
   ln -s "foo/bar/baz.bzl" "foo/Moo.java" || fail "Couldn't create Moo.java symlink"
@@ -335,6 +354,7 @@
 }
 
 function test_skylark_subdir_dep_in_sky_query() {
+  rm -rf foo
   mkdir -p foo bar/baz || fail "Couldn't make directories"
   echo 'load("//bar:baz/fakerule.bzl", "const")' > foo/BUILD || fail "Couldn't write"
   touch bar/BUILD || fail "Couldn't touch bar/BUILD"
@@ -347,6 +367,7 @@
 }
 
 function test_parent_independent_of_child() {
+  rm -rf foo
   mkdir -p foo/subdir || fail "Couldn't make directories"
   echo 'sh_library(name = "sh", data = glob(["**"]))' > foo/BUILD ||
       fail "Couldn't write"
@@ -358,6 +379,7 @@
 }
 
 function test_does_not_fail_horribly_with_file() {
+  rm -rf peach
   mkdir -p peach
   cat > peach/BUILD <<EOF
 sh_library(name='brighton', deps=[':harken'])
@@ -372,7 +394,8 @@
 }
 
 function test_location_output_not_allowed_with_buildfiles_or_loadfiles() {
-  mkdir foo
+  rm -rf foo
+  mkdir -p foo
   cat > foo/bzl.bzl <<EOF
 x = 2
 EOF
@@ -414,6 +437,26 @@
   expect_log "//foo/bar:t2"
 }
 
+function test_buildfiles_with_build_bazel() {
+  if [ "${PRODUCT_NAME}" != "bazel" ]; then
+    return 0
+  fi
+  rm -rf foo
+  mkdir -p foo
+  cat > foo/bzl.bzl <<EOF
+x = 2
+EOF
+  cat > foo/BUILD.bazel <<EOF
+load('//foo:bzl.bzl', 'x')
+sh_library(name='foo')
+EOF
+
+  bazel query 'buildfiles(//foo)' >& $TEST_log || fail "Expected success"
+  expect_log "//foo:bzl.bzl$"
+  expect_log "//foo:BUILD.bazel$"
+  expect_not_log "//foo:BUILD$"
+}
+
 function tear_down() {
   bazel shutdown
 }