diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/settings/CompilerConfigurationHandler.java b/java/compiler/impl/src/com/intellij/openapi/externalSystem/service/project/settings/CompilerConfigurationHandler.java
similarity index 100%
rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/settings/CompilerConfigurationHandler.java
rename to java/compiler/impl/src/com/intellij/openapi/externalSystem/service/project/settings/CompilerConfigurationHandler.java
diff --git a/java/execution/impl/intellij.java.execution.impl.iml b/java/execution/impl/intellij.java.execution.impl.iml
index ef4a9ae16447..0873bb1247e0 100644
--- a/java/execution/impl/intellij.java.execution.impl.iml
+++ b/java/execution/impl/intellij.java.execution.impl.iml
@@ -22,6 +22,7 @@
+
diff --git a/java/execution/impl/src/com/intellij/execution/ExternalSystemRunConfigurationJavaExtension.java b/java/execution/impl/src/com/intellij/execution/ExternalSystemRunConfigurationJavaExtension.java
new file mode 100644
index 000000000000..f7a9c40204ca
--- /dev/null
+++ b/java/execution/impl/src/com/intellij/execution/ExternalSystemRunConfigurationJavaExtension.java
@@ -0,0 +1,77 @@
+// Copyright 2000-2019 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.execution;
+
+import com.intellij.execution.configurations.*;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemProcessHandler;
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfiguration;
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfigurationExtension;
+import com.intellij.openapi.options.SettingsEditorGroup;
+import org.jdom.Element;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+@ApiStatus.Experimental
+public class ExternalSystemRunConfigurationJavaExtension implements ExternalSystemRunConfigurationExtension {
+ private static final Logger LOG = Logger.getInstance(ExternalSystemRunConfigurationJavaExtension.class);
+
+ @Override
+ public void readExternal(@NotNull ExternalSystemRunConfiguration configuration, @NotNull Element element) {
+ JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
+ if (javaRunConfigurationExtensionManager != null) {
+ javaRunConfigurationExtensionManager.readExternal(configuration, element);
+ }
+ }
+
+ @Override
+ public void writeExternal(@NotNull ExternalSystemRunConfiguration configuration, @NotNull Element element) {
+ JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
+ if (javaRunConfigurationExtensionManager != null) {
+ javaRunConfigurationExtensionManager.writeExternal(configuration, element);
+ }
+ }
+
+ @Override
+ public void appendEditors(@NotNull ExternalSystemRunConfiguration configuration,
+ @NotNull SettingsEditorGroup group) {
+ JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
+ if (javaRunConfigurationExtensionManager != null) {
+ javaRunConfigurationExtensionManager.appendEditors(configuration, group);
+ }
+ }
+
+ @Override
+ public void attachToProcess(@NotNull ExternalSystemRunConfiguration configuration,
+ @NotNull ExternalSystemProcessHandler processHandler,
+ @Nullable RunnerSettings settings) {
+ JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
+ if (javaRunConfigurationExtensionManager != null) {
+ javaRunConfigurationExtensionManager.attachExtensionsToProcess(configuration, processHandler, settings);
+ }
+ }
+
+ @Override
+ public void updateVMParameters(@NotNull ExternalSystemRunConfiguration configuration,
+ @NotNull SimpleJavaParameters javaParameters,
+ @Nullable RunnerSettings settings,
+ @NotNull Executor executor) {
+ final JavaParameters extensionsJP = new JavaParameters();
+ for (RunConfigurationExtension ext : RunConfigurationExtension.EP_NAME.getExtensionList()) {
+ try {
+ ext.updateJavaParameters(configuration, extensionsJP, settings, executor);
+ }
+ catch (ExecutionException e) {
+ LOG.error(e);
+ }
+ }
+ copy(extensionsJP.getVMParametersList(), javaParameters.getVMParametersList());
+ }
+
+ private static void copy(@NotNull ParametersList from, @NotNull ParametersList to) {
+ to.addAll(from.getParameters());
+ for (ParamsGroup group : from.getParamsGroups()) {
+ to.addParamsGroup(group);
+ }
+ }
+}
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskDebugRunner.java b/java/execution/impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskDebugRunner.java
similarity index 100%
rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskDebugRunner.java
rename to java/execution/impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskDebugRunner.java
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java b/java/execution/impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java
similarity index 100%
rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java
rename to java/execution/impl/src/com/intellij/openapi/externalSystem/service/execution/ForkedDebuggerThread.java
diff --git a/java/idea-ui/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java
index 10036483999f..7dcf57818d22 100644
--- a/java/idea-ui/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java
+++ b/java/idea-ui/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java
@@ -31,12 +31,6 @@ public class AttachExternalProjectAction extends AnAction {
@Override
public void update(@NotNull AnActionEvent e) {
Presentation presentation = e.getPresentation();
- // todo [Vlad, IDEA-187835]: provide java subsystem independent implementation
- if (!ExternalSystemApiUtil.isJavaCompatibleIde()) {
- presentation.setEnabledAndVisible(false);
- return;
- }
-
ProjectSystemId externalSystemId = e.getData(ExternalSystemDataKeys.EXTERNAL_SYSTEM_ID);
if (externalSystemId != null) {
String name = externalSystemId.getReadableName();
diff --git a/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java
index 345d3a867768..11603471ee83 100644
--- a/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java
+++ b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java
@@ -85,7 +85,7 @@ public class PackagingModifiableModelImpl implements PackagingModifiableModel {
@Override
public void dispose() {
if (myModifiableArtifactModel != null) {
- myModifiableArtifactModel.commit();
+ myModifiableArtifactModel.dispose();
}
}
diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml
index fdf1c03e0c98..feeeaa5fac0f 100644
--- a/java/java-impl/src/META-INF/JavaPlugin.xml
+++ b/java/java-impl/src/META-INF/JavaPlugin.xml
@@ -547,10 +547,15 @@
+
+
+
+
diff --git a/java/java-impl/src/com/intellij/openapi/externalSystem/service/project/ModuleDataServiceJavaExtension.java b/java/java-impl/src/com/intellij/openapi/externalSystem/service/project/ModuleDataServiceJavaExtension.java
new file mode 100644
index 000000000000..154076b215b3
--- /dev/null
+++ b/java/java-impl/src/com/intellij/openapi/externalSystem/service/project/ModuleDataServiceJavaExtension.java
@@ -0,0 +1,49 @@
+// Copyright 2000-2019 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.externalSystem.service.project;
+
+import com.intellij.compiler.CompilerConfiguration;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.externalSystem.model.project.ModuleData;
+import com.intellij.openapi.externalSystem.service.project.manage.ModuleDataServiceExtension;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleTypeId;
+import com.intellij.openapi.roots.LanguageLevelModuleExtension;
+import com.intellij.openapi.roots.ModifiableRootModel;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+@ApiStatus.Experimental
+public class ModuleDataServiceJavaExtension implements ModuleDataServiceExtension {
+ private static final Logger LOG = Logger.getInstance(ModuleDataServiceJavaExtension.class);
+
+ @Override
+ public void importModule(@NotNull IdeModifiableModelsProvider modelsProvider, @NotNull Module module, @NotNull ModuleData data) {
+ if (ModuleTypeId.JAVA_MODULE.equals(module.getModuleTypeName())) {
+ ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module);
+ setLanguageLevel(modifiableRootModel, data);
+
+ setBytecodeTargetLevel(module, data);
+ }
+ }
+
+ private static void setLanguageLevel(@NotNull ModifiableRootModel modifiableRootModel, ModuleData data) {
+ LanguageLevel level = LanguageLevel.parse(data.getSourceCompatibility());
+ if (level != null) {
+ try {
+ modifiableRootModel.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(level);
+ }
+ catch (IllegalArgumentException e) {
+ LOG.debug(e);
+ }
+ }
+ }
+
+ private static void setBytecodeTargetLevel(@NotNull Module module, @NotNull ModuleData data) {
+ String targetLevel = data.getTargetCompatibility();
+ if (targetLevel != null) {
+ CompilerConfiguration configuration = CompilerConfiguration.getInstance(module.getProject());
+ configuration.setBytecodeTargetLevel(module, targetLevel);
+ }
+ }
+}
diff --git a/platform/external-system-impl/intellij.platform.externalSystem.impl.iml b/platform/external-system-impl/intellij.platform.externalSystem.impl.iml
index fbab2f82f788..981903bf21f5 100644
--- a/platform/external-system-impl/intellij.platform.externalSystem.impl.iml
+++ b/platform/external-system-impl/intellij.platform.externalSystem.impl.iml
@@ -24,7 +24,6 @@
-
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/RemoteExternalSystemCommunicationManager.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/RemoteExternalSystemCommunicationManager.java
index 18a2ae7d35cb..a6d2deda6604 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/RemoteExternalSystemCommunicationManager.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/RemoteExternalSystemCommunicationManager.java
@@ -3,7 +3,6 @@ package com.intellij.openapi.externalSystem.service;
import com.intellij.CommonBundle;
import com.intellij.configurationStore.StorageUtilKt;
-import com.intellij.debugger.ui.DebuggerView;
import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionResult;
@@ -116,7 +115,6 @@ public class RemoteExternalSystemCommunicationManager implements ExternalSystemC
List classPath = new ArrayList<>(PathManager.getUtilClassPath());
ContainerUtil.addIfNotNull(classPath, PathUtil.getJarPathForClass(ProjectBundle.class));
ContainerUtil.addIfNotNull(classPath, PathUtil.getJarPathForClass(PlaceHolder.class));
- ContainerUtil.addIfNotNull(classPath, PathUtil.getJarPathForClass(DebuggerView.class));
ExternalSystemApiUtil.addBundle(params.getClassPath(), "messages.ProjectBundle", ProjectBundle.class);
ContainerUtil.addIfNotNull(classPath, PathUtil.getJarPathForClass(PsiBundle.class));
ContainerUtil.addIfNotNull(classPath, PathUtil.getJarPathForClass(Alarm.class));
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java
index a7c7af76dd37..6ee56e19e246 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java
@@ -11,7 +11,6 @@ import com.intellij.diagnostic.logging.LogConfigurationPanel;
import com.intellij.execution.*;
import com.intellij.execution.configurations.*;
import com.intellij.execution.console.DuplexConsoleView;
-import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.impl.ConsoleViewImpl;
import com.intellij.execution.impl.ExecutionManagerImpl;
import com.intellij.execution.process.ProcessHandler;
@@ -34,6 +33,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.FoldRegion;
import com.intellij.openapi.editor.FoldingModel;
+import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.externalSystem.ExternalSystemManager;
import com.intellij.openapi.externalSystem.execution.ExternalSystemExecutionConsoleManager;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
@@ -58,6 +58,7 @@ import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScopes;
import com.intellij.util.ArrayUtil;
@@ -83,12 +84,16 @@ import static com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHel
import static com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHelper.DEBUG_SETUP_PREFIX;
import static com.intellij.openapi.externalSystem.util.ExternalSystemUtil.convert;
import static com.intellij.openapi.externalSystem.util.ExternalSystemUtil.getConsoleManagerFor;
+import static com.intellij.openapi.util.text.StringUtil.nullize;
/**
* @author Denis Zhdanov
*/
public class ExternalSystemRunConfiguration extends LocatableConfigurationBase implements SearchScopeProvidingRunProfile,
SMRunnerConsolePropertiesProvider {
+ private static final ExtensionPointName EP_NAME
+ = ExtensionPointName.create("com.intellij.externalSystem.runConfigurationExtension");
+
public static final Key RUN_INPUT_KEY = Key.create("RUN_INPUT_KEY");
public static final Key> PROGRESS_LISTENER_KEY = Key.create("PROGRESS_LISTENER_KEY");
@@ -132,10 +137,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
if (e != null) {
mySettings = XmlSerializer.deserialize(e, ExternalSystemTaskExecutionSettings.class);
}
- JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
- if (javaRunConfigurationExtensionManager != null) {
- javaRunConfigurationExtensionManager.readExternal(this, element);
- }
+ EP_NAME.forEachExtensionSafe(extension -> extension.readExternal(this, element));
}
@Override
@@ -155,10 +157,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
}
}
}));
- JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
- if (javaRunConfigurationExtensionManager != null) {
- javaRunConfigurationExtensionManager.writeExternal(this, element);
- }
+ EP_NAME.forEachExtensionSafe(extension -> extension.writeExternal(this, element));
}
@NotNull
@@ -172,10 +171,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
SettingsEditorGroup group = new SettingsEditorGroup<>();
group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"),
new ExternalSystemRunConfigurationEditor(getProject(), mySettings.getExternalSystemId()));
- JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
- if (javaRunConfigurationExtensionManager != null) {
- javaRunConfigurationExtensionManager.appendEditors(this, group);
- }
+ EP_NAME.forEachExtensionSafe(extension -> extension.appendEditors(this, group));
group.addEditor(ExecutionBundle.message("logs.tab.title"), new LogConfigurationPanel<>());
return group;
}
@@ -183,8 +179,9 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
@Nullable
@Override
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) {
- MyRunnableState runnableState =
- new MyRunnableState(mySettings, getProject(), DefaultDebugExecutor.EXECUTOR_ID.equals(executor.getId()), this, env);
+ // DebugExecutor ID - com.intellij.execution.executors.DefaultDebugExecutor.EXECUTOR_ID
+ String debugExecutorId = ToolWindowId.DEBUG;
+ MyRunnableState runnableState = new MyRunnableState(mySettings, getProject(), debugExecutorId.equals(executor.getId()), this, env);
copyUserDataTo(runnableState);
return runnableState;
}
@@ -313,10 +310,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
progressListenerClazz != null ? ServiceManager.getService(myProject, progressListenerClazz)
: createBuildView(task.getId(), executionName, task.getExternalProjectPath(), consoleView);
- JavaRunConfigurationExtensionManager javaRunConfigurationExtensionManager = JavaRunConfigurationExtensionManager.getInstanceOrNull();
- if (javaRunConfigurationExtensionManager != null) {
- javaRunConfigurationExtensionManager.attachExtensionsToProcess(myConfiguration, processHandler, myEnv.getRunnerSettings());
- }
+ EP_NAME.forEachExtensionSafe(extension -> extension.attachToProcess(myConfiguration, processHandler, myEnv.getRunnerSettings()));
ApplicationManager.getApplication().executeOnPooledThread(() -> {
final String startDateTime = DateFormatUtil.formatTimeWithSeconds(System.currentTimeMillis());
@@ -341,9 +335,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
new BuildViewSettingsProviderAdapter((BuildViewSettingsProvider)consoleView) : null;
progressListener.onEvent(id,
new StartBuildEventImpl(new DefaultBuildDescriptor(id, executionName, workingDir, eventTime), "running...")
- .withProcessHandler(processHandler, view -> {
- foldGreetingOrFarewell(consoleView, greeting, true);
- })
+ .withProcessHandler(processHandler, view -> foldGreetingOrFarewell(consoleView, greeting, true))
.withContentDescriptorSupplier(() -> myContentDescriptor)
.withRestartAction(rerunTaskAction)
.withRestartActions(restartActions)
@@ -426,16 +418,10 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
@Nullable
private String getJvmAgentSetup() throws ExecutionException {
- // todo [Vlad, IDEA-187832]: extract to `external-system-java` module
- if(!ExternalSystemApiUtil.isJavaCompatibleIde()) return null;
-
- final JavaParameters extensionsJP = new JavaParameters();
- for (RunConfigurationExtension ext : RunConfigurationExtension.EP_NAME.getExtensionList()) {
- ext.updateJavaParameters(myConfiguration, extensionsJP, myEnv.getRunnerSettings(), myEnv.getExecutor());
- }
-
+ final SimpleJavaParameters extensionsJP = new SimpleJavaParameters();
+ EP_NAME.forEachExtensionSafe(
+ extension -> extension.updateVMParameters(myConfiguration, extensionsJP, myEnv.getRunnerSettings(), myEnv.getExecutor()));
String jvmAgentSetup;
-
if (myDebugPort > 0) {
jvmAgentSetup = DEBUG_SETUP_PREFIX + myDebugPort;
if (getForkSocket() != null) {
@@ -456,7 +442,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
}
jvmAgentSetup = parametersList.getParametersString();
}
- return jvmAgentSetup;
+ return nullize(jvmAgentSetup);
}
private BuildProgressListener createBuildView(ExternalSystemTaskId id,
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfigurationExtension.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfigurationExtension.java
new file mode 100644
index 000000000000..62a5bbfcc244
--- /dev/null
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfigurationExtension.java
@@ -0,0 +1,30 @@
+// Copyright 2000-2019 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.externalSystem.service.execution;
+
+import com.intellij.execution.Executor;
+import com.intellij.execution.configurations.RunnerSettings;
+import com.intellij.execution.configurations.SimpleJavaParameters;
+import com.intellij.openapi.options.SettingsEditorGroup;
+import org.jdom.Element;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+@ApiStatus.Experimental
+public interface ExternalSystemRunConfigurationExtension {
+ void readExternal(@NotNull ExternalSystemRunConfiguration configuration, @NotNull Element element);
+
+ void writeExternal(@NotNull ExternalSystemRunConfiguration configuration, @NotNull Element element);
+
+ void appendEditors(@NotNull ExternalSystemRunConfiguration configuration,
+ @NotNull SettingsEditorGroup group);
+
+ void attachToProcess(@NotNull ExternalSystemRunConfiguration configuration,
+ @NotNull ExternalSystemProcessHandler processHandler,
+ @Nullable RunnerSettings settings);
+
+ void updateVMParameters(@NotNull ExternalSystemRunConfiguration configuration,
+ @NotNull SimpleJavaParameters javaParameters,
+ @Nullable RunnerSettings settings,
+ @NotNull Executor executor);
+}
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java
index a764d604e978..587e0f121241 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java
@@ -24,17 +24,10 @@ import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.ProjectModelExternalSource;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
-import com.intellij.packaging.artifacts.*;
-import com.intellij.packaging.elements.CompositePackagingElement;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Collection;
-import java.util.List;
public class IdeModifiableModelsProviderImpl extends AbstractIdeModifiableModelsProvider {
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java
index 747380be32f3..652f8b00cd8c 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractModuleDataService.java
@@ -1,7 +1,6 @@
// Copyright 2000-2019 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.externalSystem.service.project.manage;
-import com.intellij.compiler.CompilerConfiguration;
import com.intellij.configurationStore.StateStorageManagerKt;
import com.intellij.history.LocalHistory;
import com.intellij.history.LocalHistoryAction;
@@ -11,10 +10,12 @@ import com.intellij.notification.NotificationGroup;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.ProjectKeys;
import com.intellij.openapi.externalSystem.model.project.*;
+import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkProvider;
import com.intellij.openapi.externalSystem.service.project.IdeModelsProvider;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings;
@@ -23,7 +24,6 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.externalSystem.util.ExternalSystemBundle;
import com.intellij.openapi.module.*;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.*;
@@ -38,7 +38,6 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindowId;
-import com.intellij.pom.java.LanguageLevel;
import com.intellij.ui.CheckBoxList;
import com.intellij.ui.JBColor;
import com.intellij.ui.ScrollPaneFactory;
@@ -77,6 +76,9 @@ public abstract class AbstractModuleDataService extends Ab
private static final Logger LOG = Logger.getInstance(AbstractModuleDataService.class);
+ private final static ExtensionPointName EP_NAME =
+ ExtensionPointName.create("com.intellij.externalSystem.moduleDataServiceExtension");
+
@Override
public void importData(@NotNull final Collection> toImport,
@Nullable ProjectData projectData,
@@ -104,10 +106,7 @@ public abstract class AbstractModuleDataService extends Ab
ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module);
syncPaths(module, modifiableRootModel, node.getData());
- if(ModuleTypeId.JAVA_MODULE.equals(module.getModuleTypeName()) && ExternalSystemApiUtil.isJavaCompatibleIde()) {
- // todo [Vlad, IDEA-187832]: extract to `external-system-java` module
- setLanguageLevel(modifiableRootModel, node.getData());
- }
+ EP_NAME.forEachExtensionSafe(extension -> extension.importModule(modelsProvider, module, node.getData()));
setSdk(modifiableRootModel, node.getData());
}
}
@@ -409,7 +408,6 @@ public abstract class AbstractModuleDataService extends Ab
if (orderAwareMap != null) {
rearrangeOrderEntries(orderAwareMap, modelsProvider.getModifiableRootModel(module));
}
- setBytecodeTargetLevel(project, module, moduleDataNode.getData());
moduleDataNode.putUserData(MODULE_KEY, null);
moduleDataNode.putUserData(ORDERED_DATA_MAP_KEY, null);
}
@@ -475,18 +473,6 @@ public abstract class AbstractModuleDataService extends Ab
return idx;
}
- private void setLanguageLevel(@NotNull ModifiableRootModel modifiableRootModel, E data) {
- LanguageLevel level = LanguageLevel.parse(data.getSourceCompatibility());
- if (level != null) {
- try {
- modifiableRootModel.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(level);
- }
- catch (IllegalArgumentException e) {
- LOG.debug(e);
- }
- }
- }
-
private void setSdk(@NotNull ModifiableRootModel modifiableRootModel, E data) {
String skdName = data.getSdkName();
if (skdName != null) {
@@ -496,16 +482,8 @@ public abstract class AbstractModuleDataService extends Ab
modifiableRootModel.setSdk(sdk);
}
else {
- modifiableRootModel.setInvalidSdk(skdName, JavaSdk.getInstance().getName());
+ modifiableRootModel.setInvalidSdk(skdName, ExternalSystemJdkProvider.getInstance().getJavaSdkType().getName());
}
}
}
-
- private void setBytecodeTargetLevel(@NotNull Project project, @NotNull Module module, @NotNull E data) {
- String targetLevel = data.getTargetCompatibility();
- if (targetLevel != null) {
- CompilerConfiguration configuration = CompilerConfiguration.getInstance(project);
- configuration.setBytecodeTargetLevel(module, targetLevel);
- }
- }
}
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalSystemTaskActivator.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalSystemTaskActivator.java
index d7574e7fbd8f..fb0c45e37ae4 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalSystemTaskActivator.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalSystemTaskActivator.java
@@ -1,14 +1,11 @@
// Copyright 2000-2019 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.externalSystem.service.project.manage;
+import com.intellij.execution.ExecutionException;
import com.intellij.execution.RunManager;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.executors.DefaultRunExecutor;
-import com.intellij.openapi.application.ReadAction;
-import com.intellij.openapi.compiler.CompileContext;
-import com.intellij.openapi.compiler.CompileTask;
-import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings;
@@ -27,6 +24,13 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.task.ModuleBuildTask;
+import com.intellij.task.ProjectTaskContext;
+import com.intellij.task.ProjectTaskManager;
+import com.intellij.task.ProjectTaskResult;
+import com.intellij.task.impl.ProjectTaskManagerImpl;
+import com.intellij.task.impl.ProjectTaskManagerListener;
+import com.intellij.task.impl.ProjectTaskScope;
import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
@@ -55,27 +59,22 @@ public class ExternalSystemTaskActivator {
}
public void init() {
- CompilerManager compilerManager = CompilerManager.getInstance(myProject);
- // todo extract to "java" external system module
- if (compilerManager == null) {
- return;
- }
-
- class MyCompileTask implements CompileTask {
- private final boolean myBefore;
-
- MyCompileTask(boolean before) {
- myBefore = before;
+ ProjectTaskManagerImpl projectTaskManager = (ProjectTaskManagerImpl)ProjectTaskManager.getInstance(myProject);
+ projectTaskManager.addListener(new ProjectTaskManagerListener() {
+ @Override
+ public void beforeRun(@NotNull ProjectTaskContext context) throws ExecutionException {
+ if (!doExecuteBuildPhaseTriggers(true, context)) {
+ throw new ExecutionException("Before build triggering task failed");
+ }
}
@Override
- public boolean execute(@NotNull CompileContext context) {
- return doExecuteCompileTasks(myBefore, context);
+ public void afterRun(@NotNull ProjectTaskContext context, @NotNull ProjectTaskResult result) throws ExecutionException {
+ if (!doExecuteBuildPhaseTriggers(false, context)) {
+ throw new ExecutionException("After build triggering task failed");
+ }
}
- }
-
- compilerManager.addBeforeTask(new MyCompileTask(true));
- compilerManager.addAfterTask(new MyCompileTask(false));
+ });
fireTasksChanged();
}
@@ -97,25 +96,43 @@ public class ExternalSystemTaskActivator {
return StringUtil.join(result, ", ");
}
- private boolean doExecuteCompileTasks(boolean myBefore, @NotNull CompileContext context) {
- List modules = ReadAction.compute(
- () -> ContainerUtil.mapNotNull(context.getCompileScope().getAffectedModules(),
- module -> ExternalSystemApiUtil.getExternalProjectPath(module)));
+ private boolean doExecuteBuildPhaseTriggers(boolean myBefore, @NotNull ProjectTaskContext context) {
+ ProjectTaskScope taskScope = context.getUserData(ProjectTaskScope.KEY);
+ if (taskScope == null) {
+ return true;
+ }
- final Collection phases = new ArrayList<>();
+ Set modulesToBuild = new LinkedHashSet<>();
+ Set modulesToRebuild = new LinkedHashSet<>();
+ for (ModuleBuildTask task : taskScope.getRequestedTasks(ModuleBuildTask.class)) {
+ String projectPath = ExternalSystemApiUtil.getExternalProjectPath(task.getModule());
+ if (projectPath == null) continue;
+ if (task.isIncrementalBuild()) {
+ modulesToBuild.add(projectPath);
+ }
+ else {
+ modulesToRebuild.add(projectPath);
+ }
+ }
+
+ boolean result = true;
if (myBefore) {
- if(context.isRebuild()) {
- phases.add(Phase.BEFORE_REBUILD);
+ if (!modulesToBuild.isEmpty()) {
+ result = runTasks(modulesToBuild, Phase.BEFORE_COMPILE);
+ }
+ if (result && !modulesToRebuild.isEmpty()) {
+ result = runTasks(modulesToRebuild, Phase.BEFORE_COMPILE, Phase.BEFORE_REBUILD);
}
- phases.add(Phase.BEFORE_COMPILE);
}
else {
- phases.add(Phase.AFTER_COMPILE);
- if(context.isRebuild()) {
- phases.add(Phase.AFTER_REBUILD);
+ if (!modulesToBuild.isEmpty()) {
+ result = runTasks(modulesToBuild, Phase.AFTER_COMPILE);
+ }
+ if (result && !modulesToRebuild.isEmpty()) {
+ result = runTasks(modulesToRebuild, Phase.AFTER_COMPILE, Phase.AFTER_REBUILD);
}
}
- return runTasks(modules, phases.toArray(new Phase[0]));
+ return result;
}
public boolean runTasks(@NotNull String modulePath, @NotNull Phase... phases) {
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataServiceExtension.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataServiceExtension.java
new file mode 100644
index 000000000000..b8ce9a36f311
--- /dev/null
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataServiceExtension.java
@@ -0,0 +1,13 @@
+// Copyright 2000-2019 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.externalSystem.service.project.manage;
+
+import com.intellij.openapi.externalSystem.model.project.ModuleData;
+import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
+import com.intellij.openapi.module.Module;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+@ApiStatus.Experimental
+public interface ModuleDataServiceExtension {
+ void importModule(@NotNull IdeModifiableModelsProvider modelsProvider, @NotNull Module module, @NotNull ModuleData data);
+}
diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
index 3bb86040927f..420eee44ae2a 100644
--- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
+++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java
@@ -15,10 +15,7 @@ import com.intellij.build.events.impl.SuccessResultImpl;
import com.intellij.build.events.impl.*;
import com.intellij.execution.*;
import com.intellij.execution.configurations.ConfigurationType;
-import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.executors.DefaultRunExecutor;
-import com.intellij.execution.process.ProcessAdapter;
-import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.execution.rmi.RemoteUtil;
@@ -85,6 +82,7 @@ import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowEP;
+import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.ex.ProgressIndicatorEx;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
@@ -131,7 +129,9 @@ public class ExternalSystemUtil {
static {
RUNNER_IDS.put(DefaultRunExecutor.EXECUTOR_ID, ExternalSystemConstants.RUNNER_ID);
- RUNNER_IDS.put(DefaultDebugExecutor.EXECUTOR_ID, ExternalSystemConstants.DEBUG_RUNNER_ID);
+ // DebugExecutor ID - com.intellij.execution.executors.DefaultDebugExecutor.EXECUTOR_ID
+ String debugExecutorId = ToolWindowId.DEBUG;
+ RUNNER_IDS.put(debugExecutorId, ExternalSystemConstants.DEBUG_RUNNER_ID);
}
private ExternalSystemUtil() {
@@ -849,17 +849,13 @@ public class ExternalSystemUtil {
}
@Override
- public void processStarted(@NotNull final String executorIdLocal,
- @NotNull final ExecutionEnvironment environmentLocal,
- @NotNull final ProcessHandler handler) {
+ public void processTerminated(@NotNull String executorIdLocal,
+ @NotNull ExecutionEnvironment environmentLocal,
+ @NotNull ProcessHandler handler,
+ int exitCode) {
if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) {
- handler.addProcessListener(new ProcessAdapter() {
- @Override
- public void processTerminated(@NotNull ProcessEvent event) {
- result.set(event.getExitCode() == 0);
- targetDone.up();
- }
- });
+ result.set(exitCode == 0);
+ targetDone.up();
}
}
});
@@ -892,6 +888,14 @@ public class ExternalSystemUtil {
callback.onFailure();
}
}
+ if (!result.get()) {
+ ApplicationManager.getApplication().invokeLater(() -> {
+ ToolWindow window = ToolWindowManager.getInstance(project).getToolWindow(environment.getExecutor().getToolWindowId());
+ if (window != null) {
+ window.activate(null, false, false);
+ }
+ }, project.getDisposed());
+ }
}
};
diff --git a/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java
index 3d38d1b625f0..4074e180d342 100644
--- a/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java
+++ b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerImpl.java
@@ -1,6 +1,8 @@
// Copyright 2000-2019 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.execution.ExecutionException;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -20,6 +22,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
@@ -36,6 +39,7 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager {
private static final Logger LOG = Logger.getInstance("#com.intellij.task.ProjectTaskManager");
private final ProjectTaskRunner myDummyTaskRunner = new DummyTaskRunner();
private final ProjectTaskListener myEventPublisher;
+ private final List myListeners = new CopyOnWriteArrayList<>();
public ProjectTaskManagerImpl(@NotNull Project project) {
super(project);
@@ -146,23 +150,51 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager {
};
visitTasks(projectTask instanceof ProjectTaskList ? (ProjectTaskList)projectTask : Collections.singleton(projectTask), taskClassifier);
+ context.putUserData(ProjectTaskScope.KEY, new ProjectTaskScope() {
+ @NotNull
+ @Override
+ public List getRequestedTasks(@NotNull Class instanceOf) {
+ List tasks = new ArrayList<>();
+ //noinspection unchecked
+ toRun.forEach(pair -> pair.second.stream().filter(instanceOf::isInstance).map(task -> (T)task).forEach(tasks::add));
+ return tasks;
+ }
+ });
myEventPublisher.started(context);
- if (toRun.isEmpty()) {
- sendSuccessNotify(new ListenerNotificator(context, callback));
- return;
- }
- ProjectTaskResultsAggregator callbacksCollector =
- new ProjectTaskResultsAggregator(new ListenerNotificator(context, callback), toRun.size());
- for (Pair> pair : toRun) {
- callback = new ProjectTaskRunnerNotification(pair.second, callbacksCollector);
- if (pair.second.isEmpty()) {
- sendSuccessNotify(callback);
+ // do not run before tasks on EDT
+ ApplicationManager.getApplication().executeOnPooledThread(() -> {
+ for (ProjectTaskManagerListener listener : myListeners) {
+ try {
+ listener.beforeRun(context);
+ }
+ catch (ExecutionException e) {
+ sendAbortedNotify(new ListenerNotificator(context, callback));
+ return;
+ }
}
- else {
- pair.first.run(myProject, context, callback, pair.second);
+
+ if (toRun.isEmpty()) {
+ sendSuccessNotify(new ListenerNotificator(context, callback));
+ return;
}
- }
+
+ ProjectTaskResultsAggregator callbacksCollector =
+ new ProjectTaskResultsAggregator(new ListenerNotificator(context, callback), toRun.size());
+ for (Pair> pair : toRun) {
+ ProjectTaskRunnerNotification notification = new ProjectTaskRunnerNotification(pair.second, callbacksCollector);
+ if (pair.second.isEmpty()) {
+ sendSuccessNotify(notification);
+ }
+ else {
+ ApplicationManager.getApplication().invokeLater(() -> pair.first.run(myProject, context, notification, pair.second));
+ }
+ }
+ });
+ }
+
+ public final void addListener(@NotNull ProjectTaskManagerListener listener) {
+ myListeners.add(listener);
}
private static void sendSuccessNotify(@Nullable ProjectTaskNotification notification) {
@@ -171,6 +203,12 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager {
}
}
+ private static void sendAbortedNotify(@Nullable ProjectTaskNotification notification) {
+ if (notification != null) {
+ notification.finished(new ProjectTaskResult(true, 0, 0));
+ }
+ }
+
private static void visitTasks(@NotNull Collection extends ProjectTask> tasks,
@NotNull Consumer super Collection extends ProjectTask>> consumer) {
for (ProjectTask child : tasks) {
@@ -220,16 +258,39 @@ public class ProjectTaskManagerImpl extends ProjectTaskManager {
@Nullable private final ProjectTaskNotification myDelegate;
@NotNull private final ProjectTaskContext myContext;
- private ListenerNotificator(@NotNull ProjectTaskContext context, @Nullable ProjectTaskNotification delegate) {
+ private ListenerNotificator(@NotNull ProjectTaskContext context,
+ @Nullable ProjectTaskNotification delegate) {
myContext = context;
myDelegate = delegate;
}
@Override
public void finished(@NotNull ProjectTaskResult executionResult) {
+ if (!executionResult.isAborted() && executionResult.getErrors() == 0) {
+ // do not run after tasks on EDT
+ ApplicationManager.getApplication().executeOnPooledThread(() -> {
+ try {
+ for (ProjectTaskManagerListener listener : myListeners) {
+ listener.afterRun(myContext, executionResult);
+ }
+ notify(myContext, executionResult);
+ }
+ catch (ExecutionException e) {
+ LOG.debug(e);
+ notify(myContext, new ProjectTaskResult(
+ false, executionResult.getErrors() + 1, executionResult.getWarnings(), executionResult.getTasksState()));
+ }
+ });
+ }
+ else {
+ notify(myContext, executionResult);
+ }
+ }
+
+ private void notify(@NotNull ProjectTaskContext context, @NotNull ProjectTaskResult executionResult) {
GuiUtils.invokeLaterIfNeeded(() -> {
if (!myProject.isDisposed()) {
- myEventPublisher.finished(myContext, executionResult);
+ myEventPublisher.finished(context, executionResult);
}
if (myDelegate != null) {
myDelegate.finished(executionResult);
diff --git a/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerListener.java b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerListener.java
new file mode 100644
index 000000000000..acb1b00b37d5
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskManagerListener.java
@@ -0,0 +1,15 @@
+// Copyright 2000-2019 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.execution.ExecutionException;
+import com.intellij.task.ProjectTaskContext;
+import com.intellij.task.ProjectTaskResult;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+@ApiStatus.Experimental
+public interface ProjectTaskManagerListener {
+ void beforeRun(@NotNull ProjectTaskContext context) throws ExecutionException;
+
+ void afterRun(@NotNull ProjectTaskContext context, @NotNull ProjectTaskResult result) throws ExecutionException;
+}
diff --git a/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskScope.java b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskScope.java
new file mode 100644
index 000000000000..89fc6f4f3ba8
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/task/impl/ProjectTaskScope.java
@@ -0,0 +1,16 @@
+// Copyright 2000-2019 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.util.Key;
+import com.intellij.task.ProjectTask;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+@ApiStatus.Experimental
+public interface ProjectTaskScope {
+ Key KEY = Key.create("project task scope");
+ @NotNull
+ List getRequestedTasks(@NotNull Class instanceOf);
+}
diff --git a/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml b/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml
index d7dcbb7bd842..587ae5c81322 100644
--- a/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml
+++ b/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml
@@ -8,6 +8,10 @@
interface="com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService"/>
+
+
-
-