diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java new file mode 100644 index 0000000000..9b863bd4d3 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java @@ -0,0 +1,109 @@ +// 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.Objects; +import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.analysis.Aspect; +import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.skyframe.SkyFunctionName; +import com.google.devtools.build.skyframe.SkyKey; + +/** + * An aspect in the context of the Skyframe graph. + */ +public final class AspectValue extends ActionLookupValue { + /** + * The key of an action that is generated by an aspect. + */ + public static final class AspectKey extends ActionLookupKey { + private final Label label; + private final BuildConfiguration configuration; + // TODO(bazel-team): class objects are not really hashable or comparable for equality other than + // by reference. We should identify the aspect here in a way that does not rely on comparison + // by reference so that keys can be serialized and deserialized properly. + private final Class<? extends ConfiguredAspectFactory> aspectFactory; + + private AspectKey(Label label, BuildConfiguration configuration, + Class<? extends ConfiguredAspectFactory> aspectFactory) { + this.label = label; + this.configuration = configuration; + this.aspectFactory = aspectFactory; + } + + @Override + public Label getLabel() { + return label; + } + + public BuildConfiguration getConfiguration() { + return configuration; + } + + public Class<? extends ConfiguredAspectFactory> getAspect() { + return aspectFactory; + } + + @Override + SkyFunctionName getType() { + return SkyFunctions.ASPECT; + } + + @Override + public int hashCode() { + return Objects.hashCode(label, configuration, aspectFactory); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (!(other instanceof AspectKey)) { + return false; + } + + AspectKey that = (AspectKey) other; + return Objects.equal(label, that.label) + && Objects.equal(configuration, that.configuration) + && Objects.equal(aspectFactory, that.aspectFactory); + } + + @Override + public String toString() { + return label + "#" + aspectFactory.getSimpleName() + " " + + (configuration == null ? "null" : configuration.shortCacheKey()); + } + } + + private final Aspect aspect; + + public AspectValue(Aspect aspect, Iterable<Action> actions) { + super(actions); + this.aspect = aspect; + } + + public Aspect get() { + return aspect; + } + + public static SkyKey key(Label label, BuildConfiguration configuration, + Class<? extends ConfiguredAspectFactory> aspectFactory) { + return new SkyKey(SkyFunctions.ASPECT, new AspectKey(label, configuration, aspectFactory)); + } +} |