Skip to content

Correct installation dependencies into Gradle project #1402

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Nov 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -32,14 +36,8 @@ class UtAndroidGradleJavaProjectModelModifier : AndroidGradleJavaProjectModelMod
scope: DependencyScope
): Promise<Void?>? {
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(
Expand Down Expand Up @@ -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<Void?> {
val promise = AsyncPromise<Void?>()
val request = GradleSyncInvoker.Request(trigger)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Module?>,
descriptor: ExternalLibraryDescriptor,
scope: DependencyScope
): Promise<Void?>? {

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<Void>? = null

override fun addLibraryDependency(
from: Module,
library: Library,
scope: DependencyScope,
exported: Boolean
): Promise<Void>? = null

override fun changeLanguageLevel(module: Module, level: LanguageLevel): Promise<Void>? = 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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand All @@ -78,4 +79,7 @@ class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(pr
}
return resolvedPromise()
}

private fun canLoadModuleLibrary(modules: Collection<Module>) =
modules.size == 1 && !ContainerUtil.getFirstItem(modules).project.isBuildWithGradle
}
2 changes: 1 addition & 1 deletion utbot-intellij/src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<registryKey defaultValue="false" description="Enable editing Kotlin test files" key="kotlin.ultra.light.classes.empty.text.range"/>
<postStartupActivity implementation="org.utbot.intellij.plugin.ui.GotItTooltipActivity"/>
<projectModelModifier implementation="org.utbot.intellij.plugin.util.UtProjectModelModifier"/>
<projectModelModifier implementation="org.androidstudio.plugin.util.UtAndroidGradleJavaProjectModelModifier" order="first"/>
<projectModelModifier implementation="org.androidstudio.plugin.util.UtAndroidGradleJavaProjectModelModifierWrapper" order="first"/>
<!--Documentation-->
<customJavadocTagProvider implementation="org.utbot.intellij.plugin.javadoc.UtCustomJavaDocTagProvider"/>
<lang.documentationProvider language="JAVA" order="first" implementationClass="org.utbot.intellij.plugin.javadoc.UtDocumentationProvider"/>
Expand Down