Gradle java support extraction: move 'intellij.java.compiler' dependant features

This commit is contained in:
Vladislav.Soroka
2018-02-17 09:20:37 +03:00
parent 616e5ef0c5
commit 1730947b76
32 changed files with 180 additions and 95 deletions
@@ -116,6 +116,6 @@ public class BuildArtifactsBeforeRunTaskProvider extends BuildArtifactsBeforeRun
@Override
protected ProjectTask createProjectTask(Project project, List<Artifact> artifacts) {
return ProjectTaskManager.getInstance(project).createArtifactsBuildTask(true, artifacts.toArray(new Artifact[0]));
return ProjectTaskManager.getInstance(project).createBuildTask(true, artifacts.toArray(new Artifact[0]));
}
}
@@ -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
*/
@@ -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<Object> 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<Class<? extends ProjectTask>, List<ProjectTask>> tasksMap) {
Collection<? extends ProjectTask> buildTasks = tasksMap.get(ArtifactBuildTask.class);
Collection<? extends ProjectTask> buildTasks = tasksMap.get(ProjectModelBuildTask.class);
if (!ContainerUtil.isEmpty(buildTasks)) {
List<Artifact> toMake = new SmartList<>();
List<Artifact> 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);
}
}
}
@@ -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();
@@ -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> {
Artifact getArtifact();
@Override
default Artifact getBuildableElement() {return getArtifact();}
}
@@ -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<T extends ProjectModelBuildableElement> extends BuildTask {
T getBuildableElement();
}
@@ -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);
}
}
@@ -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<T extends ProjectModelBuildableElement> extends AbstractBuildTask
implements ProjectModelBuildTask<T> {
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";
}
}
@@ -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<ModuleFilesBuildTask> buildTasks = Arrays.stream(files)
.collect(Collectors.groupingBy(file -> ProjectFileIndex.SERVICE.getInstance(myProject).getModuleForFile(file, false)))
List<ModuleFilesBuildTask> 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<Pair<ProjectTaskRunner, Collection<? extends ProjectTask>>> toRun = new SmartList<>();
Consumer<Collection<? extends ProjectTask>> taskClassifier = tasks -> {
Map<ProjectTaskRunner, ? extends List<? extends ProjectTask>> toBuild =
tasks.stream().collect(Collectors.groupingBy(aTask -> {
for (ProjectTaskRunner runner : getTaskRunners()) {
if (runner.canRun(aTask)) return runner;
}
return myDefaultProjectTaskRunner;
}));
Map<ProjectTaskRunner, ? extends List<? extends ProjectTask>> toBuild = tasks.stream().collect(
groupingBy(aTask -> stream(getTaskRunners())
.filter(runner -> runner.canRun(aTask))
.findFirst()
.orElse(myDummyTaskRunner))
);
for (Map.Entry<ProjectTaskRunner, ? extends List<? extends ProjectTask>> 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<? extends ProjectTask> tasks) {
}
@Override
public boolean canRun(@NotNull ProjectTask projectTask) {
return false;
}
}
}
@@ -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 {
}
-1
View File
@@ -14,7 +14,6 @@
<orderEntry type="module" module-name="intellij.gradle.toolingExtension.impl" />
<orderEntry type="module" module-name="intellij.gradle.jps" />
<orderEntry type="module" module-name="intellij.platform.lang" />
<orderEntry type="module" module-name="intellij.java.compiler" />
<orderEntry type="module" module-name="intellij.platform.lang.impl" />
<orderEntry type="library" name="swingx" level="project" />
<orderEntry type="library" exported="" name="Slf4j" level="project" />
@@ -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<GradleArtifactBuildTasksProvider> EP_NAME =
ExtensionPointName.create("org.jetbrains.plugins.gradle.artifactBuildTasksProvider");
boolean isApplicable(@NotNull ProjectModelBuildTask buildTask);
void addArtifactsTargetsBuildTasks(@NotNull ProjectModelBuildTask buildTask,
@NotNull Consumer<ExternalTaskPojo> cleanTasksConsumer,
@NotNull Consumer<ExternalTaskPojo> buildTasksConsumer);
}
@@ -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<String, String> cleanTasksMap = MultiMap.createLinkedSet();
MultiMap<String, String> initScripts = MultiMap.createLinkedSet();
Map<Class<? extends ProjectTask>, List<ProjectTask>> taskMap = InternalProjectTaskRunner.groupBy(tasks);
Map<Class<? extends ProjectTask>, List<ProjectTask>> taskMap = JpsProjectTaskRunner.groupBy(tasks);
List<Module> modules = addModulesBuildTasks(taskMap.get(ModuleBuildTask.class), buildTasksMap, initScripts);
// TODO there should be 'gradle' way to build files instead of related modules entirely
List<Module> 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<String> 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(
@@ -13,9 +13,7 @@ import org.jetbrains.annotations.NotNull;
*/
public class GradleIdeManager {
private static final @NotNull NotNullLazyValue<GradleIdeManager> myDefaultLazyValue =
NotNullLazyValue.createValue(GradleIdeManager::new);
private static final @NotNull NotNullLazyValue<GradleIdeManager> myDefaultLazyValue = NotNullLazyValue.createValue(GradleIdeManager::new);
public static GradleIdeManager getInstance() {
GradleIdeManager ideManager = ServiceManager.getService(GradleIdeManager.class);
@@ -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<GradleArtifactBuildTasksProvider> EP_NAME =
ExtensionPointName.create("org.jetbrains.plugins.gradle.artifactBuildTasksProvider");
boolean isApplicable(@NotNull ArtifactBuildTask artifactBuildTask);
void addArtifactsTargetsBuildTasks(@NotNull ArtifactBuildTask artifactBuildTask,
@NotNull Consumer<ExternalTaskPojo> cleanTasksConsumer,
@NotNull Consumer<ExternalTaskPojo> buildTasksConsumer);
}
@@ -109,6 +109,8 @@
<compiler.buildTargetScopeProvider implementation="com.intellij.packaging.impl.compiler.ArtifactBuildTargetScopeProvider"/>
<compiler implementation="com.intellij.packaging.impl.compiler.ArtifactsCompiler" id="artifactsCompiler"/>
<projectTaskRunner implementation="com.intellij.task.impl.JpsProjectTaskRunner" id="jps" order="last"/>
<gotoRelatedProvider implementation="com.intellij.testIntegration.GotoTestRelatedProvider"/>
<applicationService serviceInterface="com.intellij.ide.RecentProjectsManager"