external system aware make build, MakeProjectStepBeforeRun refactored

This commit is contained in:
Vladislav.Soroka
2016-09-21 12:30:57 +03:00
committed by Vladislav.Soroka
parent 8ec6d38717
commit 8ff83cab8b
8 changed files with 100 additions and 29 deletions
@@ -47,14 +47,12 @@ public class BuildSystemManagerImpl extends BuildSystemManager {
@Override
public void buildDirty(@NotNull Module[] modules, @Nullable BuildStatusNotification callback) {
BuildScope buildScope = new BuildScopeImpl(map(list(modules), ModuleBuildTarget::new));
doBuild(buildScope, true, callback);
doBuild(createModulesBuildScope(modules), true, callback);
}
@Override
public void rebuild(@NotNull Module[] modules, @Nullable BuildStatusNotification callback) {
BuildScope buildScope = new BuildScopeImpl(map(list(modules), ModuleBuildTarget::new));
doBuild(buildScope, false, callback);
doBuild(createModulesBuildScope(modules), false, callback);
}
@Override
@@ -91,12 +89,27 @@ public class BuildSystemManagerImpl extends BuildSystemManager {
@Override
public void buildProjectDirty(@Nullable BuildStatusNotification callback) {
doBuild(new ProjectBuildScope(myProject), true, callback);
doBuild(createProjectBuildScope(myProject), true, callback);
}
@Override
public void rebuildProject(@Nullable BuildStatusNotification callback) {
doBuild(new ProjectBuildScope(myProject), false, callback);
doBuild(createProjectBuildScope(myProject), false, callback);
}
@Override
public BuildScope createProjectBuildScope(Project project) {
return new ProjectBuildScope(project);
}
@Override
public BuildScope createModulesBuildScope(Module... modules) {
return new BuildScopeImpl(map(list(modules), ModuleBuildTarget::new));
}
@Override
public BuildScope createArtifactsBuildScope(Artifact... artifacts) {
return new BuildScopeImpl(map(list(artifacts), ArtifactBuildTarget::new));
}
@NotNull
@@ -105,8 +118,7 @@ public class BuildSystemManagerImpl extends BuildSystemManager {
}
private void doBuild(@NotNull Artifact[] artifacts, @Nullable BuildStatusNotification callback, boolean isIncrementalBuild) {
BuildScope buildScope = new BuildScopeImpl(map(list(artifacts), ArtifactBuildTarget::new));
doBuild(buildScope, isIncrementalBuild, callback);
doBuild(createArtifactsBuildScope(artifacts), isIncrementalBuild, callback);
}
private void doBuild(@NotNull BuildScope scope, boolean isIncrementalBuild, @Nullable BuildStatusNotification callback) {
@@ -124,7 +136,8 @@ public class BuildSystemManagerImpl extends BuildSystemManager {
AtomicBoolean abortedFlag = new AtomicBoolean(false);
for (Map.Entry<BuildSystemDriver, ? extends List<? extends BuildTarget>> entry : toBuild.entrySet()) {
BuildSystemDriver driver = entry.getKey();
BuildScope buildScope = toBuild.size() == 1 ? scope : new BuildScopeImpl(entry.getValue(), scope.getSessionId());
BuildScope buildScope =
toBuild.size() == 1 ? scope : new BuildScopeImpl(entry.getValue(), scope.getSessionId(), scope.getRunConfiguration());
BuildChunkStatusNotification chunkStatusNotification = callback == null ? null : new BuildChunkStatusNotification() {
@Override
public void finished(boolean aborted, int errors, int warnings, BuildContext buildContext) {
@@ -20,6 +20,7 @@ import com.intellij.execution.ExecutionTarget;
import com.intellij.execution.Executor;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.configurations.ConfigurationPerRunnerSettings;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RunnerSettings;
import com.intellij.execution.impl.ExecutionManagerImpl;
@@ -88,11 +89,18 @@ public class DefaultBuildSystemDriver extends BuildSystemDriver {
private static void buildProject(BuildContext buildContext, CompileStatusNotification callback) {
Project project = buildContext.getProject();
CompilerManager compilerManager = CompilerManager.getInstance(project);
if (buildContext.isIncrementalBuild()) {
CompilerManager.getInstance(project).make(callback);
CompileScope scope = compilerManager.createProjectCompileScope(project);
RunConfiguration configuration = buildContext.getScope().getRunConfiguration();
if (configuration != null) {
scope.putUserData(CompilerManager.RUN_CONFIGURATION_KEY, configuration);
scope.putUserData(CompilerManager.RUN_CONFIGURATION_TYPE_ID_KEY, configuration.getType().getId());
}
compilerManager.make(scope, callback);
}
else {
CompilerManager.getInstance(project).rebuild(callback);
compilerManager.rebuild(callback);
}
}
@@ -15,6 +15,9 @@
*/
package com.intellij.openapi.build;
import com.intellij.execution.configurations.RunConfiguration;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
/**
@@ -24,7 +27,13 @@ import java.util.Collection;
public interface BuildScope {
Collection<? extends BuildTarget> getTargets();
void setSessionId(Object sessionId);
void setSessionId(@Nullable Object sessionId);
@Nullable
Object getSessionId();
void setRunConfiguration(@Nullable RunConfiguration configuration);
@Nullable
RunConfiguration getRunConfiguration();
}
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.build;
import com.intellij.execution.configurations.RunConfiguration;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
@@ -27,14 +28,23 @@ public class BuildScopeImpl implements BuildScope {
private final Collection<? extends BuildTarget> myTargets;
@Nullable
private Object mySessionId;
@Nullable
private RunConfiguration myConfiguration;
public BuildScopeImpl(Collection<? extends BuildTarget> targets) {
myTargets = targets;
this(targets, null, null);
}
public BuildScopeImpl(Collection<? extends BuildTarget> targets, @Nullable Object sessionId) {
this(targets, sessionId, null);
}
public BuildScopeImpl(Collection<? extends BuildTarget> targets,
@Nullable Object sessionId,
@Nullable RunConfiguration configuration) {
myTargets = targets;
mySessionId = sessionId;
myConfiguration = configuration;
}
@Override
@@ -52,4 +62,15 @@ public class BuildScopeImpl implements BuildScope {
public Object getSessionId() {
return mySessionId;
}
@Override
public void setRunConfiguration(@Nullable RunConfiguration configuration) {
myConfiguration = configuration;
}
@Nullable
@Override
public RunConfiguration getRunConfiguration() {
return myConfiguration;
}
}
@@ -86,4 +86,10 @@ public abstract class BuildSystemManager {
public abstract void buildDirty(@NotNull BuildScope scope, @Nullable BuildStatusNotification callback);
public abstract void rebuild(@NotNull BuildScope scope, @Nullable BuildStatusNotification callback);
public abstract BuildScope createProjectBuildScope(Project project);
public abstract BuildScope createModulesBuildScope(Module... modules);
public abstract BuildScope createArtifactsBuildScope(Artifact... artifacts);
}
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.compiler;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
@@ -40,6 +41,9 @@ import java.util.Set;
public abstract class CompilerManager {
@Deprecated
public static final Key<Key> CONTENT_ID_KEY = Key.create("COMPILATION_CONTENT_ID_CUSTOM_KEY");
public static final Key<RunConfiguration> RUN_CONFIGURATION_KEY = Key.create("RUN_CONFIGURATION");
public static final Key<String> RUN_CONFIGURATION_TYPE_ID_KEY = Key.create("RUN_CONFIGURATION_TYPE_ID");
public static final NotificationGroup NOTIFICATION_GROUP = NotificationGroup.logOnlyGroup("Compiler");
/**
@@ -27,9 +27,12 @@ import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.TransactionGuard;
import com.intellij.openapi.build.BuildScope;
import com.intellij.openapi.build.BuildStatusNotification;
import com.intellij.openapi.build.BuildStatusNotificationAdapter;
import com.intellij.openapi.build.BuildSystemManager;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompileScope;
import com.intellij.openapi.compiler.CompileStatusNotification;
import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -49,8 +52,14 @@ import javax.swing.*;
public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBeforeRun.MakeBeforeRunTask> {
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.options.CompileStepBeforeRun");
public static final Key<MakeBeforeRunTask> ID = Key.create("Make");
public static final Key<RunConfiguration> RUN_CONFIGURATION = Key.create("RUN_CONFIGURATION");
public static final Key<String> RUN_CONFIGURATION_TYPE_ID = Key.create("RUN_CONFIGURATION_TYPE_ID");
/**
* @deprecated to be removed in IDEA 2017
*/
public static final Key<RunConfiguration> RUN_CONFIGURATION = CompilerManager.RUN_CONFIGURATION_KEY;
/**
* @deprecated to be removed in IDEA 2017
*/
public static final Key<String> RUN_CONFIGURATION_TYPE_ID = CompilerManager.RUN_CONFIGURATION_TYPE_ID_KEY;
@NonNls protected static final String MAKE_PROJECT_ON_RUN_KEY = "makeProjectOnRun";
@@ -132,8 +141,8 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
final Semaphore done = new Semaphore();
done.down();
final CompileStatusNotification callback = new CompileStatusNotification() {
public void finished(final boolean aborted, final int errors, final int warnings, CompileContext compileContext) {
final BuildStatusNotification callback = new BuildStatusNotificationAdapter() {
public void finished(boolean aborted, int errors, int warnings) {
if ((errors == 0 || ignoreErrors) && !aborted) {
result.set(Boolean.TRUE);
}
@@ -142,11 +151,11 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
};
TransactionGuard.submitTransaction(myProject, () -> {
CompileScope scope;
final CompilerManager compilerManager = CompilerManager.getInstance(myProject);
BuildScope scope;
final BuildSystemManager buildSystemManager = BuildSystemManager.getInstance(myProject);
if (forceMakeProject) {
// user explicitly requested whole-project make
scope = compilerManager.createProjectCompileScope(myProject);
scope = buildSystemManager.createProjectBuildScope(myProject);
}
else {
final Module[] modules = runConfiguration.getModules();
@@ -157,18 +166,18 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
runConfiguration.getClass().getName());
}
}
scope = compilerManager.createModulesCompileScope(modules, true, true);
scope = buildSystemManager.createModulesBuildScope(modules);
}
else {
scope = compilerManager.createProjectCompileScope(myProject);
scope = buildSystemManager.createProjectBuildScope(myProject);
}
}
if (!myProject.isDisposed()) {
scope.putUserData(RUN_CONFIGURATION, configuration);
scope.putUserData(RUN_CONFIGURATION_TYPE_ID, configuration.getType().getId());
ExecutionManagerImpl.EXECUTION_SESSION_ID_KEY.set(scope, ExecutionManagerImpl.EXECUTION_SESSION_ID_KEY.get(env));
compilerManager.make(scope, callback);
Object sessionId = ExecutionManagerImpl.EXECUTION_SESSION_ID_KEY.get(env);
scope.setSessionId(sessionId);
scope.setRunConfiguration(configuration);
buildSystemManager.buildDirty(scope, callback);
}
else {
done.up();
@@ -194,7 +203,7 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
@Nullable
public static RunConfiguration getRunConfiguration(final CompileScope compileScope) {
return compileScope.getUserData(RUN_CONFIGURATION);
return compileScope.getUserData(CompilerManager.RUN_CONFIGURATION_KEY);
}
public static class MakeBeforeRunTask extends BeforeRunTask<MakeBeforeRunTask> {
@@ -26,6 +26,7 @@ import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompileScope;
import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import org.jetbrains.annotations.NotNull;
@@ -90,7 +91,7 @@ public class MakeProjectStepBeforeRun extends BeforeRunTaskProvider<MakeProjectS
@Nullable
public static RunConfiguration getRunConfiguration(final CompileScope compileScope) {
return compileScope.getUserData(CompileStepBeforeRun.RUN_CONFIGURATION);
return compileScope.getUserData(CompilerManager.RUN_CONFIGURATION_KEY);
}