From 25a6d04d9e369822cff6caab99741182e24a4fda Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Thu, 6 Oct 2016 14:59:47 +0300 Subject: [PATCH] build: include module dependent modules during incremental module build + IDEA-162161 Dependencies with scope 'Runtime' aren't compiled when a run configuration is started --- .../task/impl/InternalProjectTaskRunner.java | 58 +++++++++++++------ .../task/impl/ModuleBuildTaskImpl.java | 21 +++++++ .../task/impl/ProjectTaskManagerImpl.java | 25 ++++++-- .../com/intellij/task/ModuleBuildTask.java | 4 ++ .../com/intellij/task/ProjectTaskManager.java | 10 +++- .../options/CompileStepBeforeRun.java | 2 +- 6 files changed, 95 insertions(+), 25 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java b/java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java index 646594e2d4f8..5aa4c074f6d2 100644 --- a/java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java +++ b/java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java @@ -22,6 +22,7 @@ import com.intellij.execution.runners.ExecutionEnvironment; 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; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -45,6 +46,8 @@ import java.util.stream.Stream; * @since 5/11/2016 */ public class InternalProjectTaskRunner extends ProjectTaskRunner { + private static final Logger LOG = Logger.getInstance(InternalProjectTaskRunner.class); + @Override public void run(@NotNull Project project, @NotNull ProjectTaskContext context, @@ -89,39 +92,60 @@ public class InternalProjectTaskRunner extends ProjectTaskRunner { if (!ContainerUtil.isEmpty(buildTasks)) { - List toMake = new SmartList<>(); - List toCompile = new SmartList<>(); + List modules = new SmartList<>(); + + Boolean isIncrementalBuild = null; + Boolean includeDependentModules = null; + Boolean includeRuntimeDependencies = null; for (ProjectTask buildProjectTask : buildTasks) { ModuleBuildTask moduleBuildTask = (ModuleBuildTask)buildProjectTask; - - if (moduleBuildTask.isIncrementalBuild()) { - toMake.add(moduleBuildTask.getModule()); + assertModuleBuildSettings(moduleBuildTask, isIncrementalBuild, includeDependentModules, includeRuntimeDependencies); + modules.add(moduleBuildTask.getModule()); + if (!moduleBuildTask.isIncrementalBuild()) { + isIncrementalBuild = false; } - else { - toCompile.add(moduleBuildTask.getModule()); + if (moduleBuildTask.isIncludeDependentModules()) { + includeDependentModules = true; + } + if (moduleBuildTask.isIncludeRuntimeDependencies()) { + includeRuntimeDependencies = true; } } CompilerManager compilerManager = CompilerManager.getInstance(project); - if (!toMake.isEmpty()) { - CompileScope scope = createScope(project, compilerManager, context, toMake); - // TODO handle multiple notifications + CompileScope scope = createScope( + compilerManager, context, modules, includeDependentModules != null, includeRuntimeDependencies != null); + if (isIncrementalBuild == null) { compilerManager.make(scope, compileNotification); } - if (!toCompile.isEmpty()) { - CompileScope scope = createScope(project, compilerManager, context, toCompile); - // TODO handle multiple notifications + else { compilerManager.compile(scope, compileNotification); } } } + private static void assertModuleBuildSettings(ModuleBuildTask moduleBuildTask, + Boolean isIncrementalBuild, + Boolean includeDependentModules, + Boolean includeRuntimeDependencies) { + if (isIncrementalBuild != null && moduleBuildTask.isIncrementalBuild()) { + LOG.warn("Incremental build setting for the module '" + moduleBuildTask.getModule().getName() + "' will be ignored"); + } + if (includeDependentModules != null && !moduleBuildTask.isIncludeDependentModules()) { + LOG.warn("'Module '" + moduleBuildTask.getModule().getName() + "' will be built along with dependent modules"); + } + if (includeRuntimeDependencies != null && !moduleBuildTask.isIncludeRuntimeDependencies()) { + LOG.warn("'Module '" + moduleBuildTask.getModule().getName() + "' will be built along with runtime dependencies"); + } + } - private static CompileScope createScope(Project project, - CompilerManager compilerManager, + private static CompileScope createScope(CompilerManager compilerManager, ProjectTaskContext context, - Collection modules) { - CompileScope scope = compilerManager.createModuleGroupCompileScope(project, modules.toArray(new Module[modules.size()]), true); + Collection modules, + boolean includeDependentModules, + boolean includeRuntimeDependencies) { + CompileScope scope = compilerManager.createModulesCompileScope( + modules.toArray(new Module[modules.size()]), includeDependentModules, includeRuntimeDependencies); RunConfiguration configuration = context.getRunConfiguration(); if (configuration != null) { scope.putUserData(CompilerManager.RUN_CONFIGURATION_KEY, configuration); diff --git a/java/compiler/impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java b/java/compiler/impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java index 6ae30a5512ef..49132691e61c 100644 --- a/java/compiler/impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java +++ b/java/compiler/impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java @@ -26,10 +26,21 @@ import org.jetbrains.annotations.NotNull; public class ModuleBuildTaskImpl extends AbstractBuildTask implements ModuleBuildTask { @NotNull private final Module myModule; + private final boolean myIncludeDependentModules; + private final boolean myIncludeRuntimeDependencies; public ModuleBuildTaskImpl(@NotNull Module module, boolean isIncrementalBuild) { + this(module, isIncrementalBuild, false, false); + } + + public ModuleBuildTaskImpl(@NotNull Module module, + boolean isIncrementalBuild, + boolean includeDependentModules, + boolean includeRuntimeDependencies) { super(isIncrementalBuild); myModule = module; + myIncludeDependentModules = includeDependentModules; + myIncludeRuntimeDependencies = includeRuntimeDependencies; } @NotNull @@ -38,6 +49,16 @@ public class ModuleBuildTaskImpl extends AbstractBuildTask implements ModuleBuil return myModule; } + @Override + public boolean isIncludeDependentModules() { + return myIncludeDependentModules; + } + + @Override + public boolean isIncludeRuntimeDependencies() { + return myIncludeRuntimeDependencies; + } + @NotNull @Override public String getPresentableName() { diff --git a/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java b/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java index 21eff5a8ff59..b370a4d22851 100644 --- a/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java @@ -25,6 +25,7 @@ import com.intellij.packaging.artifacts.Artifact; import com.intellij.task.*; import com.intellij.util.Consumer; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -50,12 +51,12 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { @Override public void build(@NotNull Module[] modules, @Nullable ProjectTaskNotification callback) { - run(createModulesBuildTask(true, modules), callback); + run(createModulesBuildTask(modules, true, true, false), callback); } @Override public void rebuild(@NotNull Module[] modules, @Nullable ProjectTaskNotification callback) { - run(createModulesBuildTask(false, modules), callback); + run(createModulesBuildTask(modules, false, false, false), callback); } @Override @@ -91,14 +92,26 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { @Override public ProjectTask createAllModulesBuildTask(boolean isIncrementalBuild, Project project) { - return createModulesBuildTask(isIncrementalBuild, ModuleManager.getInstance(project).getModules()); + return createModulesBuildTask(ModuleManager.getInstance(project).getModules(), isIncrementalBuild, false, false); } @Override - public ProjectTask createModulesBuildTask(boolean isIncrementalBuild, Module... modules) { + public ProjectTask createModulesBuildTask(Module module, + boolean isIncrementalBuild, + boolean includeDependentModules, + boolean includeRuntimeDependencies) { + return createModulesBuildTask(ContainerUtil.ar(module), isIncrementalBuild, includeDependentModules, includeRuntimeDependencies); + } + + @Override + public ProjectTask createModulesBuildTask(Module[] modules, + boolean isIncrementalBuild, + boolean includeDependentModules, + boolean includeRuntimeDependencies) { return modules.length == 1 - ? new ModuleBuildTaskImpl(modules[0], isIncrementalBuild) - : new ProjectTaskList(map(list(modules), module -> new ModuleBuildTaskImpl(module, isIncrementalBuild))); + ? new ModuleBuildTaskImpl(modules[0], isIncrementalBuild, includeDependentModules, includeRuntimeDependencies) + : new ProjectTaskList(map(list(modules), module -> + new ModuleBuildTaskImpl(module, isIncrementalBuild, includeDependentModules, includeRuntimeDependencies))); } @Override diff --git a/java/compiler/openapi/src/com/intellij/task/ModuleBuildTask.java b/java/compiler/openapi/src/com/intellij/task/ModuleBuildTask.java index ad08c7d474f1..c0e74d10454d 100644 --- a/java/compiler/openapi/src/com/intellij/task/ModuleBuildTask.java +++ b/java/compiler/openapi/src/com/intellij/task/ModuleBuildTask.java @@ -25,4 +25,8 @@ import org.jetbrains.annotations.NotNull; public interface ModuleBuildTask extends BuildTask { @NotNull Module getModule(); + + boolean isIncludeDependentModules(); + + boolean isIncludeRuntimeDependencies(); } diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java b/java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java index fe3d8474f128..46570c3911de 100644 --- a/java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java +++ b/java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java @@ -91,7 +91,15 @@ public abstract class ProjectTaskManager { public abstract ProjectTask createAllModulesBuildTask(boolean isIncrementalBuild, Project project); - public abstract ProjectTask createModulesBuildTask(boolean isIncrementalBuild, Module... modules); + public abstract ProjectTask createModulesBuildTask(Module module, + boolean isIncrementalBuild, + boolean includeDependentModules, + boolean includeRuntimeDependencies); + + public abstract ProjectTask createModulesBuildTask(Module[] modules, + boolean isIncrementalBuild, + boolean includeDependentModules, + boolean includeRuntimeDependencies); public abstract ProjectTask createArtifactsBuildTask(boolean isIncrementalBuild, Artifact... artifacts); diff --git a/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java b/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java index 6aaf886ef996..96d42d2aaf75 100644 --- a/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java +++ b/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java @@ -164,7 +164,7 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider