[Kotlin] Notify about unsupported features in K1 mode

KTIJ-31679


(cherry picked from commit 14791f372930eaf3f5256bf05a0ab37f6f5254b0)

IJ-CR-147299

GitOrigin-RevId: b3d6cc9104e1b1cc9010442580bb67a0c5cac6ce
This commit is contained in:
Pavel Kirpichenkov
2024-10-18 16:41:22 +03:00
committed by intellij-monorepo-bot
parent 81cdb86823
commit 694e085084
3 changed files with 85 additions and 1 deletions

View File

@@ -340,4 +340,9 @@
<psi.classFileDecompiler implementation="org.jetbrains.kotlin.analysis.decompiler.js.KotlinJavaScriptMetaFileDecompiler"/>
</extensions>
<!-- notification about unsupported K2 features in K1 mode -->
<extensions defaultExtensionNs="com.intellij">
<editorNotificationProvider implementation="org.jetbrains.kotlin.idea.configuration.KotlinK2FeaturesInK1ModeNotifier"/>
</extensions>
</idea-plugin>

View File

@@ -94,4 +94,8 @@ configurator.kotlin.jvm.target.bump.manually.learn.more=<br>If you add Kotlin to
configure.kotlin.changes.title=Configure Kotlin: Changes
configure.kotlin.original.content=Original content
configure.kotlin.modified.content=Modified content
configure.kotlin.modified.content=Modified content
k1.mode.does.not.support.features.0=K1 mode does not support the features: {0}
enable.k2.mode=Enable K2 mode\u2026
k1.does.not.support.features.ignore=Ignore

View File

@@ -0,0 +1,75 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.configuration
import com.intellij.diagnostic.VMOptions
import com.intellij.ide.util.PropertiesComponent
import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.options.ConfigurableWithId
import com.intellij.openapi.options.ShowSettingsUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiManager
import com.intellij.ui.EditorNotificationPanel
import com.intellij.ui.EditorNotificationProvider
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings
import org.jetbrains.kotlin.idea.projectConfiguration.KotlinProjectConfigurationBundle
import org.jetbrains.kotlin.psi.KtFile
import java.util.*
import java.util.function.Function
import javax.swing.JComponent
private val ExperimentalFeaturesWithK2OnlySupport = EnumSet.of<LanguageFeature>(
LanguageFeature.BreakContinueInInlineLambdas,
LanguageFeature.MultiDollarInterpolation,
LanguageFeature.WhenGuards,
)
private const val KOTLIN_K2_FEATURES_IN_K1_MODE_NOTIFICATION_DISABLED = "kotlin.k2.features.in.k1.mode.notification.disabled"
class KotlinK2FeaturesInK1ModeNotifier : EditorNotificationProvider {
override fun collectNotificationData(
project: Project,
file: VirtualFile
): Function<in FileEditor, out JComponent?>? {
if (PropertiesComponent.getInstance().getBoolean(KOTLIN_K2_FEATURES_IN_K1_MODE_NOTIFICATION_DISABLED)) return null
val unsupportedFeatures = collectUnsupportedFeatures(project, file)
if (unsupportedFeatures.isEmpty()) return null
return Function { fileEditor: FileEditor -> createNotificationPanel(project, fileEditor, unsupportedFeatures) }
}
private fun collectUnsupportedFeatures(project: Project, file: VirtualFile): List<LanguageFeature> {
if (!file.nameSequence.endsWith(KotlinFileType.DOT_DEFAULT_EXTENSION)) return emptyList()
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return emptyList()
return ExperimentalFeaturesWithK2OnlySupport.filter { feature ->
ktFile.languageVersionSettings.supportsFeature(feature)
}
}
private fun createNotificationPanel(
project: Project,
fileEditor: FileEditor,
unsupportedFeatures: List<LanguageFeature>,
): JComponent {
val featureNames = unsupportedFeatures.joinToString { "'${it.presentableName}'" }
return EditorNotificationPanel(fileEditor, EditorNotificationPanel.Status.Warning).apply {
text = KotlinProjectConfigurationBundle.message("k1.mode.does.not.support.features.0", featureNames)
if (VMOptions.canWriteOptions()) {
createActionLabel(KotlinProjectConfigurationBundle.message("enable.k2.mode")) {
ShowSettingsUtil.getInstance().showSettingsDialog(project, { configurable ->
// KotlinLanguageConfiguration#ID, hardcoded because of a circular dependency
(configurable as? ConfigurableWithId)?.id == "preferences.language.Kotlin"
}, null)
}
}
createActionLabel(KotlinProjectConfigurationBundle.message("k1.does.not.support.features.ignore")) {
PropertiesComponent.getInstance().setValue(KOTLIN_K2_FEATURES_IN_K1_MODE_NOTIFICATION_DISABLED, true)
isVisible = false
}
}
}
}