diff options
author | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-25 16:45:20 +0100 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-25 16:45:20 +0100 |
commit | d08b27fa9701fecfdb69e1b0d1ac2459efc2129b (patch) | |
tree | 5d50963026239ca5aebfb47ea5b8db7e814e57c8 /src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java |
Update from Google.
--
MOE_MIGRATED_REVID=85702957
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java new file mode 100644 index 0000000000..e467ae09c8 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java @@ -0,0 +1,120 @@ +// 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.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; +import com.google.devtools.build.lib.analysis.config.BuildOptions; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; +import com.google.devtools.build.lib.analysis.config.PackageProviderForConfigurations; +import com.google.devtools.build.lib.packages.NoSuchPackageException; +import com.google.devtools.build.lib.packages.NoSuchTargetException; +import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.packages.PackageIdentifier; +import com.google.devtools.build.lib.packages.Target; +import com.google.devtools.build.lib.skyframe.SkyframeExecutor.SkyframePackageLoader; +import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.lib.syntax.Label.SyntaxException; +import com.google.devtools.build.lib.vfs.RootedPath; +import com.google.devtools.build.skyframe.MemoizingEvaluator; +import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyKey; + +import java.io.IOException; +import java.util.Set; + +/** + * Repeats functionality of {@link SkyframePackageLoader} but uses + * {@link SkyFunction.Environment#getValue} instead of {@link MemoizingEvaluator#evaluate} + * for node evaluation + */ +class SkyframePackageLoaderWithValueEnvironment implements + PackageProviderForConfigurations { + private final SkyFunction.Environment env; + private final Set<Package> packages; + + public SkyframePackageLoaderWithValueEnvironment(SkyFunction.Environment env, + Set<Package> packages) { + this.env = env; + this.packages = packages; + } + + private Package getPackage(PackageIdentifier pkgIdentifier) throws NoSuchPackageException{ + SkyKey key = PackageValue.key(pkgIdentifier); + PackageValue value = (PackageValue) env.getValueOrThrow(key, NoSuchPackageException.class); + if (value != null) { + packages.add(value.getPackage()); + return value.getPackage(); + } + return null; + } + + @Override + public Package getLoadedPackage(final PackageIdentifier pkgIdentifier) + throws NoSuchPackageException { + try { + return getPackage(pkgIdentifier); + } catch (NoSuchPackageException e) { + if (e.getPackage() != null) { + return e.getPackage(); + } + throw e; + } + } + + @Override + public Target getLoadedTarget(Label label) throws NoSuchPackageException, + NoSuchTargetException { + Package pkg = getLoadedPackage(label.getPackageIdentifier()); + return pkg == null ? null : pkg.getTarget(label.getName()); + } + + @Override + public boolean isTargetCurrent(Target target) { + throw new UnsupportedOperationException(); + } + + @Override + public void addDependency(Package pkg, String fileName) throws SyntaxException, IOException { + RootedPath fileRootedPath = RootedPath.toRootedPath(pkg.getSourceRoot(), + pkg.getNameFragment().getRelative(fileName)); + FileValue result = (FileValue) env.getValue(FileValue.key(fileRootedPath)); + if (result != null && !result.exists()) { + throw new IOException(); + } + } + + @SuppressWarnings("unchecked") + @Override + public <T extends Fragment> T getFragment(BuildOptions buildOptions, Class<T> fragmentType) + throws InvalidConfigurationException { + ConfigurationFragmentValue fragmentNode = (ConfigurationFragmentValue) env.getValueOrThrow( + ConfigurationFragmentValue.key(buildOptions, fragmentType), + InvalidConfigurationException.class); + if (fragmentNode == null) { + return null; + } + return (T) fragmentNode.getFragment(); + } + + @Override + public BlazeDirectories getDirectories() { + return PrecomputedValue.BLAZE_DIRECTORIES.get(env); + } + + @Override + public boolean valuesMissing() { + return env.valuesMissing(); + } +} |