Grade: workaround for java IDE dependent gradle extensions

(cherry picked from commit c6b1b3b)
This commit is contained in:
Vladislav.Soroka
2018-04-18 19:19:08 +03:00
parent 0ed8569f3e
commit 9e3d7bb19d
6 changed files with 68 additions and 6 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.externalSystem.settings;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.util.Comparing;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -45,7 +46,7 @@ public abstract class ExternalProjectSettings implements Comparable<ExternalProj
private boolean myUseAutoImport;
private boolean myCreateEmptyContentRootDirectories;
private boolean myUseQualifiedModuleNames;
private boolean myUseQualifiedModuleNames = !ExternalSystemApiUtil.isJavaCompatibleIde();
public String getExternalProjectPath() {
return myExternalProjectPath;
@@ -56,6 +56,7 @@ import com.intellij.util.containers.*;
import com.intellij.util.containers.Stack;
import com.intellij.util.lang.UrlClassLoader;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -71,6 +72,8 @@ import java.util.Queue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.intellij.util.PlatformUtils.*;
/**
* @author Denis Zhdanov
* @since 4/1/13 1:31 PM
@@ -867,4 +870,15 @@ public class ExternalSystemApiUtil {
//noinspection unchecked
getSettings(project, systemId).subscribe(listener);
}
/**
* DO NOT USE THIS METHOD.
* The method should be removed when the 'java' subsystem features will be extracted from External System API [IDEA-187832]
*
* @return check if the current IDE is compatible with the 'java' IntelliJ subsystem
*/
@ApiStatus.Experimental
public static boolean isJavaCompatibleIde() {
return isIdeaUltimate() || isIdeaCommunity() || "AndroidStudio".equals(getPlatformPrefix());
}
}
@@ -450,7 +450,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase i
@Nullable
private String getJvmAgentSetup() throws ExecutionException {
// todo [Vlad, IDEA-187832]: extract to `external-system-java` module
if(!PlatformUtils.isIntelliJ()) return null;
if(!ExternalSystemApiUtil.isJavaCompatibleIde()) return null;
final JavaParameters extensionsJP = new JavaParameters();
final RunConfigurationExtension[] extensions = Extensions.getExtensions(RunConfigurationExtension.EP_NAME);
@@ -22,6 +22,10 @@ import com.intellij.execution.configurations.SearchScopeProvider;
import com.intellij.execution.configurations.SimpleJavaParameters;
import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.ExtensionPointListener;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.extensions.impl.ExtensionPointImpl;
import com.intellij.openapi.externalSystem.ExternalSystemAutoImportAware;
import com.intellij.openapi.externalSystem.ExternalSystemConfigurableAware;
import com.intellij.openapi.externalSystem.ExternalSystemManager;
@@ -60,6 +64,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.Function;
import com.intellij.util.PathUtil;
import com.intellij.util.PathsList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.messages.MessageBusConnection;
import icons.GradleIcons;
@@ -82,6 +87,7 @@ import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.function.Predicate;
import static com.intellij.openapi.util.io.FileUtil.pathsEqual;
@@ -111,7 +117,37 @@ public class GradleManager
@Override
protected List<GradleProjectResolverExtension> compute() {
List<GradleProjectResolverExtension> result = ContainerUtilRt.newArrayList();
Collections.addAll(result, GradleProjectResolverExtension.EP_NAME.getExtensions());
// It's possible usecase when 'java' subsystem dependent plugins bundled with the non-java IDE using fat plugin distribution.
// This approach can lead to unwanted/incompatible extensions to be loaded.
// The workaround extensionsFilter should be removed when the IntelliJ java subsystem will become a regular plugin
// or those plugins will be fixed using the optional plugin dependency on 'org.jetbrains.plugins.gradle.java'
boolean isJavaIde = ExternalSystemApiUtil.isJavaCompatibleIde();
if(!isJavaIde) {
ExtensionPoint<GradleProjectResolverExtension> point =
Extensions.getRootArea().getExtensionPoint(GradleProjectResolverExtension.EP_NAME);
if(point instanceof ExtensionPointImpl) {
((ExtensionPointImpl<GradleProjectResolverExtension>)point).removeUnloadableExtensions();
}
}
Set<String> javaIdeDependentExtensions = ContainerUtil.set(
"org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectResolverExtension",
"org.jetbrains.kotlin.kapt.idea.KaptProjectResolverExtension",
"org.jetbrains.kotlin.allopen.ide.AllOpenProjectResolverExtension",
"org.jetbrains.kotlin.noarg.ide.NoArgProjectResolverExtension",
"org.jetbrains.kotlin.samWithReceiver.ide.SamWithReceiverProjectResolverExtension"
);
Predicate<GradleProjectResolverExtension> extensionsFilter = ext ->
isJavaIde || !javaIdeDependentExtensions.contains(ext.getClass().getName());
ExtensionPoint<GradleProjectResolverExtension> extensionPoint =
Extensions.getRootArea().getExtensionPoint(GradleProjectResolverExtension.EP_NAME);
extensionPoint.addExtensionPointListener(new ExtensionPointListener.Adapter<>());
Arrays.stream(GradleProjectResolverExtension.EP_NAME.getExtensions())
.filter(extensionsFilter)
.forEach(result::add);
ExternalSystemApiUtil.orderAwareSort(result);
return result;
}
@@ -218,7 +218,12 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad
if(!resolverCtx.isPreviewMode()){
// register classes of extra gradle project models required for extensions (e.g. com.android.builder.model.AndroidProject)
projectImportAction.addExtraProjectModelClasses(resolverExtension.getExtraProjectModelClasses());
try {
projectImportAction.addExtraProjectModelClasses(resolverExtension.getExtraProjectModelClasses());
}
catch (Throwable t) {
LOG.warn(t);
}
}
if (importCustomizer == null || importCustomizer.useExtraJvmArgs()) {
@@ -232,7 +237,12 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad
// collect extra command-line arguments
executionSettings.withArguments(resolverExtension.getExtraCommandLineArgs());
// collect tooling extensions classes
toolingExtensionClasses.addAll(resolverExtension.getToolingExtensionsClasses());
try {
toolingExtensionClasses.addAll(resolverExtension.getToolingExtensionsClasses());
}
catch (Throwable t) {
LOG.warn(t);
}
}
BuildActionExecuter<ProjectImportAction.AllModels> buildActionExecutor = resolverCtx.getConnection().action(projectImportAction);
@@ -3,6 +3,7 @@ package org.jetbrains.plugins.gradle.settings;
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil;
import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.util.SmartList;
import com.intellij.util.ThreeState;
import com.intellij.util.containers.ContainerUtil;
@@ -25,7 +26,7 @@ public class GradleProjectSettings extends ExternalProjectSettings {
@Nullable private String myGradleJvm = ExternalSystemJdkUtil.USE_PROJECT_JDK;
@Nullable private DistributionType distributionType;
private boolean disableWrapperSourceDistributionNotification;
private boolean resolveModulePerSourceSet = true;
private boolean resolveModulePerSourceSet = ExternalSystemApiUtil.isJavaCompatibleIde();
@Nullable private CompositeBuild myCompositeBuild;
private ThreeState storeProjectFilesExternally = ThreeState.NO;