diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dsl/MavenDependencyModificator.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dsl/MavenDependencyModificator.kt index d460e4321432..3ef49817c100 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dsl/MavenDependencyModificator.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dsl/MavenDependencyModificator.kt @@ -13,7 +13,6 @@ import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Ref import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiDocumentManager import com.intellij.psi.util.childrenOfType @@ -379,45 +378,57 @@ class MavenDependencyModificator(private val myProject: Project) : ExternalDepen fun declaredDependencies(file: VirtualFile): List? { return ReadAction.compute?, Throwable> { val model = MavenDomUtil.getMavenDomProjectModel(myProject, file) ?: return@compute null - model.dependencies.dependencies.map { mavenDomDependency -> - DeclaredDependency( + val dependencies = model.dependencies.dependencies.map { mavenDomDependency -> + DeclaredDependencyData( groupId = mavenDomDependency.groupId.stringValue, artifactId = mavenDomDependency.artifactId.stringValue, - version = retrieveDependencyVersion(myProject, mavenDomDependency), + version = mavenDomDependency.version.stringValue, configuration = mavenDomDependency.scope.stringValue, - dataContext = DataContext { if (CommonDataKeys.PSI_ELEMENT.`is`(it)) mavenDomDependency.xmlElement else null } + dataContext = DataContext { if (CommonDataKeys.PSI_ELEMENT.`is`(it)) mavenDomDependency.xmlElement else null }, + ) + } + retrieveDependencyVersions(myProject, model, dependencies.filter{it.version == null}) + return@compute dependencies.map { data -> + DeclaredDependency( + groupId = data.groupId, + artifactId = data.artifactId, + version = data.version, + configuration = data.configuration, + dataContext = data.dataContext ) } } } - private fun retrieveDependencyVersion(project: Project, dependency: MavenDomDependency): String? { - val directVersion = dependency.version.stringValue - if (directVersion != null) return directVersion + private class DeclaredDependencyData( + val groupId: String?, + val artifactId: String?, + var version: String?, + val configuration: String?, + val dataContext: DataContext, + ) - val groupId = dependency.groupId.stringValue - val artifactId = dependency.artifactId.stringValue + private fun retrieveDependencyVersions(project: Project, domModel: MavenDomProjectModel, dependencies: List) { + MavenDomProjectProcessorUtils.processDependenciesInDependencyManagement( + domModel, + { mavenDomDependency -> + val groupId = mavenDomDependency.groupId.stringValue + val artifactId = mavenDomDependency.artifactId.stringValue + val version = mavenDomDependency.version.stringValue - val domModel = dependency.getParentOfType(MavenDomProjectModel::class.java, false) ?: return null - val ref = Ref() - if (MavenDomProjectProcessorUtils.processDependenciesInDependencyManagement(domModel, - { - if (groupId == it.groupId.stringValue - && artifactId == it.artifactId.stringValue - && !it.version.stringValue.isNullOrBlank() - ) { - ref.set(it.version.stringValue) - return@processDependenciesInDependencyManagement true - } - false - }, project)) { - return ref.get() - - } - return null + if (!version.isNullOrBlank()) { + for (dependency in dependencies) { + if (artifactId == dependency.artifactId && groupId == dependency.groupId) { + dependency.version = version + } + } + } + return@processDependenciesInDependencyManagement !dependencies.any { it.version == null } + }, project) } + override fun declaredRepositories(module: Module): List { val project = MavenProjectsManager.getInstance(module.project).findProject(module) ?: return emptyList() val model = MavenDomUtil.getMavenDomProjectModel(myProject, project.file) ?: return emptyList()