From e2d83e9a03ace3aba63aeb74367eee74164cc025 Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Thu, 25 Jul 2024 16:02:36 +0400 Subject: [PATCH] [kotlin] Port ConvertIllegalEscapeToUnicodeEscapeFix to K2 ^KTIJ-29491 GitOrigin-RevId: 107ccafe043f1fb722b2d0f7c7abf5e10af972fb --- .../ConvertIllegalEscapeToUnicodeEscapeFix.kt | 18 +++++++++++++++ .../fixes/KotlinK2QuickFixRegistrar.kt | 1 + .../fixes/HighLevelQuickFixTestGenerated.java | 22 +++++++++++++++++++ .../ConvertIllegalEscapeToUnicodeEscapeFix.kt | 17 +++++++++++++- ...tIllegalEscapeToUnicodeEscapeFixFactory.kt | 10 +-------- .../formFeed.kt | 3 ++- .../formFeed.kt.after | 3 ++- .../formFeedInStringTemplate.kt | 3 ++- .../formFeedInStringTemplate.kt.after | 3 ++- .../codeinsight/GenerateK2QuickFixTests.kt | 2 +- 10 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertIllegalEscapeToUnicodeEscapeFix.kt diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertIllegalEscapeToUnicodeEscapeFix.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertIllegalEscapeToUnicodeEscapeFix.kt new file mode 100644 index 000000000000..1e5a40b575da --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/ConvertIllegalEscapeToUnicodeEscapeFix.kt @@ -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) + ) + } +} diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt index 0b82d40131fc..55b27dd1e435 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt @@ -131,6 +131,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(TypeVarianceConflictErrorFixFactory.removeTypeVariance) registerFactory(FinalUpperBoundFixFactory.removeFinalUpperBound) registerFactory(WrongAnnotationTargetWithUseSiteTargetFixFactory.moveReceiverAnnotation) + registerFactory(IllegalEscapeFixFactory.convertToUnicodeEscape) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java index 7819e29fc49c..c596b64ae1ad 100644 --- a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java @@ -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"); + } + } diff --git a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFix.kt b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFix.kt index bf2c5e0c4820..45f0874db5f8 100644 --- a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFix.kt +++ b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFix.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(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") \ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFixFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFixFactory.kt index 1532db51b123..fa8dd51c5c02 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFixFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertIllegalEscapeToUnicodeEscapeFixFactory.kt @@ -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") } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt index 55eae9ef1f63..1d30647413e9 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt @@ -1,3 +1,4 @@ // "Convert to unicode escape" "true" val c = '\f' -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt.after index ce0c4d5ddc7c..ee49cac3440b 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeed.kt.after @@ -1,3 +1,4 @@ // "Convert to unicode escape" "true" val c = '\u000c' -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt index 9f49326f4ae8..7d40fabb6210 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt @@ -1,3 +1,4 @@ // "Convert to unicode escape" "true" val s = "abc \f xyz" -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt.after index e1aabc210c12..64ca834aa182 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/convertIllegalEscapeToUnicodeEscape/formFeedInStringTemplate.kt.after @@ -1,3 +1,4 @@ // "Convert to unicode escape" "true" val s = "abc \u000c xyz" -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ConvertIllegalEscapeToUnicodeEscapeFix \ No newline at end of file diff --git a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt index 8e28142881bf..8dfcc4e3a8bf 100644 --- a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt +++ b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt @@ -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)