Skip to content

Commit

Permalink
Split ProjectRefresher into
Browse files Browse the repository at this point in the history
the refresher itself and a `BlazeProjectSnapshotBuilder` than knows how to
build the `BlazeProjectSnapshot` and in the future apply required transformations.

PiperOrigin-RevId: 569204429
  • Loading branch information
Googler authored and copybara-github committed Sep 28, 2023
1 parent 1f7f0bd commit a391a9e
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 164 deletions.
19 changes: 12 additions & 7 deletions base/src/com/google/idea/blaze/base/qsync/ProjectLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import com.google.idea.blaze.base.vcs.BlazeVcsHandlerProvider.BlazeVcsHandler;
import com.google.idea.blaze.common.PrintOutput;
import com.google.idea.blaze.qsync.BlazeProject;
import com.google.idea.blaze.qsync.BlazeProjectSnapshotBuilder;
import com.google.idea.blaze.qsync.PackageStatementParser;
import com.google.idea.blaze.qsync.ParallelPackageReader;
import com.google.idea.blaze.qsync.ProjectRefresher;
Expand Down Expand Up @@ -149,14 +150,16 @@ public QuerySyncProject loadProject(BlazeContext context) throws IOException {
Optional.ofNullable(BlazeVcsHandlerProvider.vcsHandlerForProject(project));
ProjectRefresher projectRefresher =
new ProjectRefresher(
executor,
createWorkspaceRelativePackageReader(),
vcsHandler.map(BlazeVcsHandler::getVcsStateDiffer).orElse(VcsStateDiffer.NONE),
workspaceRoot.path(),
graph::getCurrent,
handledRules);
graph::getCurrent);
BlazeProjectSnapshotBuilder blazeProjectSnapshotBuilder =
new BlazeProjectSnapshotBuilder(
executor, createWorkspaceRelativePackageReader(), workspaceRoot.path(), handledRules);
QueryRunner queryRunner = createQueryRunner(buildSystem);
ProjectQuerier projectQuerier = createProjectQuerier(projectRefresher, queryRunner, vcsHandler);
ProjectQuerier projectQuerier =
createProjectQuerier(
projectRefresher, blazeProjectSnapshotBuilder, queryRunner, vcsHandler);
ProjectUpdater projectUpdater =
new ProjectUpdater(
project, importSettings, projectViewSet, workspaceRoot, projectPathResolver);
Expand Down Expand Up @@ -188,9 +191,11 @@ private ParallelPackageReader createWorkspaceRelativePackageReader() {

private ProjectQuerierImpl createProjectQuerier(
ProjectRefresher projectRefresher,
BlazeProjectSnapshotBuilder blazeProjectSnapshotBuilder,
QueryRunner queryRunner,
Optional<BlazeVcsHandler> vcsHandler) {
return new ProjectQuerierImpl(queryRunner, projectRefresher, vcsHandler);
return new ProjectQuerierImpl(
queryRunner, projectRefresher, blazeProjectSnapshotBuilder, vcsHandler);
}

protected QueryRunner createQueryRunner(BuildSystem buildSystem) {
Expand Down Expand Up @@ -222,7 +227,7 @@ private ArtifactFetcher<OutputArtifact> createArtifactFetcher() {
/**
* Returns an {@link ImmutableSet} of rule kinds that query sync or plugin know how to resolve
* symbols for without building. The rules query sync always builds even if they are part of the
* project are in {@link BlazeQueryParser.ALWAYS_BUILD_RULE_KINDS}
* project are in {@link com.google.idea.blaze.qsync.BlazeQueryParser.ALWAYS_BUILD_RULE_KINDS}
*/
private ImmutableSet<String> getHandledRuleKinds() {
ImmutableSet.Builder<String> defaultRules = ImmutableSet.builder();
Expand Down
18 changes: 11 additions & 7 deletions base/src/com/google/idea/blaze/base/qsync/ProjectQuerierImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/
package com.google.idea.blaze.base.qsync;


import com.google.common.annotations.VisibleForTesting;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.Uninterruptibles;
Expand All @@ -26,6 +25,7 @@
import com.google.idea.blaze.base.vcs.BlazeVcsHandlerProvider.BlazeVcsHandler;
import com.google.idea.blaze.common.vcs.VcsState;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.BlazeProjectSnapshotBuilder;
import com.google.idea.blaze.qsync.ProjectRefresher;
import com.google.idea.blaze.qsync.RefreshOperation;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
Expand All @@ -45,15 +45,18 @@ public class ProjectQuerierImpl implements ProjectQuerier {

private final QueryRunner queryRunner;
private final ProjectRefresher projectRefresher;
private final BlazeProjectSnapshotBuilder blazeProjectSnapshotBuilder;
private final Optional<BlazeVcsHandler> vcsHandler;

@VisibleForTesting
public ProjectQuerierImpl(
QueryRunner queryRunner,
ProjectRefresher projectRefresher,
BlazeProjectSnapshotBuilder blazeProjectSnapshotBuilder,
Optional<BlazeVcsHandler> vcsHandler) {
this.queryRunner = queryRunner;
this.projectRefresher = projectRefresher;
this.blazeProjectSnapshotBuilder = blazeProjectSnapshotBuilder;
this.vcsHandler = vcsHandler;
}

Expand All @@ -79,9 +82,8 @@ public BlazeProjectSnapshot fullQuery(ProjectDefinition projectDef, BlazeContext
RefreshOperation fullQuery = projectRefresher.startFullUpdate(context, projectDef, vcsState);

QuerySpec querySpec = fullQuery.getQuerySpec().get();
fullQuery.setQueryOutput(queryRunner.runQuery(querySpec, context));

return fullQuery.createBlazeProject();
return blazeProjectSnapshotBuilder.createBlazeProjectSnapshot(
context, fullQuery.createPostQuerySyncData(queryRunner.runQuery(querySpec, context)));
}

private Optional<VcsState> getVcsState(BlazeContext context) {
Expand Down Expand Up @@ -130,11 +132,13 @@ public BlazeProjectSnapshot update(
projectRefresher.startPartialRefresh(context, previousState, vcsState, currentProjectDef);

Optional<QuerySpec> spec = refresh.getQuerySpec();
QuerySummary querySummary;
if (spec.isPresent()) {
refresh.setQueryOutput(queryRunner.runQuery(spec.get(), context));
querySummary = queryRunner.runQuery(spec.get(), context);
} else {
refresh.setQueryOutput(QuerySummary.EMPTY);
querySummary = QuerySummary.EMPTY;
}
return refresh.createBlazeProject();
return blazeProjectSnapshotBuilder.createBlazeProjectSnapshot(
context, refresh.createPostQuerySyncData(querySummary));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright 2023 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.idea.blaze.qsync;

import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.idea.blaze.common.Context;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.BuildGraphData;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.project.ProjectProto;
import java.nio.file.Path;

/**
* Project refresher creates an appropriate {@link RefreshOperation} based on the project and
* current VCS state.
*/
public class BlazeProjectSnapshotBuilder {

private final ListeningExecutorService executor;
private final PackageReader workspaceRelativePackageReader;
private final Path workspaceRoot;
private final ImmutableSet<String> handledRuleKinds;

public BlazeProjectSnapshotBuilder(
ListeningExecutorService executor,
PackageReader workspaceRelativePackageReader,
Path workspaceRoot,
ImmutableSet<String> handledRuleKinds) {
this.executor = executor;
this.workspaceRelativePackageReader = workspaceRelativePackageReader;
this.workspaceRoot = workspaceRoot;
this.handledRuleKinds = handledRuleKinds;
}

public BlazeProjectSnapshot createBlazeProjectSnapshot(
Context<?> context, PostQuerySyncData postQuerySyncData) throws BuildException {
BlazeQueryParser.Factory queryParserFactory =
new BlazeQueryParser.Factory(context, handledRuleKinds);
Path effectiveWorkspaceRoot =
postQuerySyncData.vcsState().flatMap(s -> s.workspaceSnapshotPath).orElse(workspaceRoot);
WorkspaceResolvingPackageReader packageReader =
new WorkspaceResolvingPackageReader(effectiveWorkspaceRoot, workspaceRelativePackageReader);
GraphToProjectConverter graphToProjectConverter =
new GraphToProjectConverter(
packageReader,
effectiveWorkspaceRoot,
context,
postQuerySyncData.projectDefinition(),
executor);
BuildGraphData graph = queryParserFactory.newParser(postQuerySyncData.querySummary()).parse();
ProjectProto.Project project = graphToProjectConverter.createProject(graph);
return BlazeProjectSnapshot.builder()
.queryData(postQuerySyncData)
.graph(graph)
.project(project)
.build();
}
}
39 changes: 9 additions & 30 deletions querysync/java/com/google/idea/blaze/qsync/FullProjectUpdate.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,10 @@
*/
package com.google.idea.blaze.qsync;

import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.idea.blaze.common.Context;
import com.google.idea.blaze.common.vcs.VcsState;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.BuildGraphData;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.project.ProjectDefinition;
import com.google.idea.blaze.qsync.project.ProjectProto;
import com.google.idea.blaze.qsync.query.QuerySpec;
import com.google.idea.blaze.qsync.query.QuerySummary;
import java.io.IOException;
Expand All @@ -41,29 +35,18 @@ public class FullProjectUpdate implements RefreshOperation {

private final Context<?> context;
private final Path effectiveWorkspaceRoot;
private final BlazeQueryParser.Factory queryParserFactory;
private final ProjectDefinition projectDefinition;
private final GraphToProjectConverter graphToProjectConverter;

private final PostQuerySyncData.Builder result;
private final Optional<VcsState> vcsState;

public FullProjectUpdate(
Context<?> context,
ListeningExecutorService executor,
Path effectiveWorkspaceRoot,
ProjectDefinition definition,
PackageReader packageReader,
Optional<VcsState> vcsState,
ImmutableSet<String> handledRuleKinds) {
Optional<VcsState> vcsState) {
this.context = context;
this.effectiveWorkspaceRoot = effectiveWorkspaceRoot;
this.result =
PostQuerySyncData.builder().setProjectDefinition(definition).setVcsState(vcsState);
this.projectDefinition = definition;
this.queryParserFactory = new BlazeQueryParser.Factory(context, handledRuleKinds);
this.graphToProjectConverter =
new GraphToProjectConverter(
packageReader, effectiveWorkspaceRoot, context, projectDefinition, executor);
this.vcsState = vcsState;
}

@Override
Expand All @@ -73,15 +56,11 @@ public Optional<QuerySpec> getQuerySpec() throws IOException {
}

@Override
public void setQueryOutput(QuerySummary output) {
result.setQuerySummary(output);
}

@Override
public BlazeProjectSnapshot createBlazeProject() throws BuildException {
PostQuerySyncData newData = result.build();
BuildGraphData graph = queryParserFactory.newParser(newData.querySummary()).parse();
ProjectProto.Project project = graphToProjectConverter.createProject(graph);
return BlazeProjectSnapshot.builder().queryData(newData).graph(graph).project(project).build();
public PostQuerySyncData createPostQuerySyncData(QuerySummary output) {
return PostQuerySyncData.builder()
.setProjectDefinition(projectDefinition)
.setVcsState(vcsState)
.setQuerySummary(output)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.google.idea.blaze.qsync;

import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.query.QuerySpec;
import com.google.idea.blaze.qsync.query.QuerySummary;
import java.util.Optional;
Expand All @@ -41,10 +42,7 @@ public Optional<QuerySpec> getQuerySpec() {
}

@Override
public void setQueryOutput(QuerySummary output) {}

@Override
public BlazeProjectSnapshot createBlazeProject() {
return latestProjectSnapshotSupplier.get();
public PostQuerySyncData createPostQuerySyncData(QuerySummary output) {
return latestProjectSnapshotSupplier.get().queryData();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,9 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.idea.blaze.common.Context;
import com.google.idea.blaze.common.Label;
import com.google.idea.blaze.common.vcs.VcsState;
import com.google.idea.blaze.exception.BuildException;
import com.google.idea.blaze.qsync.project.BlazeProjectSnapshot;
import com.google.idea.blaze.qsync.project.BuildGraphData;
import com.google.idea.blaze.qsync.project.PostQuerySyncData;
import com.google.idea.blaze.qsync.project.ProjectProto;
import com.google.idea.blaze.qsync.query.Query;
import com.google.idea.blaze.qsync.query.Query.SourceFile;
import com.google.idea.blaze.qsync.query.QuerySpec;
Expand All @@ -47,39 +41,21 @@ class PartialProjectRefresh implements RefreshOperation {

private final Path effectiveWorkspaceRoot;
private final PostQuerySyncData previousState;
private final BlazeQueryParser.Factory queryParserFactory;
private final GraphToProjectConverter graphToProjectConverter;
private final PostQuerySyncData.Builder newState;
private final Optional<VcsState> currentVcsState;
@VisibleForTesting final ImmutableSet<Path> modifiedPackages;
@VisibleForTesting final ImmutableSet<Path> deletedPackages;
private QuerySummary partialQuery;

PartialProjectRefresh(
Context context,
ListeningExecutorService executor,
Path effectiveWorkspaceRoot,
PackageReader packageReader,
PostQuerySyncData previousState,
Optional<VcsState> currentVcsState,
ImmutableSet<Path> modifiedPackages,
ImmutableSet<Path> deletedPackages,
ImmutableSet<String> handledRuleKinds) {
ImmutableSet<Path> deletedPackages) {
this.effectiveWorkspaceRoot = effectiveWorkspaceRoot;
this.previousState = previousState;
this.newState =
PostQuerySyncData.builder()
.setVcsState(currentVcsState)
.setProjectDefinition(previousState.projectDefinition());
this.currentVcsState = currentVcsState;
this.modifiedPackages = modifiedPackages;
this.deletedPackages = deletedPackages;
this.queryParserFactory = new BlazeQueryParser.Factory(context, handledRuleKinds);
this.graphToProjectConverter =
new GraphToProjectConverter(
packageReader,
effectiveWorkspaceRoot,
context,
previousState.projectDefinition(),
executor);
}

private Optional<QuerySpec> createQuerySpec() {
Expand All @@ -97,26 +73,17 @@ private Optional<QuerySpec> createQuerySpec() {

@Override
public Optional<QuerySpec> getQuerySpec() {
Optional<QuerySpec> querySpec = createQuerySpec();
return querySpec;
return createQuerySpec();
}

@Override
public void setQueryOutput(QuerySummary output) {
this.partialQuery = output;
}

@Override
public BlazeProjectSnapshot createBlazeProject() throws BuildException {
public PostQuerySyncData createPostQuerySyncData(QuerySummary partialQuery) {
Preconditions.checkNotNull(partialQuery, "queryOutput");
QuerySummary effectiveQuery = applyDelta();
PostQuerySyncData postQuerySyncData = newState.setQuerySummary(effectiveQuery).build();
BuildGraphData graph = queryParserFactory.newParser(effectiveQuery).parse();
ProjectProto.Project project = graphToProjectConverter.createProject(graph);
return BlazeProjectSnapshot.builder()
.queryData(postQuerySyncData)
.graph(graph)
.project(project)
QuerySummary effectiveQuery = applyDelta(partialQuery);
return PostQuerySyncData.builder()
.setVcsState(currentVcsState)
.setProjectDefinition(previousState.projectDefinition())
.setQuerySummary(effectiveQuery)
.build();
}

Expand All @@ -125,7 +92,7 @@ public BlazeProjectSnapshot createBlazeProject() throws BuildException {
* partial query, and any deleted packages.
*/
@VisibleForTesting
QuerySummary applyDelta() {
QuerySummary applyDelta(QuerySummary partialQuery) {
// copy all unaffected rules / source files to result:
Map<Label, SourceFile> newSourceFiles = Maps.newHashMap();
for (Map.Entry<Label, SourceFile> sfEntry :
Expand Down
Loading

0 comments on commit a391a9e

Please sign in to comment.