// 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.configuredtargets; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.PackageSpecificationProvider; import com.google.devtools.build.lib.analysis.TargetContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.PackageGroup; import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents; import com.google.devtools.build.lib.packages.Provider; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; /** * Dummy ConfiguredTarget for package groups. Contains no functionality, since package groups are * not really first-class Targets. */ @AutoCodec public final class PackageGroupConfiguredTarget extends AbstractConfiguredTarget implements PackageSpecificationProvider { private static final FileProvider NO_FILES = new FileProvider( NestedSetBuilder.emptySet(Order.STABLE_ORDER)); private final NestedSet packageSpecifications; @VisibleForSerialization @Instantiator PackageGroupConfiguredTarget( Label label, NestedSet visibility, NestedSet packageSpecifications) { super(label, null, visibility); this.packageSpecifications = packageSpecifications; } public PackageGroupConfiguredTarget(TargetContext targetContext, PackageGroup packageGroup) { this( targetContext.getLabel(), targetContext.getVisibility(), getPackageSpecifications(targetContext, packageGroup)); } private static NestedSet getPackageSpecifications( TargetContext targetContext, PackageGroup packageGroup) { NestedSetBuilder builder = NestedSetBuilder.stableOrder(); for (Label label : packageGroup.getIncludes()) { TransitiveInfoCollection include = targetContext.maybeFindDirectPrerequisite( label, targetContext.getConfiguration()); PackageSpecificationProvider provider = include == null ? null : include.getProvider(PackageSpecificationProvider.class); if (provider == null) { targetContext .getAnalysisEnvironment() .getEventHandler() .handle( Event.error( targetContext.getTarget().getLocation(), String.format("label '%s' does not refer to a package group", label))); continue; } builder.addTransitive(provider.getPackageSpecifications()); } builder.add(packageGroup.getPackageSpecifications()); return builder.build(); } @Override public NestedSet getPackageSpecifications() { return packageSpecifications; } @Override public

P getProvider(Class

provider) { if (provider == FileProvider.class) { return (P) NO_FILES; } else { return super.getProvider(provider); } } @Override protected Info rawGetSkylarkProvider(Provider.Key providerKey) { return null; } @Override protected Object rawGetSkylarkProvider(String providerKey) { return null; } }