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/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..4c2a58f2cf --- /dev/null +++ b/utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt @@ -0,0 +1,63 @@ +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.openapi.roots.libraries.Library +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( + modules: Collection, + descriptor: ExternalLibraryDescriptor, + scope: DependencyScope + ): Promise? { + + val module = ContainerUtil.getFirstItem(modules) ?: return null + if (!isAndroidGradleProject(module.project)) { + return null + } + + // 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: 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) { + 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..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 @@ -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,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr } if (classesRoots.isNotEmpty()) { val urls = OrderEntryFix.refreshAndConvertToUrls(classesRoots) - if (modules.size == 1) { + if (canLoadModuleLibrary(modules)) { ModuleRootModificationUtil.addModuleLibrary( firstModule, if (classesRoots.size > 1) descriptor.presentableName else null, @@ -78,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 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 @@ - +