[kotlin] K2ElementActionsFactory: provide MakeFieldPublicFix in createChangeModifierActions

Unmute `K2JUnitMalformedDeclarationInspectionTestV57`.

#KTIJ-32558
#KTIJ-30442

GitOrigin-RevId: 8dae92e575b033f2cd219e136d3180d2a3b7fd6d
This commit is contained in:
Andrey Cherkasov
2025-06-30 15:27:32 +04:00
committed by intellij-monorepo-bot
parent 46ff7ba496
commit 317e2b9aac
5 changed files with 59 additions and 5 deletions

View File

@@ -5,8 +5,6 @@ import com.intellij.idea.IgnoreJUnit3
import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginMode
import org.junit.Ignore
@IgnoreJUnit3
@Ignore
class K2JUnitMalformedDeclarationInspectionTestV57 : KotlinJUnitMalformedDeclarationInspectionTestV57() {
override val pluginMode: KotlinPluginMode = KotlinPluginMode.K2
}

View File

@@ -165,7 +165,8 @@ fix.add.modifier.text=Make {0} ''{1}''
fix.add.modifier.text.generic=Add ''{0}'' modifier
fix.potentially.broken.inheritance.message=This Change Could Potentially Break the Inheritors
fix.make.field.public=Make field ''{0}'' public
fix.make.field.public.text=Make field ''{0}'' public
fix.make.field.public.family=Make field public
fix.add.argument.name.family=Add name to argument
fix.add.argument.name.text.generic=Add name to argument\u2026

View File

@@ -194,7 +194,16 @@ class K2ElementActionsFactory : JvmElementActionsFactory() {
override fun createChangeModifierActions(target: JvmModifiersOwner, request: ChangeModifierRequest): List<IntentionAction> {
val kModifierOwner = target.sourceElement?.unwrapped as? KtModifierListOwner ?: return emptyList()
if (request.modifier == JvmModifier.FINAL && !request.shouldBePresent()) {
val modifier = request.modifier
val shouldPresent = request.shouldBePresent()
if (modifier == JvmModifier.PUBLIC && shouldPresent && kModifierOwner is KtProperty) {
return listOf(
MakeFieldPublicFix(kModifierOwner).asIntention()
)
}
if (modifier == JvmModifier.FINAL && !shouldPresent) {
return listOf(
AddModifierFix(kModifierOwner, KtTokens.OPEN_KEYWORD).asIntention()
)

View File

@@ -0,0 +1,46 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeinsight.quickFixes.createFromUsage
import com.intellij.modcommand.ActionContext
import com.intellij.modcommand.ModPsiUpdater
import com.intellij.modcommand.Presentation
import com.intellij.modcommand.PsiUpdateModCommandAction
import com.intellij.psi.util.elementType
import org.jetbrains.kotlin.idea.base.analysis.api.utils.shortenReferences
import org.jetbrains.kotlin.idea.base.psi.KotlinPsiHeuristics
import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
internal class MakeFieldPublicFix(
element: KtProperty,
) : PsiUpdateModCommandAction<KtProperty>(element) {
override fun getFamilyName(): String =
KotlinBundle.message("fix.make.field.public.family")
override fun getPresentation(context: ActionContext, element: KtProperty): Presentation? {
val name = element.name ?: return null
return Presentation.of(KotlinBundle.message("fix.make.field.public.text", name))
}
override fun invoke(
context: ActionContext,
element: KtProperty,
updater: ModPsiUpdater,
) {
val currentVisibilityModifier = element.visibilityModifier()
if (currentVisibilityModifier != null && currentVisibilityModifier.elementType != KtTokens.PUBLIC_KEYWORD) {
element.removeModifier(currentVisibilityModifier.elementType as KtModifierKeywordToken)
}
if (!KotlinPsiHeuristics.hasAnnotation(element, JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME.shortName())) {
shortenReferences(
element.addAnnotationEntry(KtPsiFactory(context.project).createAnnotationEntry("@kotlin.jvm.JvmField"))
)
}
}
}

View File

@@ -33,5 +33,5 @@ class MakeFieldPublicFix(property: KtProperty) : KotlinQuickFixAction<KtProperty
override fun getText(): String = familyName
override fun getFamilyName(): String = element?.name?.let { KotlinBundle.message("fix.make.field.public", it) } ?: ""
override fun getFamilyName(): String = element?.name?.let { KotlinBundle.message("fix.make.field.public.text", it) } ?: ""
}