[kotlin] Port ConvertIllegalEscapeToUnicodeEscapeFix to K2

^KTIJ-29491

GitOrigin-RevId: 107ccafe043f1fb722b2d0f7c7abf5e10af972fb
This commit is contained in:
Andrey Cherkasov
2024-07-25 17:55:13 +00:00
committed by intellij-monorepo-bot
parent d3b0d87533
commit e2d83e9a03
10 changed files with 67 additions and 15 deletions
@@ -0,0 +1,18 @@
// 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.k2.codeinsight.fixes
import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory
import org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
import org.jetbrains.kotlin.psi.KtElement
internal object IllegalEscapeFixFactory {
val convertToUnicodeEscape = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.IllegalEscape ->
val element = diagnostic.psi as? KtElement ?: return@ModCommandBased emptyList()
listOfNotNull(
ConvertIllegalEscapeToUnicodeEscapeFix.createIfApplicable(element)
)
}
}
@@ -131,6 +131,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() {
registerFactory(TypeVarianceConflictErrorFixFactory.removeTypeVariance)
registerFactory(FinalUpperBoundFixFactory.removeFinalUpperBound)
registerFactory(WrongAnnotationTargetWithUseSiteTargetFixFactory.moveReceiverAnnotation)
registerFactory(IllegalEscapeFixFactory.convertToUnicodeEscape)
}
private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix {
@@ -6901,7 +6901,29 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu
}
}
@RunWith(JUnit3RunnerWithInners.class)
@TestMetadata("../../../idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape")
public static class ConvertIllegalEscapeToUnicodeEscape extends AbstractHighLevelQuickFixTest {
@java.lang.Override
@org.jetbrains.annotations.NotNull
public final KotlinPluginMode getPluginMode() {
return KotlinPluginMode.K2;
}
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
@TestMetadata("formFeed.kt")
public void testFormFeed() throws Exception {
runTest("../../../idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt");
}
@TestMetadata("formFeedInStringTemplate.kt")
public void testFormFeedInStringTemplate() throws Exception {
runTest("../../../idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt");
}
}
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry
import org.jetbrains.kotlin.psi.KtPsiFactory
class ConvertIllegalEscapeToUnicodeEscapeFix(
class ConvertIllegalEscapeToUnicodeEscapeFix private constructor(
element: KtElement,
private val unicodeEscape: String
) : KotlinPsiUpdateModCommandAction.ElementBased<KtElement, Unit>(element, Unit) {
@@ -29,4 +29,19 @@ class ConvertIllegalEscapeToUnicodeEscapeFix(
is KtEscapeStringTemplateEntry -> element.replace(psiFactory.createStringTemplate(unicodeEscape).entries.first())
}
}
companion object {
fun createIfApplicable(element: KtElement): ConvertIllegalEscapeToUnicodeEscapeFix? {
val illegalEscape = when (element) {
is KtConstantExpression -> element.text.takeIf { it.length >= 2 }?.drop(1)?.dropLast(1)
is KtEscapeStringTemplateEntry -> element.text
else -> null
} ?: return null
val unicodeEscape = illegalEscapeToUnicodeEscape[illegalEscape] ?: return null
return ConvertIllegalEscapeToUnicodeEscapeFix(element, unicodeEscape)
}
}
}
private val illegalEscapeToUnicodeEscape = mapOf("\\f" to "\\u000c")
@@ -8,14 +8,6 @@ import org.jetbrains.kotlin.psi.*
internal object ConvertIllegalEscapeToUnicodeEscapeFixFactory : KotlinSingleIntentionActionFactory() {
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
val element = diagnostic.psiElement as? KtElement ?: return null
val illegalEscape = when (element) {
is KtConstantExpression -> element.text.takeIf { it.length >= 2 }?.drop(1)?.dropLast(1)
is KtEscapeStringTemplateEntry -> element.text
else -> null
} ?: return null
val unicodeEscape = illegalEscapeToUnicodeEscape[illegalEscape] ?: return null
return ConvertIllegalEscapeToUnicodeEscapeFix(element, unicodeEscape).asIntention()
return ConvertIllegalEscapeToUnicodeEscapeFix.createIfApplicable(element)?.asIntention()
}
private val illegalEscapeToUnicodeEscape = mapOf("\\f" to "\\u000c")
}
@@ -1,3 +1,4 @@
// "Convert to unicode escape" "true"
val c = '<caret>\f'
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
@@ -1,3 +1,4 @@
// "Convert to unicode escape" "true"
val c = '\u000c'
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
@@ -1,3 +1,4 @@
// "Convert to unicode escape" "true"
val s = "abc <caret>\f xyz"
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
@@ -1,3 +1,4 @@
// "Convert to unicode escape" "true"
val s = "abc \u000c xyz"
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix
@@ -103,7 +103,7 @@ internal fun MutableTWorkspace.generateK2FixTests() {
model("$idea/quickfix/changeToUseSpreadOperator", pattern = pattern)
model("$idea/quickfix/compilerError", pattern = pattern, isIgnored = true)
model("$idea/quickfix/convertCollectionLiteralToIntArrayOf", pattern = pattern)
model("$idea/quickfix/convertIllegalEscapeToUnicodeEscape", pattern = pattern, isIgnored = true)
model("$idea/quickfix/convertIllegalEscapeToUnicodeEscape", pattern = pattern)
model("$idea/quickfix/convertJavaInterfaceToClass", pattern = pattern, isIgnored = true)
model("$idea/quickfix/convertLateinitPropertyToNotNullDelegate", pattern = pattern)
model("$idea/quickfix/convertPropertyInitializerToGetter", pattern = pattern, isIgnored = true)