private PerBuildState create()

in src/com/facebook/buck/parser/PerBuildStateFactory.java [92:301]


  private PerBuildState create(
      ParsingContext parsingContext,
      DaemonicParserState daemonicParserState,
      Optional<AtomicLong> parseProcessedBytes) {

    Cells cells = new Cells(parsingContext.getCell().getCell(CanonicalCellName.rootCell()));
    ListeningExecutorService executorService = parsingContext.getExecutor();
    SymlinkCache symlinkCache = new SymlinkCache(eventBus, daemonicParserState);
    CellManager cellManager = new CellManager(cells.getRootCell(), symlinkCache);

    TargetNodeListener<TargetNode<?>> symlinkCheckers = cellManager::registerInputsUnderSymlinks;
    ParserConfig parserConfig = cells.getRootCell().getBuckConfig().getView(ParserConfig.class);

    TargetConfigurationDetector targetConfigurationDetector =
        TargetConfigurationDetectorFactory.fromBuckConfig(
            parserConfig,
            unconfiguredBuildTargetFactory,
            cells.getRootCell().getCellPathResolver(),
            cells.getRootCell().getCellNameResolver());

    int numParsingThreads = parserConfig.getNumParsingThreads();
    DefaultProjectBuildFileParserFactory projectBuildFileParserFactory =
        new DefaultProjectBuildFileParserFactory(
            typeCoercerFactory,
            parserPythonInterpreterProvider,
            parsingContext.isProfilingEnabled(),
            parseProcessedBytes,
            knownRuleTypesProvider);
    ProjectBuildFileParserPool projectBuildFileParserPool =
        new ProjectBuildFileParserPool(
            numParsingThreads, // Max parsers to create per cell.
            projectBuildFileParserFactory,
            parsingContext.isProfilingEnabled());

    TargetNodeFactory targetNodeFactory =
        new TargetNodeFactory(typeCoercerFactory, new DefaultCellNameResolverProvider(cells));

    SelectorListFactory selectorListFactory =
        new SelectorListFactory(new SelectorFactory(unconfiguredBuildTargetFactory));

    BuildFileRawNodeParsePipeline buildFileRawNodeParsePipeline =
        new BuildFileRawNodeParsePipeline(
            new PipelineNodeCache<>(daemonicParserState.getRawNodeCache(), n -> false),
            projectBuildFileParserPool,
            executorService,
            eventBus,
            watchman);

    BuildTargetRawNodeParsePipeline buildTargetRawNodeParsePipeline =
        new BuildTargetRawNodeParsePipeline(executorService, buildFileRawNodeParsePipeline);

    PackageFileParserFactory packageFileParserFactory =
        new PackageFileParserFactory(
            typeCoercerFactory,
            parserPythonInterpreterProvider,
            knownRuleTypesProvider,
            parsingContext.isProfilingEnabled());

    PackageFileParserPool packageFileParserPool =
        new PackageFileParserPool(
            numParsingThreads, // Max parsers to create per cell.
            packageFileParserFactory);

    PackageFileParsePipeline packageFileParsePipeline =
        new PackageFileParsePipeline(
            new PipelineNodeCache<>(daemonicParserState.getPackageFileCache(), n -> false),
            packageFileParserPool,
            executorService,
            eventBus,
            watchman);

    PerBuildStateCache perBuildStateCache = new PerBuildStateCache(numParsingThreads);

    PackagePipeline packagePipeline =
        new PackagePipeline(
            executorService,
            eventBus,
            packageFileParsePipeline,
            perBuildStateCache.getPackageCache());

    ListeningExecutorService pipelineExecutorService =
        parserConfig.getEnableParallelParsing()
            ? executorService
            : MoreExecutors.newDirectExecutorService();
    boolean enableSpeculativeParsing =
        parserConfig.getEnableParallelParsing()
            && parsingContext.getSpeculativeParsing() == SpeculativeParsing.ENABLED;
    UnconfiguredTargetNodePipeline unconfiguredTargetNodePipeline =
        new UnconfiguredTargetNodePipeline(
            pipelineExecutorService,
            daemonicParserState.getOrCreateNodeCache(
                DaemonicParserState.RAW_TARGET_NODE_CACHE_TYPE),
            eventBus,
            buildFileRawNodeParsePipeline,
            buildTargetRawNodeParsePipeline,
            packagePipeline,
            new DefaultUnconfiguredTargetNodeFactory(
                knownRuleTypesProvider,
                new BuiltTargetVerifier(),
                cells,
                selectorListFactory,
                typeCoercerFactory));

    PackageBoundaryChecker packageBoundaryChecker =
        new ThrowingPackageBoundaryChecker(daemonicParserState.getBuildFileTrees());

    ParserTargetNodeFromUnconfiguredTargetNodeFactory nonResolvingRawTargetNodeToTargetNodeFactory =
        new UnconfiguredTargetNodeToTargetNodeFactory(
            typeCoercerFactory,
            knownRuleTypesProvider,
            marshaller,
            targetNodeFactory,
            packageBoundaryChecker,
            symlinkCheckers,
            new ThrowingSelectorListResolver(),
            new ThrowingPlatformResolver(),
            new MultiPlatformTargetConfigurationTransformer(new ThrowingPlatformResolver()),
            hostConfiguration,
            parsingContext.getCell().getBuckConfig(),
            Optional.empty());

    // This pipeline uses a direct executor instead of pipelineExecutorService to avoid
    // deadlocks happening when too many node are requested from targetNodeParsePipeline.
    // That pipeline does blocking calls to get nodes from nonResolvingTargetNodeParsePipeline
    // which can lead to deadlocks.
    UnconfiguredTargetNodeToTargetNodeParsePipeline nonResolvingTargetNodeParsePipeline =
        new UnconfiguredTargetNodeToTargetNodeParsePipeline(
            daemonicParserState.getOrCreateNodeCache(DaemonicParserState.TARGET_NODE_CACHE_TYPE),
            MoreExecutors.newDirectExecutorService(),
            unconfiguredTargetNodePipeline,
            targetConfigurationDetector,
            eventBus,
            "nonresolving_raw_target_node_parse_pipeline",
            enableSpeculativeParsing,
            nonResolvingRawTargetNodeToTargetNodeFactory,
            parserConfig.getRequireTargetPlatform());

    ConfigurationRuleRegistry configurationRuleRegistry =
        ConfigurationRuleRegistryFactory.createRegistry(
            (target, callerContext) ->
                nonResolvingTargetNodeParsePipeline
                    .getNode(cellManager.getCell(target.getCell()), target, callerContext)
                    .assertGetTargetNode(DependencyStack.root()));

    SelectableResolver selectableResolver =
        new ConfigurationRuleSelectableResolver(
            configurationRuleRegistry.getConfigurationRuleResolver());

    SelectorListResolver selectorListResolver;
    if (parsingContext.useUnconfiguredSelectorResolver()) {
      selectorListResolver = new UnconfiguredSelectorListResolver(selectableResolver);
    } else {
      selectorListResolver = new DefaultSelectorListResolver(selectableResolver);
    }

    UnconfiguredTargetNodeToTargetNodeFactory unconfiguredTargetNodeToTargetNodeFactory =
        new UnconfiguredTargetNodeToTargetNodeFactory(
            typeCoercerFactory,
            knownRuleTypesProvider,
            marshaller,
            targetNodeFactory,
            packageBoundaryChecker,
            symlinkCheckers,
            selectorListResolver,
            configurationRuleRegistry.getTargetPlatformResolver(),
            new MultiPlatformTargetConfigurationTransformer(
                configurationRuleRegistry.getTargetPlatformResolver()),
            hostConfiguration,
            parsingContext.getCell().getBuckConfig(),
            (parsingContext.excludeUnsupportedTargets()
                    && parsingContext.enableTargetCompatibilityChecks())
                ? Optional.of(configurationRuleRegistry)
                : Optional.empty());

    ListeningExecutorService configuredPipelineExecutor =
        MoreExecutors.listeningDecorator(
            createExecutorService(cells.getRootCell().getBuckConfig(), "configured-pipeline"));

    UnconfiguredTargetNodeToTargetNodeParsePipeline targetNodeParsePipeline =
        new UnconfiguredTargetNodeToTargetNodeParsePipeline(
            daemonicParserState.getOrCreateNodeCache(DaemonicParserState.TARGET_NODE_CACHE_TYPE),
            configuredPipelineExecutor,
            unconfiguredTargetNodePipeline,
            targetConfigurationDetector,
            eventBus,
            "configured_raw_target_node_parse_pipeline",
            enableSpeculativeParsing,
            unconfiguredTargetNodeToTargetNodeFactory,
            parserConfig.getRequireTargetPlatform()) {
          @Override
          public void close() {
            super.close();
            nonResolvingTargetNodeParsePipeline.close();
            unconfiguredTargetNodePipeline.close();
            try {
              MostExecutors.shutdown(configuredPipelineExecutor, 1, TimeUnit.MINUTES);
            } catch (InterruptedException e) {
            }
          }
        };

    return new PerBuildState(
        cellManager,
        buildFileRawNodeParsePipeline,
        targetNodeParsePipeline,
        parsingContext,
        selectorListResolver,
        selectorListFactory,
        configurationRuleRegistry);
  }