Skip to content

Commit b784624

Browse files
committed
feat(dependencies): add dependency collection for Maven and Gradle #308
Extend `JavaBuildSystemProvider` to collect dependencies from both Maven and Gradle projects. This includes mapping dependencies to `DevPackage` objects and handling Maven and Gradle project structures separately.
1 parent 01ad6e3 commit b784624

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

exts/ext-dependencies/src/233/main/kotlin/cc/unitmesh/dependencies/DependenciesFunctionProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class DependenciesFunctionProvider : ToolchainFunctionProvider {
1919
modules.map { module ->
2020
it.declaredDependencies(module)
2121
}.flatten()
22-
}.flatten()
22+
}.flatten().map {
23+
it.pkg.toString()
24+
}
2325
}
2426
}

java/src/main/kotlin/cc/unitmesh/idea/provider/JavaBuildSystemProvider.kt

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
package cc.unitmesh.idea.provider
22

33
import cc.unitmesh.devti.provider.BuildSystemProvider
4+
import cc.unitmesh.devti.provider.DevPackage
45
import cc.unitmesh.devti.template.context.DockerfileContext
56
import cc.unitmesh.idea.detectLanguageLevel
7+
import com.intellij.openapi.externalSystem.model.ProjectKeys
8+
import com.intellij.openapi.externalSystem.model.project.LibraryDependencyData
69
import com.intellij.openapi.externalSystem.service.project.ProjectDataManager
710
import com.intellij.openapi.externalSystem.service.ui.completion.TextCompletionInfo
11+
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
12+
import com.intellij.openapi.module.ModuleUtilCore
13+
import com.intellij.openapi.progress.ProgressManager
814
import com.intellij.openapi.project.Project
915
import com.intellij.openapi.project.guessProjectDir
16+
import com.intellij.psi.PsiFile
17+
import org.jetbrains.idea.maven.project.MavenProjectsManager
18+
import org.jetbrains.plugins.gradle.execution.build.CachedModuleDataFinder
1019
import org.jetbrains.plugins.gradle.service.project.GradleTasksIndices
1120
import org.jetbrains.plugins.gradle.util.GradleConstants
1221

@@ -18,6 +27,8 @@ open class JavaBuildSystemProvider : BuildSystemProvider() {
1827
var taskString = ""
1928

2029
val gradleInfo = projectDataManager.getExternalProjectsData(project, GradleConstants.SYSTEM_ID)
30+
val mavenProjects = MavenProjectsManager.getInstance(project).projects
31+
2132
if (gradleInfo.isNotEmpty()) {
2233
buildToolName = "Gradle"
2334
val indices = GradleTasksIndices.getInstance(project)
@@ -29,8 +40,10 @@ open class JavaBuildSystemProvider : BuildSystemProvider() {
2940
.sortedWith(Comparator.comparing({ it.text }, GRADLE_COMPLETION_COMPARATOR))
3041

3142
taskString = tasks.joinToString(" ") { it.text }
32-
} else {
43+
} else if (mavenProjects.isNotEmpty()) {
3344
buildToolName = "Maven"
45+
} else {
46+
return null
3447
}
3548

3649
val javaVersion = detectLanguageLevel(project, null)
@@ -47,8 +60,46 @@ open class JavaBuildSystemProvider : BuildSystemProvider() {
4760
)
4861
}
4962

50-
companion object {
63+
override fun collectDependencies(
64+
project: Project,
65+
psiFile: PsiFile
66+
): List<DevPackage> {
67+
val mavenProject = MavenProjectsManager.getInstance(project).findProject(psiFile.virtualFile)
68+
var results = mutableListOf<DevPackage>()
69+
if (mavenProject != null) {
70+
results += mavenProject.dependencies
71+
.mapNotNull { mavenArtifact ->
72+
ProgressManager.checkCanceled()
73+
val name: String = mavenArtifact.artifactId ?: return@mapNotNull null
74+
val version: String = mavenArtifact.version ?: return@mapNotNull null
75+
76+
DevPackage("maven", name = name, version = version)
77+
}
78+
}
79+
80+
/// collect Gradle dependencies
81+
ModuleUtilCore.findModuleForFile(psiFile)?.also {
82+
val moduleData = CachedModuleDataFinder.findMainModuleData(it)
83+
val libDepData = ExternalSystemApiUtil.findAllRecursively<LibraryDependencyData?>(
84+
moduleData,
85+
ProjectKeys.LIBRARY_DEPENDENCY
86+
)
5187

88+
results += libDepData.mapNotNull { node ->
89+
val target = node.data.target
90+
val namespace = target.groupId ?: return@mapNotNull null
91+
val name = target.artifactId ?: return@mapNotNull null
92+
val version = target.version ?: return@mapNotNull null
93+
94+
DevPackage("maven", namespace, name, version)
95+
}
96+
}
97+
98+
99+
return results
100+
}
101+
102+
companion object {
52103
val GRADLE_COMPLETION_COMPARATOR = Comparator<String> { o1, o2 ->
53104
when {
54105
o1.startsWith("--") && o2.startsWith("--") -> o1.compareTo(o2)

0 commit comments

Comments
 (0)