Guarantee max compiler version will be shown in popup (KT-25546)
This commit is contained in:
+53
-36
@@ -19,7 +19,7 @@ import com.intellij.openapi.module.Module
|
|||||||
import com.intellij.openapi.module.ModuleManager
|
import com.intellij.openapi.module.ModuleManager
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import org.jetbrains.annotations.TestOnly
|
import com.intellij.util.text.VersionComparatorUtil
|
||||||
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
||||||
import org.jetbrains.kotlin.config.LanguageVersion
|
import org.jetbrains.kotlin.config.LanguageVersion
|
||||||
import org.jetbrains.kotlin.idea.KotlinPluginUtil
|
import org.jetbrains.kotlin.idea.KotlinPluginUtil
|
||||||
@@ -74,49 +74,31 @@ fun notifyOutdatedBundledCompilerIfNecessary(project: Project) {
|
|||||||
fun createOutdatedBundledCompilerMessage(project: Project, bundledCompilerVersion: String = KotlinCompilerVersion.VERSION): String? {
|
fun createOutdatedBundledCompilerMessage(project: Project, bundledCompilerVersion: String = KotlinCompilerVersion.VERSION): String? {
|
||||||
val bundledCompilerMajorVersion = MajorVersion.create(bundledCompilerVersion) ?: return null
|
val bundledCompilerMajorVersion = MajorVersion.create(bundledCompilerVersion) ?: return null
|
||||||
|
|
||||||
val usedCompilerInfo = ArrayList<ModuleCompilerInfo>()
|
var maxCompilerInfo: ModuleCompilerInfo? = null
|
||||||
|
val newerModuleCompilerInfos = ArrayList<ModuleCompilerInfo>()
|
||||||
for (module in ModuleManager.getInstance(project).modules) {
|
for (module in ModuleManager.getInstance(project).modules) {
|
||||||
val externalCompilerVersion = module.externalCompilerVersion ?: continue
|
val externalCompilerVersion = module.externalCompilerVersion ?: continue
|
||||||
val externalCompilerMajorVersion = MajorVersion.create(externalCompilerVersion) ?: continue
|
val externalCompilerMajorVersion = MajorVersion.create(externalCompilerVersion) ?: continue
|
||||||
|
val languageMajorVersion = MajorVersion.create(module.languageVersionSettings.languageVersion)
|
||||||
usedCompilerInfo.add(
|
|
||||||
ModuleCompilerInfo(
|
|
||||||
module,
|
|
||||||
externalCompilerVersion,
|
|
||||||
externalCompilerMajorVersion = externalCompilerMajorVersion,
|
|
||||||
languageMajorVersion = MajorVersion.create(module.languageVersionSettings.languageVersion)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val selectedBaseModules = HashSet<Module>()
|
|
||||||
val selectedNewerModulesInfos = ArrayList<ModuleCompilerInfo>()
|
|
||||||
val moduleSourceRootMap = ModuleSourceRootMap(project)
|
|
||||||
for (moduleCompilerInfo in usedCompilerInfo) {
|
|
||||||
val languageMajorVersion = moduleCompilerInfo.languageMajorVersion
|
|
||||||
val externalCompilerMajorVersion = moduleCompilerInfo.externalCompilerMajorVersion
|
|
||||||
|
|
||||||
if (externalCompilerMajorVersion > bundledCompilerMajorVersion && languageMajorVersion > bundledCompilerMajorVersion) {
|
if (externalCompilerMajorVersion > bundledCompilerMajorVersion && languageMajorVersion > bundledCompilerMajorVersion) {
|
||||||
val wholeModuleGroup = moduleSourceRootMap.getWholeModuleGroup(moduleCompilerInfo.module)
|
val moduleCompilerInfo = ModuleCompilerInfo(module, externalCompilerVersion, externalCompilerMajorVersion, languageMajorVersion)
|
||||||
if (!selectedBaseModules.contains(wholeModuleGroup.baseModule)) {
|
|
||||||
// Remap to base module
|
|
||||||
selectedNewerModulesInfos.add(
|
|
||||||
ModuleCompilerInfo(
|
|
||||||
wholeModuleGroup.baseModule,
|
|
||||||
moduleCompilerInfo.externalCompilerVersion,
|
|
||||||
externalCompilerMajorVersion = externalCompilerMajorVersion,
|
|
||||||
languageMajorVersion = languageMajorVersion
|
|
||||||
)
|
|
||||||
)
|
|
||||||
selectedBaseModules.add(wholeModuleGroup.baseModule)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selectedNewerModulesInfos.size > NUMBER_OF_MODULES_TO_SHOW) {
|
newerModuleCompilerInfos.add(moduleCompilerInfo)
|
||||||
break
|
|
||||||
|
if (maxCompilerInfo == null ||
|
||||||
|
VersionComparatorUtil.COMPARATOR.compare(externalCompilerVersion, maxCompilerInfo.externalCompilerVersion) > 0
|
||||||
|
) {
|
||||||
|
maxCompilerInfo = moduleCompilerInfo
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (maxCompilerInfo == null) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
val selectedNewerModulesInfos = selectedModulesForPopup(project, maxCompilerInfo, newerModuleCompilerInfos)
|
||||||
if (selectedNewerModulesInfos.isEmpty()) {
|
if (selectedNewerModulesInfos.isEmpty()) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@@ -141,11 +123,46 @@ fun createOutdatedBundledCompilerMessage(project: Project, bundledCompilerVersio
|
|||||||
.trimIndent().lines().joinToString(separator = "").replace("<br/>", "\n")
|
.trimIndent().lines().joinToString(separator = "").replace("<br/>", "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun selectedModulesForPopup(
|
||||||
|
project: Project,
|
||||||
|
maxCompilerInfo: ModuleCompilerInfo,
|
||||||
|
newerModuleCompilerInfos: ArrayList<ModuleCompilerInfo>
|
||||||
|
): ArrayList<ModuleCompilerInfo> {
|
||||||
|
val selectedBaseModules = HashSet<Module>()
|
||||||
|
val selectedNewerModulesInfos = ArrayList<ModuleCompilerInfo>()
|
||||||
|
val moduleSourceRootMap = ModuleSourceRootMap(project)
|
||||||
|
for (moduleCompilerInfo in listOf(maxCompilerInfo) + newerModuleCompilerInfos) {
|
||||||
|
val languageMajorVersion = moduleCompilerInfo.languageMajorVersion
|
||||||
|
val externalCompilerMajorVersion = moduleCompilerInfo.externalCompilerMajorVersion
|
||||||
|
|
||||||
|
val wholeModuleGroup = moduleSourceRootMap.getWholeModuleGroup(moduleCompilerInfo.module)
|
||||||
|
if (!selectedBaseModules.contains(wholeModuleGroup.baseModule)) {
|
||||||
|
// Remap to base module
|
||||||
|
selectedNewerModulesInfos.add(
|
||||||
|
ModuleCompilerInfo(
|
||||||
|
wholeModuleGroup.baseModule,
|
||||||
|
moduleCompilerInfo.externalCompilerVersion,
|
||||||
|
externalCompilerMajorVersion = externalCompilerMajorVersion,
|
||||||
|
languageMajorVersion = languageMajorVersion
|
||||||
|
)
|
||||||
|
)
|
||||||
|
selectedBaseModules.add(wholeModuleGroup.baseModule)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedNewerModulesInfos.size > NUMBER_OF_MODULES_TO_SHOW) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return selectedNewerModulesInfos
|
||||||
|
}
|
||||||
|
|
||||||
private class ModuleCompilerInfo(
|
private class ModuleCompilerInfo(
|
||||||
val module: Module,
|
val module: Module,
|
||||||
val externalCompilerVersion: String,
|
val externalCompilerVersion: String,
|
||||||
val externalCompilerMajorVersion: MajorVersion,
|
val externalCompilerMajorVersion: MajorVersion,
|
||||||
val languageMajorVersion: MajorVersion)
|
val languageMajorVersion: MajorVersion
|
||||||
|
)
|
||||||
|
|
||||||
private data class MajorVersion(val major: Int, val minor: Int) : Comparable<MajorVersion> {
|
private data class MajorVersion(val major: Int, val minor: Int) : Comparable<MajorVersion> {
|
||||||
override fun compareTo(other: MajorVersion): Int {
|
override fun compareTo(other: MajorVersion): Int {
|
||||||
|
|||||||
Reference in New Issue
Block a user