// Copyright 2014 The Bazel Authors. 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.analysis; import static com.google.devtools.build.lib.analysis.ExtraActionUtils.createExtraActionProvider; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.AspectClass; import com.google.devtools.build.lib.packages.AspectDescriptor; import com.google.devtools.build.lib.packages.AspectParameters; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.Provider; import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier; import com.google.devtools.build.lib.syntax.EvalException; import java.util.Arrays; import java.util.Map; import java.util.TreeMap; import javax.annotation.Nullable; /** * Extra information about a configured target computed on request of a dependent. * *
Analogous to {@link ConfiguredTarget}: contains a bunch of transitive info providers, which * are merged with the providers of the associated configured target before they are passed to the * configured target factories that depend on the configured target to which this aspect is added. * *
Aspects are created alongside configured targets on request from dependents. * *
For more information about aspects, see {@link * com.google.devtools.build.lib.packages.AspectClass}. * * @see com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory * @see com.google.devtools.build.lib.packages.AspectClass */ @Immutable public final class ConfiguredAspect { private final TransitiveInfoProviderMap providers; private final AspectDescriptor descriptor; private ConfiguredAspect(AspectDescriptor descriptor, TransitiveInfoProviderMap providers) { this.descriptor = descriptor; this.providers = providers; } /** * Returns the aspect name. */ public String getName() { return descriptor.getAspectClass().getName(); } /** * The aspect descriptor originating this ConfiguredAspect. */ public AspectDescriptor getDescriptor() { return descriptor; } /** Returns the providers created by the aspect. */ public TransitiveInfoProviderMap getProviders() { return providers; } @Nullable @VisibleForTesting public
P getProvider(Class
providerClass) {
AnalysisUtils.checkProvider(providerClass);
return providers.getProvider(providerClass);
}
public Object getProvider(SkylarkProviderIdentifier id) {
if (id.isLegacy()) {
return get(id.getLegacyId());
} else {
return get(id.getKey());
}
}
public Info get(Provider.Key key) {
return providers.getProvider(key);
}
public Object get(String legacyKey) {
if (OutputGroupProvider.SKYLARK_NAME.equals(legacyKey)) {
return get(OutputGroupProvider.SKYLARK_CONSTRUCTOR.getKey());
}
return providers.getProvider(legacyKey);
}
public static ConfiguredAspect forAlias(ConfiguredAspect real) {
return new ConfiguredAspect(real.descriptor, real.getProviders());
}
public static ConfiguredAspect forNonapplicableTarget(AspectDescriptor descriptor) {
return new ConfiguredAspect(descriptor, new TransitiveInfoProviderMapBuilder().add().build());
}
public static Builder builder(
AspectClass aspectClass, AspectParameters parameters, RuleContext ruleContext) {
return new Builder(aspectClass, parameters, ruleContext);
}
/**
* Builder for {@link ConfiguredAspect}.
*/
public static class Builder {
private final TransitiveInfoProviderMapBuilder providers =
new TransitiveInfoProviderMapBuilder();
private final Map