From 1730947b76e9e2d4dcef09f800bc7b9fa8f84a13 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Thu, 1 Feb 2018 13:51:36 +0300 Subject: [PATCH] Gradle java support extraction: move 'intellij.java.compiler' dependant features --- .../BuildArtifactsBeforeRunTaskProvider.java | 2 +- .../task/impl/ArtifactBuildTaskImpl.java | 3 + ...kRunner.java => JpsProjectTaskRunner.java} | 25 ++++--- .../packaging/artifacts/Artifact.java | 4 +- .../com/intellij/task/ArtifactBuildTask.java | 8 ++- .../src/com/intellij/task/BuildTask.java | 0 .../task/ExecuteRunConfigurationTask.java | 0 .../com/intellij/task/ModuleBuildTask.java | 0 .../intellij/task/ModuleFilesBuildTask.java | 0 .../intellij/task/ProjectModelBuildTask.java | 13 ++++ .../src/com/intellij/task/ProjectTask.java | 0 .../com/intellij/task/ProjectTaskContext.java | 0 .../com/intellij/task/ProjectTaskManager.java | 22 +++--- .../task/ProjectTaskNotification.java | 0 .../com/intellij/task/ProjectTaskResult.java | 0 .../com/intellij/task/ProjectTaskRunner.java | 0 .../intellij/task/impl/AbstractBuildTask.java | 0 .../task/impl/AbstractProjectTask.java | 0 .../impl/ExecuteRunConfigurationTaskImpl.java | 0 .../ExecutionEnvironmentProviderImpl.java | 0 .../task/impl/ModuleBuildTaskImpl.java | 0 .../task/impl/ModuleFilesBuildTaskImpl.java | 0 .../task/impl/ProjectModelBuildTaskImpl.java | 30 +++++++++ .../intellij/task/impl/ProjectTaskList.java | 0 .../task/impl/ProjectTaskManagerImpl.java | 67 +++++++++++++------ .../roots/ProjectModelBuildableElement.java | 13 ++++ plugins/gradle/intellij.gradle.iml | 1 - .../GradleArtifactBuildTasksProvider.java | 23 +++++++ .../build/GradleProjectTaskRunner.java | 21 +++--- .../plugins/gradle/GradleIdeManager.java | 4 +- .../GradleArtifactBuildTasksProvider.java | 37 ---------- resources/src/idea/RichPlatformPlugin.xml | 2 + 32 files changed, 180 insertions(+), 95 deletions(-) rename java/compiler/impl/src/com/intellij/task/impl/{InternalProjectTaskRunner.java => JpsProjectTaskRunner.java} (93%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/BuildTask.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ExecuteRunConfigurationTask.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ModuleBuildTask.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ModuleFilesBuildTask.java (100%) create mode 100644 platform/lang-api/src/com/intellij/task/ProjectModelBuildTask.java rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ProjectTask.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ProjectTaskContext.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ProjectTaskManager.java (82%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ProjectTaskNotification.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ProjectTaskResult.java (100%) rename {java/compiler/openapi => platform/lang-api}/src/com/intellij/task/ProjectTaskRunner.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/AbstractBuildTask.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/AbstractProjectTask.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/ExecuteRunConfigurationTaskImpl.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/ExecutionEnvironmentProviderImpl.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/ModuleBuildTaskImpl.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/ModuleFilesBuildTaskImpl.java (100%) create mode 100644 platform/lang-impl/src/com/intellij/task/impl/ProjectModelBuildTaskImpl.java rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/ProjectTaskList.java (100%) rename {java/compiler/impl => platform/lang-impl}/src/com/intellij/task/impl/ProjectTaskManagerImpl.java (76%) create mode 100644 platform/projectModel-api/src/com/intellij/openapi/roots/ProjectModelBuildableElement.java create mode 100644 plugins/gradle/java/src/execution/build/GradleArtifactBuildTasksProvider.java delete mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleArtifactBuildTasksProvider.java diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java index 92bf4c150ff5..7a435bb8d4d6 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTaskProvider.java @@ -116,6 +116,6 @@ public class BuildArtifactsBeforeRunTaskProvider extends BuildArtifactsBeforeRun @Override protected ProjectTask createProjectTask(Project project, List artifacts) { - return ProjectTaskManager.getInstance(project).createArtifactsBuildTask(true, artifacts.toArray(new Artifact[0])); + return ProjectTaskManager.getInstance(project).createBuildTask(true, artifacts.toArray(new Artifact[0])); } } diff --git a/java/compiler/impl/src/com/intellij/task/impl/ArtifactBuildTaskImpl.java b/java/compiler/impl/src/com/intellij/task/impl/ArtifactBuildTaskImpl.java index 5d7eead64169..2a95666750aa 100644 --- a/java/compiler/impl/src/com/intellij/task/impl/ArtifactBuildTaskImpl.java +++ b/java/compiler/impl/src/com/intellij/task/impl/ArtifactBuildTaskImpl.java @@ -17,9 +17,12 @@ package com.intellij.task.impl; import com.intellij.packaging.artifacts.Artifact; import com.intellij.task.ArtifactBuildTask; +import com.intellij.task.ProjectModelBuildTask; import org.jetbrains.annotations.NotNull; /** + * @deprecated to be removed, use {@link ProjectModelBuildTask} + * * @author Vladislav.Soroka * @since 5/14/2016 */ diff --git a/java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java b/java/compiler/impl/src/com/intellij/task/impl/JpsProjectTaskRunner.java similarity index 93% rename from java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java rename to java/compiler/impl/src/com/intellij/task/impl/JpsProjectTaskRunner.java index 78a51f78c83f..b5d11a02f444 100644 --- a/java/compiler/impl/src/com/intellij/task/impl/InternalProjectTaskRunner.java +++ b/java/compiler/impl/src/com/intellij/task/impl/JpsProjectTaskRunner.java @@ -23,6 +23,7 @@ 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.roots.ProjectModelBuildableElement; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -45,8 +46,8 @@ import java.util.stream.Stream; * @author Vladislav.Soroka * @since 5/11/2016 */ -public class InternalProjectTaskRunner extends ProjectTaskRunner { - private static final Logger LOG = Logger.getInstance(InternalProjectTaskRunner.class); +public class JpsProjectTaskRunner extends ProjectTaskRunner { + private static final Logger LOG = Logger.getInstance(JpsProjectTaskRunner.class); public static final Key EXECUTION_SESSION_ID_KEY = ExecutionManagerImpl.EXECUTION_SESSION_ID_KEY; @Override @@ -73,7 +74,7 @@ public class InternalProjectTaskRunner extends ProjectTaskRunner { return tasks.stream().collect(Collectors.groupingBy(o -> { if (o instanceof ModuleFilesBuildTask) return ModuleFilesBuildTask.class; if (o instanceof ModuleBuildTask) return ModuleBuildTask.class; - if (o instanceof ArtifactBuildTask) return ArtifactBuildTask.class; + if (o instanceof ProjectModelBuildTask) return ProjectModelBuildTask.class; return o.getClass(); })); } @@ -191,18 +192,20 @@ public class InternalProjectTaskRunner extends ProjectTaskRunner { @Nullable CompileStatusNotification compileNotification, @NotNull Map, List> tasksMap) { - Collection buildTasks = tasksMap.get(ArtifactBuildTask.class); + Collection buildTasks = tasksMap.get(ProjectModelBuildTask.class); if (!ContainerUtil.isEmpty(buildTasks)) { List toMake = new SmartList<>(); List toCompile = new SmartList<>(); for (ProjectTask buildProjectTask : buildTasks) { - ArtifactBuildTask artifactBuildTask = (ArtifactBuildTask)buildProjectTask; - - if (artifactBuildTask.isIncrementalBuild()) { - toMake.add(artifactBuildTask.getArtifact()); - } - else { - toCompile.add(artifactBuildTask.getArtifact()); + ProjectModelBuildTask buildTask = (ProjectModelBuildTask)buildProjectTask; + ProjectModelBuildableElement buildableElement = buildTask.getBuildableElement(); + if (buildableElement instanceof Artifact) { + if (buildTask.isIncrementalBuild()) { + toMake.add((Artifact)buildableElement); + } + else { + toCompile.add((Artifact)buildableElement); + } } } diff --git a/java/compiler/openapi/src/com/intellij/packaging/artifacts/Artifact.java b/java/compiler/openapi/src/com/intellij/packaging/artifacts/Artifact.java index 8441a39c9781..2157e23aee8e 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/artifacts/Artifact.java +++ b/java/compiler/openapi/src/com/intellij/packaging/artifacts/Artifact.java @@ -15,7 +15,7 @@ */ package com.intellij.packaging.artifacts; -import com.intellij.openapi.roots.ProjectModelElement; +import com.intellij.openapi.roots.ProjectModelBuildableElement; import com.intellij.openapi.util.UserDataHolder; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.elements.CompositePackagingElement; @@ -29,7 +29,7 @@ import java.util.Collection; * * @author nik */ -public interface Artifact extends UserDataHolder, ProjectModelElement { +public interface Artifact extends UserDataHolder, ProjectModelBuildableElement { @NotNull ArtifactType getArtifactType(); diff --git a/java/compiler/openapi/src/com/intellij/task/ArtifactBuildTask.java b/java/compiler/openapi/src/com/intellij/task/ArtifactBuildTask.java index 7c0fb3cdc0a9..9be7331fd534 100644 --- a/java/compiler/openapi/src/com/intellij/task/ArtifactBuildTask.java +++ b/java/compiler/openapi/src/com/intellij/task/ArtifactBuildTask.java @@ -18,9 +18,15 @@ package com.intellij.task; import com.intellij.packaging.artifacts.Artifact; /** + * + * @deprecated tobe removed, use {@link ProjectModelBuildTask} + * * @author Vladislav.Soroka * @since 7/18/2016 */ -public interface ArtifactBuildTask extends BuildTask { +public interface ArtifactBuildTask extends ProjectModelBuildTask { Artifact getArtifact(); + + @Override + default Artifact getBuildableElement() {return getArtifact();} } diff --git a/java/compiler/openapi/src/com/intellij/task/BuildTask.java b/platform/lang-api/src/com/intellij/task/BuildTask.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/BuildTask.java rename to platform/lang-api/src/com/intellij/task/BuildTask.java diff --git a/java/compiler/openapi/src/com/intellij/task/ExecuteRunConfigurationTask.java b/platform/lang-api/src/com/intellij/task/ExecuteRunConfigurationTask.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ExecuteRunConfigurationTask.java rename to platform/lang-api/src/com/intellij/task/ExecuteRunConfigurationTask.java diff --git a/java/compiler/openapi/src/com/intellij/task/ModuleBuildTask.java b/platform/lang-api/src/com/intellij/task/ModuleBuildTask.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ModuleBuildTask.java rename to platform/lang-api/src/com/intellij/task/ModuleBuildTask.java diff --git a/java/compiler/openapi/src/com/intellij/task/ModuleFilesBuildTask.java b/platform/lang-api/src/com/intellij/task/ModuleFilesBuildTask.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ModuleFilesBuildTask.java rename to platform/lang-api/src/com/intellij/task/ModuleFilesBuildTask.java diff --git a/platform/lang-api/src/com/intellij/task/ProjectModelBuildTask.java b/platform/lang-api/src/com/intellij/task/ProjectModelBuildTask.java new file mode 100644 index 000000000000..137ba5897ec6 --- /dev/null +++ b/platform/lang-api/src/com/intellij/task/ProjectModelBuildTask.java @@ -0,0 +1,13 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.task; + +import com.intellij.openapi.roots.ProjectModelBuildableElement; +import org.jetbrains.annotations.ApiStatus; + +/** + * @author Vladislav.Soroka + */ +@ApiStatus.Experimental +public interface ProjectModelBuildTask extends BuildTask { + T getBuildableElement(); +} diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTask.java b/platform/lang-api/src/com/intellij/task/ProjectTask.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ProjectTask.java rename to platform/lang-api/src/com/intellij/task/ProjectTask.java diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTaskContext.java b/platform/lang-api/src/com/intellij/task/ProjectTaskContext.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ProjectTaskContext.java rename to platform/lang-api/src/com/intellij/task/ProjectTaskContext.java diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java b/platform/lang-api/src/com/intellij/task/ProjectTaskManager.java similarity index 82% rename from java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java rename to platform/lang-api/src/com/intellij/task/ProjectTaskManager.java index 6aab9fe5c45f..1739e9804970 100644 --- a/java/compiler/openapi/src/com/intellij/task/ProjectTaskManager.java +++ b/platform/lang-api/src/com/intellij/task/ProjectTaskManager.java @@ -18,8 +18,8 @@ package com.intellij.task; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectModelBuildableElement; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.packaging.artifacts.Artifact; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -115,16 +115,16 @@ public abstract class ProjectTaskManager { compile(files, null); } - public abstract void build(@NotNull Artifact[] artifacts, @Nullable ProjectTaskNotification callback); + public abstract void build(@NotNull ProjectModelBuildableElement[] buildableElements, @Nullable ProjectTaskNotification callback); - public void build(@NotNull Artifact[] artifacts) { - build(artifacts, null); + public void build(@NotNull ProjectModelBuildableElement... buildableElements) { + build(buildableElements, null); } - public abstract void rebuild(@NotNull Artifact[] artifacts, @Nullable ProjectTaskNotification callback); + public abstract void rebuild(@NotNull ProjectModelBuildableElement[] buildableElements, @Nullable ProjectTaskNotification callback); - public void rebuild(@NotNull Artifact... artifacts) { - rebuild(artifacts, null); + public void rebuild(@NotNull ProjectModelBuildableElement... buildableElements) { + rebuild(buildableElements, null); } public abstract ProjectTask createAllModulesBuildTask(boolean isIncrementalBuild, Project project); @@ -139,6 +139,12 @@ public abstract class ProjectTaskManager { boolean includeDependentModules, boolean includeRuntimeDependencies); - public abstract ProjectTask createArtifactsBuildTask(boolean isIncrementalBuild, Artifact... artifacts); + public abstract ProjectTask createBuildTask(boolean isIncrementalBuild, ProjectModelBuildableElement... artifacts); + /** + * @deprecated use {@link #createBuildTask(boolean, ProjectModelBuildableElement...)} + */ + public ProjectTask createArtifactsBuildTask(boolean isIncrementalBuild, ProjectModelBuildableElement... artifacts) { + return createBuildTask(isIncrementalBuild, artifacts); + } } diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTaskNotification.java b/platform/lang-api/src/com/intellij/task/ProjectTaskNotification.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ProjectTaskNotification.java rename to platform/lang-api/src/com/intellij/task/ProjectTaskNotification.java diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTaskResult.java b/platform/lang-api/src/com/intellij/task/ProjectTaskResult.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ProjectTaskResult.java rename to platform/lang-api/src/com/intellij/task/ProjectTaskResult.java diff --git a/java/compiler/openapi/src/com/intellij/task/ProjectTaskRunner.java b/platform/lang-api/src/com/intellij/task/ProjectTaskRunner.java similarity index 100% rename from java/compiler/openapi/src/com/intellij/task/ProjectTaskRunner.java rename to platform/lang-api/src/com/intellij/task/ProjectTaskRunner.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/AbstractBuildTask.java b/platform/lang-impl/src/com/intellij/task/impl/AbstractBuildTask.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/AbstractBuildTask.java rename to platform/lang-impl/src/com/intellij/task/impl/AbstractBuildTask.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/AbstractProjectTask.java b/platform/lang-impl/src/com/intellij/task/impl/AbstractProjectTask.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/AbstractProjectTask.java rename to platform/lang-impl/src/com/intellij/task/impl/AbstractProjectTask.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/ExecuteRunConfigurationTaskImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ExecuteRunConfigurationTaskImpl.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/ExecuteRunConfigurationTaskImpl.java rename to platform/lang-impl/src/com/intellij/task/impl/ExecuteRunConfigurationTaskImpl.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/ExecutionEnvironmentProviderImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ExecutionEnvironmentProviderImpl.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/ExecutionEnvironmentProviderImpl.java rename to platform/lang-impl/src/com/intellij/task/impl/ExecutionEnvironmentProviderImpl.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java rename to platform/lang-impl/src/com/intellij/task/impl/ModuleBuildTaskImpl.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/ModuleFilesBuildTaskImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ModuleFilesBuildTaskImpl.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/ModuleFilesBuildTaskImpl.java rename to platform/lang-impl/src/com/intellij/task/impl/ModuleFilesBuildTaskImpl.java diff --git a/platform/lang-impl/src/com/intellij/task/impl/ProjectModelBuildTaskImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ProjectModelBuildTaskImpl.java new file mode 100644 index 000000000000..407dbcb6ad3a --- /dev/null +++ b/platform/lang-impl/src/com/intellij/task/impl/ProjectModelBuildTaskImpl.java @@ -0,0 +1,30 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.task.impl; + +import com.intellij.openapi.roots.ProjectModelBuildableElement; +import com.intellij.task.ProjectModelBuildTask; +import org.jetbrains.annotations.NotNull; + +/** + * @author Vladislav.Soroka + */ +public class ProjectModelBuildTaskImpl extends AbstractBuildTask + implements ProjectModelBuildTask { + private final T myBuildableElement; + + public ProjectModelBuildTaskImpl(T buildableElement, boolean isIncrementalBuild) { + super(isIncrementalBuild); + myBuildableElement = buildableElement; + } + + @Override + public T getBuildableElement() { + return myBuildableElement; + } + + @NotNull + @Override + public String getPresentableName() { + return "Project model element '" + myBuildableElement + "' build task"; + } +} diff --git a/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskList.java b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskList.java similarity index 100% rename from java/compiler/impl/src/com/intellij/task/impl/ProjectTaskList.java rename to platform/lang-impl/src/com/intellij/task/impl/ProjectTaskList.java diff --git a/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java similarity index 76% rename from java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java rename to platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java index b370a4d22851..d1acc2bd5f1f 100644 --- a/java/compiler/impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java @@ -19,9 +19,9 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectModelBuildableElement; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.packaging.artifacts.Artifact; import com.intellij.task.*; import com.intellij.util.Consumer; import com.intellij.util.SmartList; @@ -29,13 +29,18 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.intellij.util.containers.ContainerUtil.list; import static com.intellij.util.containers.ContainerUtil.map; +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.groupingBy; /** * @author Vladislav.Soroka @@ -43,7 +48,7 @@ import static com.intellij.util.containers.ContainerUtil.map; */ public class ProjectTaskManagerImpl extends ProjectTaskManager { - private final ProjectTaskRunner myDefaultProjectTaskRunner = new InternalProjectTaskRunner(); + private final ProjectTaskRunner myDummyTaskRunner = new DummyTaskRunner(); public ProjectTaskManagerImpl(@NotNull Project project) { super(project); @@ -61,8 +66,9 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { @Override public void compile(@NotNull VirtualFile[] files, @Nullable ProjectTaskNotification callback) { - List buildTasks = Arrays.stream(files) - .collect(Collectors.groupingBy(file -> ProjectFileIndex.SERVICE.getInstance(myProject).getModuleForFile(file, false))) + List buildTasks = stream(files) + .collect(groupingBy( + file -> ProjectFileIndex.SERVICE.getInstance(myProject).getModuleForFile(file, false))) .entrySet().stream() .map(entry -> new ModuleFilesBuildTaskImpl(entry.getKey(), false, entry.getValue())) .collect(Collectors.toList()); @@ -71,13 +77,13 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { } @Override - public void build(@NotNull Artifact[] artifacts, @Nullable ProjectTaskNotification callback) { - doBuild(artifacts, callback, true); + public void build(@NotNull ProjectModelBuildableElement[] buildableElements, @Nullable ProjectTaskNotification callback) { + doBuild(buildableElements, callback, true); } @Override - public void rebuild(@NotNull Artifact[] artifacts, @Nullable ProjectTaskNotification callback) { - doBuild(artifacts, callback, false); + public void rebuild(@NotNull ProjectModelBuildableElement[] buildableElements, @Nullable ProjectTaskNotification callback) { + doBuild(buildableElements, callback, false); } @Override @@ -115,10 +121,11 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { } @Override - public ProjectTask createArtifactsBuildTask(boolean isIncrementalBuild, Artifact... artifacts) { - return artifacts.length == 1 - ? new ArtifactBuildTaskImpl(artifacts[0], isIncrementalBuild) - : new ProjectTaskList(map(list(artifacts), artifact -> new ArtifactBuildTaskImpl(artifact, isIncrementalBuild))); + public ProjectTask createBuildTask(boolean isIncrementalBuild, ProjectModelBuildableElement... buildableElements) { + return buildableElements.length == 1 + ? new ProjectModelBuildTaskImpl<>(buildableElements[0], isIncrementalBuild) + : new ProjectTaskList(map(list(buildableElements), + buildableElement -> new ProjectModelBuildTaskImpl<>(buildableElement, isIncrementalBuild))); } @Override @@ -131,13 +138,12 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { List>> toRun = new SmartList<>(); Consumer> taskClassifier = tasks -> { - Map> toBuild = - tasks.stream().collect(Collectors.groupingBy(aTask -> { - for (ProjectTaskRunner runner : getTaskRunners()) { - if (runner.canRun(aTask)) return runner; - } - return myDefaultProjectTaskRunner; - })); + Map> toBuild = tasks.stream().collect( + groupingBy(aTask -> stream(getTaskRunners()) + .filter(runner -> runner.canRun(aTask)) + .findFirst() + .orElse(myDummyTaskRunner)) + ); for (Map.Entry> entry : toBuild.entrySet()) { toRun.add(Pair.create(entry.getKey(), entry.getValue())); } @@ -208,7 +214,24 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager { return ProjectTaskRunner.EP_NAME.getExtensions(); } - private void doBuild(@NotNull Artifact[] artifacts, @Nullable ProjectTaskNotification callback, boolean isIncrementalBuild) { - run(createArtifactsBuildTask(isIncrementalBuild, artifacts), callback); + private void doBuild(@NotNull ProjectModelBuildableElement[] buildableElements, + @Nullable ProjectTaskNotification callback, + boolean isIncrementalBuild) { + run(createBuildTask(isIncrementalBuild, buildableElements), callback); + } + + private static class DummyTaskRunner extends ProjectTaskRunner { + @Override + public void run(@NotNull Project project, + @NotNull ProjectTaskContext context, + @Nullable ProjectTaskNotification callback, + @NotNull Collection tasks) { + + } + + @Override + public boolean canRun(@NotNull ProjectTask projectTask) { + return false; + } } } diff --git a/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectModelBuildableElement.java b/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectModelBuildableElement.java new file mode 100644 index 000000000000..6ccb0f88c2fd --- /dev/null +++ b/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectModelBuildableElement.java @@ -0,0 +1,13 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.openapi.roots; + +import org.jetbrains.annotations.ApiStatus; + +/** + * Base interface for elements of the project model which can be built by some build system. + * + * @author Vladislav.Soroka + */ +@ApiStatus.Experimental +public interface ProjectModelBuildableElement extends ProjectModelElement { +} diff --git a/plugins/gradle/intellij.gradle.iml b/plugins/gradle/intellij.gradle.iml index 5b1042c5c53b..2a6645f10dae 100644 --- a/plugins/gradle/intellij.gradle.iml +++ b/plugins/gradle/intellij.gradle.iml @@ -14,7 +14,6 @@ - diff --git a/plugins/gradle/java/src/execution/build/GradleArtifactBuildTasksProvider.java b/plugins/gradle/java/src/execution/build/GradleArtifactBuildTasksProvider.java new file mode 100644 index 000000000000..e6fc73359a75 --- /dev/null +++ b/plugins/gradle/java/src/execution/build/GradleArtifactBuildTasksProvider.java @@ -0,0 +1,23 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.gradle.execution.build; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.externalSystem.model.execution.ExternalTaskPojo; +import com.intellij.task.ProjectModelBuildTask; +import com.intellij.util.Consumer; +import org.jetbrains.annotations.NotNull; + +/** + * @author Vladislav.Soroka + * @since 7/11/2016 + */ +public interface GradleArtifactBuildTasksProvider { + ExtensionPointName EP_NAME = + ExtensionPointName.create("org.jetbrains.plugins.gradle.artifactBuildTasksProvider"); + + boolean isApplicable(@NotNull ProjectModelBuildTask buildTask); + + void addArtifactsTargetsBuildTasks(@NotNull ProjectModelBuildTask buildTask, + @NotNull Consumer cleanTasksConsumer, + @NotNull Consumer buildTasksConsumer); +} diff --git a/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java b/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java index 76f5e0eb1003..f5f6e8d611d0 100644 --- a/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java +++ b/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java @@ -36,8 +36,9 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.packaging.artifacts.Artifact; import com.intellij.task.*; -import com.intellij.task.impl.InternalProjectTaskRunner; +import com.intellij.task.impl.JpsProjectTaskRunner; import com.intellij.util.SmartList; import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; @@ -85,12 +86,12 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner { MultiMap cleanTasksMap = MultiMap.createLinkedSet(); MultiMap initScripts = MultiMap.createLinkedSet(); - Map, List> taskMap = InternalProjectTaskRunner.groupBy(tasks); + Map, List> taskMap = JpsProjectTaskRunner.groupBy(tasks); List modules = addModulesBuildTasks(taskMap.get(ModuleBuildTask.class), buildTasksMap, initScripts); // TODO there should be 'gradle' way to build files instead of related modules entirely List modulesOfFiles = addModulesBuildTasks(taskMap.get(ModuleFilesBuildTask.class), buildTasksMap, initScripts); - addArtifactsBuildTasks(taskMap.get(ArtifactBuildTask.class), cleanTasksMap, buildTasksMap); + addArtifactsBuildTasks(taskMap.get(ProjectModelBuildTask.class), cleanTasksMap, buildTasksMap); // TODO send a message if nothing to build Set rootPaths = buildTasksMap.keySet(); @@ -177,10 +178,12 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner { if (projectTask instanceof ModuleBuildTask) { return ExternalSystemApiUtil.isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, ((ModuleBuildTask)projectTask).getModule()); } - if (projectTask instanceof ArtifactBuildTask) { - ArtifactBuildTask artifactBuildTask = (ArtifactBuildTask)projectTask; - for (GradleArtifactBuildTasksProvider buildTasksProvider : GradleArtifactBuildTasksProvider.EP_NAME.getExtensions()) { - if (buildTasksProvider.isApplicable(artifactBuildTask)) return true; + if (projectTask instanceof ProjectModelBuildTask) { + ProjectModelBuildTask buildTask = (ProjectModelBuildTask)projectTask; + if (buildTask.getBuildableElement() instanceof Artifact) { + for (GradleArtifactBuildTasksProvider buildTasksProvider : GradleArtifactBuildTasksProvider.EP_NAME.getExtensions()) { + if (buildTasksProvider.isApplicable(buildTask)) return true; + } } } @@ -284,9 +287,9 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner { if (ContainerUtil.isEmpty(tasks)) return; for (ProjectTask projectTask : tasks) { - if (!(projectTask instanceof ArtifactBuildTask)) continue; + if (!(projectTask instanceof ProjectModelBuildTask)) continue; - ArtifactBuildTask artifactBuildTask = (ArtifactBuildTask)projectTask; + ProjectModelBuildTask artifactBuildTask = (ProjectModelBuildTask)projectTask; for (GradleArtifactBuildTasksProvider buildTasksProvider : GradleArtifactBuildTasksProvider.EP_NAME.getExtensions()) { if (buildTasksProvider.isApplicable(artifactBuildTask)) { buildTasksProvider.addArtifactsTargetsBuildTasks( diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleIdeManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleIdeManager.java index 623015136162..3e2717617b25 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleIdeManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleIdeManager.java @@ -13,9 +13,7 @@ import org.jetbrains.annotations.NotNull; */ public class GradleIdeManager { - private static final @NotNull NotNullLazyValue myDefaultLazyValue = - NotNullLazyValue.createValue(GradleIdeManager::new); - + private static final @NotNull NotNullLazyValue myDefaultLazyValue = NotNullLazyValue.createValue(GradleIdeManager::new); public static GradleIdeManager getInstance() { GradleIdeManager ideManager = ServiceManager.getService(GradleIdeManager.class); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleArtifactBuildTasksProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleArtifactBuildTasksProvider.java deleted file mode 100644 index ad36f6cfc794..000000000000 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/build/GradleArtifactBuildTasksProvider.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * 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 org.jetbrains.plugins.gradle.execution.build; - -import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.externalSystem.model.execution.ExternalTaskPojo; -import com.intellij.task.ArtifactBuildTask; -import com.intellij.util.Consumer; -import org.jetbrains.annotations.NotNull; - -/** - * @author Vladislav.Soroka - * @since 7/11/2016 - */ -public interface GradleArtifactBuildTasksProvider { - ExtensionPointName EP_NAME = - ExtensionPointName.create("org.jetbrains.plugins.gradle.artifactBuildTasksProvider"); - - boolean isApplicable(@NotNull ArtifactBuildTask artifactBuildTask); - - void addArtifactsTargetsBuildTasks(@NotNull ArtifactBuildTask artifactBuildTask, - @NotNull Consumer cleanTasksConsumer, - @NotNull Consumer buildTasksConsumer); -} diff --git a/resources/src/idea/RichPlatformPlugin.xml b/resources/src/idea/RichPlatformPlugin.xml index 28642b577487..dbc0ca7f7e94 100644 --- a/resources/src/idea/RichPlatformPlugin.xml +++ b/resources/src/idea/RichPlatformPlugin.xml @@ -109,6 +109,8 @@ + +