// 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.query2; import static com.google.common.collect.ImmutableSet.toImmutableSet; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.graph.Digraph; import com.google.devtools.build.lib.graph.Node; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.CachingPackageLocator; import com.google.devtools.build.lib.packages.NoSuchThingException; import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.TargetEdgeObserver; import com.google.devtools.build.lib.pkgcache.TargetPatternPreloader; import com.google.devtools.build.lib.pkgcache.TargetProvider; import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader; import com.google.devtools.build.lib.query2.engine.Callback; import com.google.devtools.build.lib.query2.engine.DigraphQueryEvalResult; import com.google.devtools.build.lib.query2.engine.MinDepthUniquifier; import com.google.devtools.build.lib.query2.engine.QueryEvalResult; import com.google.devtools.build.lib.query2.engine.QueryException; import com.google.devtools.build.lib.query2.engine.QueryExpression; import com.google.devtools.build.lib.query2.engine.QueryExpressionContext; import com.google.devtools.build.lib.query2.engine.QueryUtil.MinDepthUniquifierImpl; import com.google.devtools.build.lib.query2.engine.QueryUtil.MutableKeyExtractorBackedMapImpl; import com.google.devtools.build.lib.query2.engine.QueryUtil.ThreadSafeMutableKeyExtractorBackedSetImpl; import com.google.devtools.build.lib.query2.engine.QueryUtil.UniquifierImpl; import com.google.devtools.build.lib.query2.engine.SkyframeRestartQueryException; import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback; import com.google.devtools.build.lib.query2.engine.Uniquifier; import com.google.devtools.build.lib.skyframe.SkyframeLabelVisitor; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * The environment of a Blaze query. Not thread-safe. */ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment { private static final int MAX_DEPTH_FULL_SCAN_LIMIT = 20; private final Map> resolvedTargetPatterns = new HashMap<>(); private final TargetPatternPreloader targetPatternPreloader; private final PathFragment relativeWorkingDirectory; private final TransitivePackageLoader transitivePackageLoader; private final TargetProvider targetProvider; private final CachingPackageLocator cachingPackageLocator; private final Digraph graph = new Digraph<>(); private final ErrorPrintingTargetEdgeErrorObserver errorObserver; private final LabelVisitor labelVisitor; protected final int loadingPhaseThreads; private final BlazeTargetAccessor accessor = new BlazeTargetAccessor(this); /** * Note that the correct operation of this class critically depends on the Reporter being a * singleton object, shared by all cooperating classes contributing to Query. * * @param strictScope if true, fail the whole query if a label goes out of scope. * @param loadingPhaseThreads the number of threads to use during loading the packages for the * query. * @param labelFilter a predicate that determines if a specific label is allowed to be visited * during query execution. If it returns false, the query execution is stopped with an error * message. * @param settings a set of enabled settings */ BlazeQueryEnvironment( TransitivePackageLoader transitivePackageLoader, TargetProvider targetProvider, CachingPackageLocator cachingPackageLocator, TargetPatternPreloader targetPatternPreloader, PathFragment relativeWorkingDirectory, boolean keepGoing, boolean strictScope, int loadingPhaseThreads, Predicate