From a1a740c276fcaaf231ba1cb315f19b5c156bdfa1 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Fri, 18 Nov 2022 16:57:57 +0300 Subject: [PATCH 1/6] Correct installation dependencies into Gradle project --- ...UtAndroidGradleJavaProjectModelModifier.kt | 14 +++---- ...idGradleJavaProjectModelModifierWrapper.kt | 38 +++++++++++++++++++ .../plugin/util/UtProjectModelModifier.kt | 7 +++- .../src/main/resources/META-INF/plugin.xml | 2 +- 4 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt diff --git a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifier.kt b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifier.kt index 6ff259f3cb..4b5665d7e2 100644 --- a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifier.kt +++ b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifier.kt @@ -11,19 +11,23 @@ import com.android.tools.idea.gradle.util.GradleUtil import com.android.tools.idea.project.AndroidProjectInfo import com.android.tools.idea.projectsystem.TestArtifactSearchScopes import com.google.wireless.android.sdk.stats.GradleSyncStats +import com.intellij.ide.plugins.PluginManager import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.command.undo.BasicUndoableAction import com.intellij.openapi.command.undo.UndoManager -import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager +import com.intellij.openapi.extensions.PluginId import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ExternalLibraryDescriptor +import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.VirtualFile +import com.intellij.pom.java.LanguageLevel import com.intellij.util.containers.ContainerUtil import org.jetbrains.concurrency.AsyncPromise import org.jetbrains.concurrency.Promise +import org.jetbrains.concurrency.rejectedPromise class UtAndroidGradleJavaProjectModelModifier : AndroidGradleJavaProjectModelModifier() { override fun addExternalLibraryDependency( @@ -32,14 +36,8 @@ class UtAndroidGradleJavaProjectModelModifier : AndroidGradleJavaProjectModelMod scope: DependencyScope ): Promise? { val module = ContainerUtil.getFirstItem(modules) ?: return null - - if (!isAndroidGradleProject(module.project)) { - return null - } - val dependencySpec = ArtifactDependencySpec.create(descriptor.libraryArtifactId, descriptor.libraryGroupId, descriptor.preferredVersion) return addExternalLibraryDependency(module, dependencySpec, scope) - } private fun addExternalLibraryDependency( @@ -100,8 +98,6 @@ class UtAndroidGradleJavaProjectModelModifier : AndroidGradleJavaProjectModelMod }) } - private fun isAndroidGradleProject(project: Project): Boolean = AndroidProjectInfo.getInstance(project).requiresAndroidModel() - private fun doAndroidGradleSync(project: Project, trigger: GradleSyncStats.Trigger): AsyncPromise { val promise = AsyncPromise() val request = GradleSyncInvoker.Request(trigger) diff --git a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt new file mode 100644 index 0000000000..fe80e61c37 --- /dev/null +++ b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt @@ -0,0 +1,38 @@ +package org.androidstudio.plugin.util + +import com.android.tools.idea.project.AndroidProjectInfo +import com.intellij.ide.plugins.PluginManager +import com.intellij.openapi.extensions.PluginId +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.DependencyScope +import com.intellij.openapi.roots.ExternalLibraryDescriptor +import com.intellij.openapi.roots.impl.IdeaProjectModelModifier +import com.intellij.util.containers.ContainerUtil +import org.jetbrains.concurrency.Promise + +class UtAndroidGradleJavaProjectModelModifierWrapper(val project: Project): IdeaProjectModelModifier(project) { + + override fun addExternalLibraryDependency( + modules: Collection, + descriptor: ExternalLibraryDescriptor, + scope: DependencyScope + ): Promise? { + + val module = ContainerUtil.getFirstItem(modules) ?: return null + if (!isAndroidGradleProject(module.project)) { + return null + } + + return UtAndroidGradleJavaProjectModelModifier().addExternalLibraryDependency(modules, descriptor, scope) + } + + private fun isAndroidGradleProject(project: Project): Boolean { + val pluginId = PluginId.findId("org.jetbrains.android") + if (pluginId == null || PluginManager.getInstance().findEnabledPlugin(pluginId) == null) { + return false + } + + return AndroidProjectInfo.getInstance(project).requiresAndroidModel() + } +} \ No newline at end of file diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt index 9adf33d7e4..a5f84a1fa1 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt @@ -20,6 +20,7 @@ import org.jetbrains.concurrency.resolvedPromise import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties import org.jetbrains.jps.model.library.JpsMavenRepositoryLibraryDescriptor import org.utbot.intellij.plugin.models.mavenCoordinates +import org.utbot.intellij.plugin.ui.utils.isBuildWithGradle class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(project) { override fun addExternalLibraryDependency( @@ -52,7 +53,8 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr } if (classesRoots.isNotEmpty()) { val urls = OrderEntryFix.refreshAndConvertToUrls(classesRoots) - if (modules.size == 1) { + + if (moduleLibraryMayBeInstalled(modules)) { ModuleRootModificationUtil.addModuleLibrary( firstModule, if (classesRoots.size > 1) descriptor.presentableName else null, @@ -78,4 +80,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr } return resolvedPromise() } + + private fun moduleLibraryMayBeInstalled(modules: Collection) : Boolean = + modules.size == 1 && modules.any { it.project.isBuildWithGradle } } \ No newline at end of file diff --git a/utbot-intellij/src/main/resources/META-INF/plugin.xml b/utbot-intellij/src/main/resources/META-INF/plugin.xml index e17418e2e9..c33a460710 100644 --- a/utbot-intellij/src/main/resources/META-INF/plugin.xml +++ b/utbot-intellij/src/main/resources/META-INF/plugin.xml @@ -32,7 +32,7 @@ - + From ae16037030b46a6111b7f91fd80383e4c5a7b8af Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 21 Nov 2022 11:38:05 +0300 Subject: [PATCH 2/6] Add overriden methods --- ...oidGradleJavaProjectModelModifierWrapper.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt index fe80e61c37..c123d355d8 100644 --- a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt +++ b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt @@ -8,6 +8,8 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ExternalLibraryDescriptor import com.intellij.openapi.roots.impl.IdeaProjectModelModifier +import com.intellij.openapi.roots.libraries.Library +import com.intellij.pom.java.LanguageLevel import com.intellij.util.containers.ContainerUtil import org.jetbrains.concurrency.Promise @@ -27,6 +29,22 @@ class UtAndroidGradleJavaProjectModelModifierWrapper(val project: Project): Idea return UtAndroidGradleJavaProjectModelModifier().addExternalLibraryDependency(modules, descriptor, scope) } + override fun addModuleDependency( + from: Module, + to: Module, + scope: DependencyScope, + exported: Boolean + ): Promise? = null + + override fun addLibraryDependency( + from: Module, + library: Library, + scope: DependencyScope, + exported: Boolean + ): Promise? = null + + override fun changeLanguageLevel(module: Module, level: LanguageLevel): Promise? = null + private fun isAndroidGradleProject(project: Project): Boolean { val pluginId = PluginId.findId("org.jetbrains.android") if (pluginId == null || PluginManager.getInstance().findEnabledPlugin(pluginId) == null) { From f6fbab35db95350fed4c570daa6c90ba9ac07a05 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 21 Nov 2022 12:54:17 +0300 Subject: [PATCH 3/6] Correct installation dependencies into Android Studio --- gradle.properties | 5 ++--- .../UtAndroidGradleJavaProjectModelModifierWrapper.kt | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 202ade54a2..1392b4d345 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,9 +8,8 @@ ideVersion=222.4167.29 pythonIde=IC,IU,PC,PY jsIde=IU,PY,WS -# In order to run Android Studion instead of Intellij Community, -# specify the path to your Android Studio installation -//androidStudioPath=your_path_to_android_studio +# In order to run Android Studion instead of Intellij Community, specify the path to your Android Studio installation +#androidStudioPath=your_path_to_android_studio #Version numbers: https://plugins.jetbrains.com/plugin/631-python/versions pythonCommunityPluginVersion=222.4167.37 diff --git a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt index c123d355d8..4c2a58f2cf 100644 --- a/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt +++ b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt @@ -13,6 +13,11 @@ import com.intellij.pom.java.LanguageLevel import com.intellij.util.containers.ContainerUtil import org.jetbrains.concurrency.Promise +/* +NOTE: this is a wrapper for [UtAndroidGradleJavaProjectModelModifier]. +The purpose of this wrapper is to avoid inheritance of [AndroidGradleJavaProjectModelModifier] +because it leads to crashes when Android plugin is disabled. + */ class UtAndroidGradleJavaProjectModelModifierWrapper(val project: Project): IdeaProjectModelModifier(project) { override fun addExternalLibraryDependency( @@ -26,7 +31,9 @@ class UtAndroidGradleJavaProjectModelModifierWrapper(val project: Project): Idea return null } - return UtAndroidGradleJavaProjectModelModifier().addExternalLibraryDependency(modules, descriptor, scope) + // NOTE: we use such DependencyScope to obtain `implementation`, not `testImplementation` + // to deal with androidTest modules (there is no way to add `androidTestImplementation` additionally. + return UtAndroidGradleJavaProjectModelModifier().addExternalLibraryDependency(modules, descriptor, DependencyScope.COMPILE) } override fun addModuleDependency( From 92b5a6d5da98bf631cf570936c63cb706fea4451 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 21 Nov 2022 16:43:38 +0300 Subject: [PATCH 4/6] Rollback strange change --- .../utbot/intellij/plugin/util/UtProjectModelModifier.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt index a5f84a1fa1..aa7428eb3b 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt @@ -30,6 +30,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr ): Promise? { val defaultRoots = descriptor.libraryClassesRoots val firstModule = ContainerUtil.getFirstItem(modules) ?: return null + val classesRoots = if (defaultRoots.isNotEmpty()) { LocateLibraryDialog( firstModule, @@ -54,7 +55,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr if (classesRoots.isNotEmpty()) { val urls = OrderEntryFix.refreshAndConvertToUrls(classesRoots) - if (moduleLibraryMayBeInstalled(modules)) { + if (modules.size == 1) { ModuleRootModificationUtil.addModuleLibrary( firstModule, if (classesRoots.size > 1) descriptor.presentableName else null, @@ -80,7 +81,4 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr } return resolvedPromise() } - - private fun moduleLibraryMayBeInstalled(modules: Collection) : Boolean = - modules.size == 1 && modules.any { it.project.isBuildWithGradle } } \ No newline at end of file From 4b1ce61d34e98a1ff3f81428931d771b32a2c295 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 21 Nov 2022 17:44:15 +0300 Subject: [PATCH 5/6] Gradle fix again --- .../org/utbot/intellij/plugin/util/UtProjectModelModifier.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt index aa7428eb3b..250e46ff99 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt @@ -55,7 +55,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr if (classesRoots.isNotEmpty()) { val urls = OrderEntryFix.refreshAndConvertToUrls(classesRoots) - if (modules.size == 1) { + if (modules.size == 1 && !firstModule.project.isBuildWithGradle) { ModuleRootModificationUtil.addModuleLibrary( firstModule, if (classesRoots.size > 1) descriptor.presentableName else null, From d3f4cbfb9e5e7bb2b55d9c3b967be0b303e23328 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Mon, 21 Nov 2022 18:18:12 +0300 Subject: [PATCH 6/6] Gradle fix again --- .../utbot/intellij/plugin/util/UtProjectModelModifier.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt index 250e46ff99..944cfb9651 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt @@ -30,7 +30,6 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr ): Promise? { val defaultRoots = descriptor.libraryClassesRoots val firstModule = ContainerUtil.getFirstItem(modules) ?: return null - val classesRoots = if (defaultRoots.isNotEmpty()) { LocateLibraryDialog( firstModule, @@ -54,8 +53,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr } if (classesRoots.isNotEmpty()) { val urls = OrderEntryFix.refreshAndConvertToUrls(classesRoots) - - if (modules.size == 1 && !firstModule.project.isBuildWithGradle) { + if (canLoadModuleLibrary(modules)) { ModuleRootModificationUtil.addModuleLibrary( firstModule, if (classesRoots.size > 1) descriptor.presentableName else null, @@ -81,4 +79,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr } return resolvedPromise() } + + private fun canLoadModuleLibrary(modules: Collection) = + modules.size == 1 && !ContainerUtil.getFirstItem(modules).project.isBuildWithGradle } \ No newline at end of file