/** * Checks whether the {@code traversal}'s path refers to a package directory. * * @return the result of the lookup; it contains potentially new {@link TraversalRequest} and * {@link FileInfo} so the caller should use these instead of the old ones (this happens when * a package is found, but under a different root than expected) */ private static PkgLookupResult checkIfPackage( Environment env, TraversalRequest traversal, FileInfo rootInfo) throws MissingDepException { Preconditions.checkArgument( rootInfo.type.exists() && !rootInfo.type.isFile(), "{%s} {%s}", traversal, rootInfo); PackageLookupValue pkgLookup = (PackageLookupValue) getDependentSkyValue(env, PackageLookupValue.key(traversal.path.getRelativePath())); if (pkgLookup.packageExists()) { if (traversal.isGenerated) { // The traversal's root was a generated directory, but its root-relative path conflicts with // an existing package. return PkgLookupResult.conflict(traversal, rootInfo); } else { // The traversal's root was a source directory and it defines a package. Path pkgRoot = pkgLookup.getRoot(); if (!pkgRoot.equals(traversal.path.getRoot())) { // However the root of this package is different from what we expected. stat() the real // BUILD file of that package. traversal = traversal.forChangedRootPath(pkgRoot); rootInfo = lookUpFileInfo(env, traversal); Verify.verify(rootInfo.type.exists(), "{%s} {%s}", traversal, rootInfo); } return PkgLookupResult.pkg(traversal, rootInfo); } } else { // The traversal's root was a directory (source or generated one), no package exists under the // same root-relative path. return PkgLookupResult.directory(traversal, rootInfo); } }