[kotlin] Remove dependency from kotlin.base to intellij.maven

Instead, use BuildSystemTypeDetector service to wire information
about Maven into kotlin.base

^KTIJ-15758

GitOrigin-RevId: c843f16865035f736488af72d3978e72485a18af
This commit is contained in:
Dmitry Savvinov
2022-08-12 12:23:16 +00:00
committed by intellij-monorepo-bot
parent 2d1d0f86e0
commit a8e31df6da
4 changed files with 20 additions and 16 deletions
@@ -31,7 +31,6 @@
<orderEntry type="module" module-name="kotlin.base.klib" />
<orderEntry type="module" module-name="kotlin.base.scripting" />
<orderEntry type="module" module-name="kotlin.base.resources" />
<orderEntry type="module" module-name="intellij.maven" />
<orderEntry type="module" module-name="intellij.platform.util.jdom" />
<orderEntry type="module" module-name="intellij.platform.util.classLoader" />
<orderEntry type="module" module-name="intellij.platform.projectModel.impl" />
@@ -30,7 +30,6 @@ import com.intellij.workspaceModel.storage.VersionedStorageChange
import com.intellij.workspaceModel.storage.WorkspaceEntity
import com.intellij.workspaceModel.storage.bridgeEntities.api.LibraryEntity
import com.intellij.workspaceModel.storage.bridgeEntities.api.ModuleEntity
import org.jetbrains.idea.maven.project.MavenProjectsManager
import org.jetbrains.kotlin.idea.base.analysis.libraries.LibraryDependencyCandidate
import org.jetbrains.kotlin.idea.base.facet.isHMPPEnabled
import org.jetbrains.kotlin.idea.base.projectStructure.*
@@ -43,6 +42,7 @@ import org.jetbrains.kotlin.idea.base.util.caching.FineGrainedEntityCache.Compan
import org.jetbrains.kotlin.idea.base.util.caching.SynchronizedFineGrainedEntityCache
import org.jetbrains.kotlin.idea.base.util.caching.WorkspaceEntityChangeListener
import org.jetbrains.kotlin.idea.caches.project.*
import org.jetbrains.kotlin.idea.configuration.isMavenized
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -73,8 +73,7 @@ class LibraryDependenciesCacheImpl(private val project: Project) : LibraryDepend
val (dependencyCandidates, sdks) = computeLibrariesAndSdksUsedWithNoFilter(libraryInfo)
// Maven is Gradle Metadata unaware, and therefore needs stricter filter. See KTIJ-15758
val importedFromMaven = project.isImportedFromMaven()
val libraryDependenciesFilter = if (importedFromMaven)
val libraryDependenciesFilter = if (project.isMavenized)
StrictEqualityForPlatformSpecificCandidatesFilter
else
DefaultLibraryDependenciesFilter union SharedNativeLibraryToNativeInteropFallbackDependenciesFilter
@@ -82,17 +81,6 @@ class LibraryDependenciesCacheImpl(private val project: Project) : LibraryDepend
return LibraryDependencies(libraries, sdks.toList())
}
// Two corner-cases to cover:
// - Maven Plugin is disabled, thus `MavenProjectsManager.getInstance` returns null
// - There are no Maven Plugin at all, thus it throws NCDFE. It shouldn't happen in production (Maven
// plugin is bundled, and there's no easy way to remove it), but might happen in some tests
// In both cases we just want to degrade gracefully and choose default (non-Maven) path
private fun Project.isImportedFromMaven() = try {
MavenProjectsManager.getInstance(this)?.isMavenizedProject ?: false
} catch (e: NoClassDefFoundError) {
false
}
//NOTE: used LibraryRuntimeClasspathScope as reference
private fun computeLibrariesAndSdksUsedWithNoFilter(libraryInfo: LibraryInfo): LibraryDependencyCandidatesAndSdkInfos {
val libraries = LinkedHashSet<LibraryDependencyCandidate>()
@@ -4,6 +4,7 @@ package org.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
enum class BuildSystemType {
JPS, Gradle, AndroidGradle, Maven
@@ -12,6 +13,9 @@ enum class BuildSystemType {
interface BuildSystemTypeDetector {
fun detectBuildSystemType(module: Module): BuildSystemType?
// null means specific EP can't answer
fun isMavenizedProject(project: Project): Boolean? = null
companion object {
val EP_NAME = ExtensionPointName.create<BuildSystemTypeDetector>("org.jetbrains.kotlin.buildSystemTypeDetector")
}
@@ -24,3 +28,11 @@ val Module.buildSystemType: BuildSystemType
.firstNotNullOfOrNull { it.detectBuildSystemType(this) }
?: BuildSystemType.JPS
}
val Project.isMavenized: Boolean
get() {
return BuildSystemTypeDetector.EP_NAME
.extensionList
.firstNotNullOfOrNull { it.isMavenizedProject(this) }
?: false
}
@@ -3,6 +3,7 @@
package org.jetbrains.kotlin.idea.maven
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import org.jetbrains.idea.maven.project.MavenProjectsManager
import org.jetbrains.kotlin.idea.configuration.BuildSystemType
import org.jetbrains.kotlin.idea.configuration.BuildSystemTypeDetector
@@ -16,4 +17,8 @@ class MavenDetector : BuildSystemTypeDetector {
null
}
}
}
override fun isMavenizedProject(project: Project): Boolean {
return !project.isDisposed && MavenProjectsManager.getInstance(project).isMavenizedProject
}
}