diff options
author | 2015-02-25 16:45:20 +0100 | |
---|---|---|
committer | 2015-02-25 16:45:20 +0100 | |
commit | d08b27fa9701fecfdb69e1b0d1ac2459efc2129b (patch) | |
tree | 5d50963026239ca5aebfb47ea5b8db7e814e57c8 /src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java |
Update from Google.
--
MOE_MIGRATED_REVID=85702957
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java new file mode 100644 index 0000000000..16516b5534 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java @@ -0,0 +1,111 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.skyframe; + +import com.google.common.base.Preconditions; +import com.google.devtools.build.lib.packages.PackageIdentifier; +import com.google.devtools.build.lib.vfs.Path; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; + +/** + * A value that represents the result of looking for the existence of a package that owns a + * specific directory path. Compare with {@link PackageLookupValue}, which deals with existence of + * a specific package. + */ +public abstract class ContainingPackageLookupValue implements SkyValue { + /** Returns whether there is a containing package. */ + public abstract boolean hasContainingPackage(); + + /** If there is a containing package, returns its name. */ + abstract PackageIdentifier getContainingPackageName(); + + /** If there is a containing package, returns its package root */ + public abstract Path getContainingPackageRoot(); + + public static SkyKey key(PackageIdentifier id) { + Preconditions.checkArgument(!id.getPackageFragment().isAbsolute(), id); + return new SkyKey(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, id); + } + + static ContainingPackageLookupValue noContainingPackage() { + return NoContainingPackage.INSTANCE; + } + + static ContainingPackageLookupValue withContainingPackage(PackageIdentifier pkgId, Path root) { + return new ContainingPackage(pkgId, root); + } + + private static class NoContainingPackage extends ContainingPackageLookupValue { + private static final NoContainingPackage INSTANCE = new NoContainingPackage(); + + @Override + public boolean hasContainingPackage() { + return false; + } + + @Override + public PackageIdentifier getContainingPackageName() { + throw new IllegalStateException(); + } + + @Override + public Path getContainingPackageRoot() { + throw new IllegalStateException(); + } + } + + private static class ContainingPackage extends ContainingPackageLookupValue { + private final PackageIdentifier containingPackage; + private final Path containingPackageRoot; + + private ContainingPackage(PackageIdentifier pkgId, Path containingPackageRoot) { + this.containingPackage = pkgId; + this.containingPackageRoot = containingPackageRoot; + } + + @Override + public boolean hasContainingPackage() { + return true; + } + + @Override + public PackageIdentifier getContainingPackageName() { + return containingPackage; + } + + @Override + public Path getContainingPackageRoot() { + return containingPackageRoot; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ContainingPackage)) { + return false; + } + ContainingPackage other = (ContainingPackage) obj; + return containingPackage.equals(other.containingPackage) + && containingPackageRoot.equals(other.containingPackageRoot); + } + + @Override + public int hashCode() { + return containingPackage.hashCode(); + } + } +} |