diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectStaticImporter.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectStaticImporter.kt index d94dfbd4ea65..7072a7b9593f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectStaticImporter.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectStaticImporter.kt @@ -44,14 +44,16 @@ import java.util.concurrent.ConcurrentHashMap class MavenProjectStaticImporter(val project: Project, val coroutineScope: CoroutineScope) { private val localRepo = MavenProjectsManager.getInstance(project).localRepository - suspend fun syncStatic(rootProjectFiles: List, - optionalModelsProvider: IdeModifiableModelsProvider?, - importingSettings: MavenImportingSettings, - generalSettings: MavenGeneralSettings, - reimportExistingFiles: Boolean, - visitor: MavenStructureProjectVisitor, - parentActivity: StructuredIdeActivity, - commit: Boolean): PreimportResult { + suspend fun syncStatic( + rootProjectFiles: List, + optionalModelsProvider: IdeModifiableModelsProvider?, + importingSettings: MavenImportingSettings, + generalSettings: MavenGeneralSettings, + reimportExistingFiles: Boolean, + visitor: MavenStructureProjectVisitor, + parentActivity: StructuredIdeActivity, + commit: Boolean, + ): PreimportResult { val activity = PREIMPORT_ACTIVITY.startedWithParent(project, parentActivity) val statisticsData = StatisticsData(project, rootProjectFiles.size) try { @@ -66,13 +68,13 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou val projectTree = MavenProjectsTree(project) val roots = ArrayList() val mavenProjectMappings = HashMap>() - val allProjects = ArrayList() + val allProjects = forest.flatMap { it.projects() }.toList() + visitor.map(allProjects) val projectChanges = HashMap() val existingTree = if (!commit) null else MavenProjectsManager.getInstance(project).let { if (it.isMavenizedProject) it.projectsTree else null } forest.forEach { tree -> mavenProjectMappings.putAll(tree.mavenProjectMappings()) - allProjects.addAll(tree.projects()) tree.root?.let(roots::add) if (existingTree == null || reimportExistingFiles) { @@ -83,9 +85,14 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou tree.projects().filter { existingTree.findProject(it.file) == null }.associateWith { MavenProjectChanges.ALL }) } } - visitor.map(allProjects); - if (!commit) return PreimportResult.empty(project); + statisticsData.add(forest, allProjects) + + if (!commit) return PreimportResult.empty(project) + + if (existingTree != null && allProjects.all { existingTree.findProject(it.mavenId) != null }) { + return PreimportResult.empty(project) + } projectTree.updater() @@ -106,7 +113,6 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou parentActivity) importer.importProject() - statisticsData.add(forest, allProjects) return@blockingContext importer.createdModules() } @@ -252,9 +258,11 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou }) } - private fun CoroutineScope.interpolate(project: MavenProjectData, - tree: ProjectTree, - interpolatedCache: ConcurrentHashMap>): Deferred = async { + private fun CoroutineScope.interpolate( + project: MavenProjectData, + tree: ProjectTree, + interpolatedCache: ConcurrentHashMap>, + ): Deferred = async { val myDeferred = CompletableDeferred() try { @@ -326,8 +334,10 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou } - private fun applyParentProperties(parentInterpolated: MavenProjectData, - project: MavenProjectData) { + private fun applyParentProperties( + parentInterpolated: MavenProjectData, + project: MavenProjectData, + ) { parentInterpolated.properties.forEach { project.properties.putIfAbsent(it.key, it.value) @@ -406,10 +416,12 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou } - private fun CoroutineScope.readRecursively(parentModel: Element, - aggregatorProjectFile: VirtualFile, - aggregatorProject: MavenProjectData, - tree: ProjectTree): Job = this.launch Read@{ + private fun CoroutineScope.readRecursively( + parentModel: Element, + aggregatorProjectFile: VirtualFile, + aggregatorProject: MavenProjectData, + tree: ProjectTree, + ): Job = this.launch Read@{ val modulesList = parentModel.getChildrenText("modules", "module") modulesList.forEach { this.launch { @@ -549,9 +561,11 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou .map(Path::toString) } - private fun resolveKotlinPlugin(mavenProjectData: MavenProjectData, - sources: ArrayList, - testSources: ArrayList) { + private fun resolveKotlinPlugin( + mavenProjectData: MavenProjectData, + sources: ArrayList, + testSources: ArrayList, + ) { val kotlinPlugin = findPlugin(mavenProjectData, "org.jetbrains.kotlin", "kotlin-maven-plugin") if (kotlinPlugin != null) { sources.add("src/main/kotlin") @@ -559,9 +573,11 @@ class MavenProjectStaticImporter(val project: Project, val coroutineScope: Corou } } - private fun resolveBuildHelperPlugin(mavenProjectData: MavenProjectData, - sources: ArrayList, - testSources: ArrayList) { + private fun resolveBuildHelperPlugin( + mavenProjectData: MavenProjectData, + sources: ArrayList, + testSources: ArrayList, + ) { val executions = findPlugin(mavenProjectData, "org.codehaus.mojo", "build-helper-maven-plugin")?.executions if (executions.isNullOrEmpty()) return @@ -620,7 +636,7 @@ private class StatisticsData(val project: Project, val rootProjects: Int) { val modulesBefore = (WorkspaceModel.getInstance(project).currentSnapshot as ImmutableEntityStorageInstrumentation) .entityCount(ModuleEntity::class.java) - fun add(forest: List, allProjects: ArrayList) { + fun add(forest: List, allProjects: List) { val time = System.currentTimeMillis() try { linkedProject = forest.size diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AbstractMavenStaticSyncTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AbstractMavenStaticSyncTest.kt index 879f8147d547..180d2b317551 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AbstractMavenStaticSyncTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AbstractMavenStaticSyncTest.kt @@ -49,8 +49,10 @@ abstract class AbstractMavenStaticSyncTest : MavenMultiVersionImportingTestCase( override suspend fun importProjectsAsync(files: List) { val activity = ProjectImportCollector.IMPORT_ACTIVITY.started(project) try { - MavenProjectStaticImporter.getInstance(project) + val result = MavenProjectStaticImporter.getInstance(project) .syncStatic(files, null, mavenImporterSettings, mavenGeneralSettings, true, SimpleStructureProjectVisitor(), activity, true) + projectsManager.initForTests() + projectsManager.projectsTree.updater().copyFrom(result.projectTree) } finally { activity.finished() diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenStaticSyncTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenStaticSyncTest.kt index 6a90bcf04ee8..2982b4c3defc 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenStaticSyncTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenStaticSyncTest.kt @@ -5,6 +5,7 @@ import com.intellij.openapi.application.readAction import com.intellij.openapi.module.LanguageLevelUtil import com.intellij.openapi.roots.DependencyScope import com.intellij.pom.java.LanguageLevel +import com.intellij.testFramework.UsefulTestCase import kotlinx.coroutines.runBlocking import org.junit.Test @@ -595,8 +596,8 @@ class MavenStaticSyncTest : AbstractMavenStaticSyncTest() { """.trimIndent()) - val projects = projectsManager.projects - assertEmpty(projects) + val projects = projectsManager.projects.map { it.mavenId.displayString } + UsefulTestCase.assertSameElements(projects, "group:parent:1") } @Test @@ -773,4 +774,60 @@ class MavenStaticSyncTest : AbstractMavenStaticSyncTest() { "jar://" + repositoryPath + "/somedep/somedep/4.0/somedep-4.0-sources.jar!/", "jar://" + repositoryPath + "/somedep/somedep/4.0/somedep-4.0-javadoc.jar!/") } + + @Test + fun testReimportProjectsIfModulesDeclaredInDefaultProfile() = runBlocking { + createModulePom("m1", """ + + test + project + 1 + + m1 + """) + createModulePom("m2", """ + + test + project + 1 + + m2 + """) + importProjectAsync(""" + test + project + 1 + pom + + m1 + m2 + + """.trimIndent()) + assertModules("project", "m1", "m2") + + importProjectAsync(""" + test + project + 1 + pom + + m1 + + + + myprofile + + + !someVarName + + + + m2 + + + + """.trimIndent()) + assertModules("project", "m1", "m2") + } + } \ No newline at end of file