From af1c8c25744a7bfae1cdc90cfe2183c1eeaa029c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 21 Aug 2020 09:59:54 +0200 Subject: [PATCH] i18n fix: traverse to the expression top level (IDEA-248707) if one need to extract subpart of concatenation, it's required to extract a variable; similar to parts of polyadic expression GitOrigin-RevId: 46cd1a75303b72ea64e9694617fb43f4d3da5982 --- .../i18nize/afterNestedConcatenation.java | 5 +++++ .../i18nize/beforeNestedConcatenation.java | 5 +++++ .../daemon/quickFix/I18nizeTest.java | 1 + .../i18n/I18nizeConcatenationQuickFix.java | 21 ++++++++++++------- 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/afterNestedConcatenation.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/beforeNestedConcatenation.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/afterNestedConcatenation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/afterNestedConcatenation.java new file mode 100644 index 000000000000..c5f4b440ef82 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/afterNestedConcatenation.java @@ -0,0 +1,5 @@ +class a { + void foo(String s, int i, boolean b) { + String desc = i18nizedExpr; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/beforeNestedConcatenation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/beforeNestedConcatenation.java new file mode 100644 index 000000000000..08fe75593cea --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/i18nize/beforeNestedConcatenation.java @@ -0,0 +1,5 @@ +class a { + void foo(String s, int i, boolean b) { + String desc = "Our " + s + " has " + (b ? i + " doors" : "many windows"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/I18nizeTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/I18nizeTest.java index b6a133bd3317..dfea299a2340 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/I18nizeTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/I18nizeTest.java @@ -93,6 +93,7 @@ public class I18nizeTest extends LightJavaCodeInsightTestCase { public void testLongConcat() {doTest();} public void testCharacterLiteral() {doTest();} + public void testNestedConcatenation() {doTest();} public void testShortenClassReferences() { doTest("p.MyBundle.message(\"key\")"); diff --git a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nizeConcatenationQuickFix.java b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nizeConcatenationQuickFix.java index 5df3bfd3109b..627869b1bb8f 100644 --- a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nizeConcatenationQuickFix.java +++ b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nizeConcatenationQuickFix.java @@ -13,9 +13,7 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.uast.UExpression; -import org.jetbrains.uast.UPolyadicExpression; -import org.jetbrains.uast.UastContextKt; +import org.jetbrains.uast.*; import org.jetbrains.uast.expressions.UInjectionHost; import org.jetbrains.uast.expressions.UStringConcatenationsFacade; import org.jetbrains.uast.generate.UastCodeGenerationPlugin; @@ -105,10 +103,19 @@ public class I18nizeConcatenationQuickFix extends I18nizeQuickFix { @Nullable public static UPolyadicExpression getEnclosingLiteralConcatenation(final PsiElement psiElement) { - UPolyadicExpression uPolyadicExpression = UastContextKt.getUastParentOfType(psiElement, UPolyadicExpression.class); - UStringConcatenationsFacade concatenation = UStringConcatenationsFacade.createFromTopConcatenation( - uPolyadicExpression - ); + UExpression topExpression = UastContextKt.getUastParentOfType(psiElement, UPolyadicExpression.class); + while (topExpression != null) { + UElement parent = topExpression.getUastParent(); + if (parent instanceof UParenthesizedExpression || + parent instanceof UIfExpression || + parent instanceof UPolyadicExpression) { + topExpression = (UExpression)parent; + } + else { + break; + } + } + UStringConcatenationsFacade concatenation = UStringConcatenationsFacade.createFromTopConcatenation(topExpression); if (concatenation != null) { PartiallyKnownString pks = concatenation.asPartiallyKnownString(); if (pks.getSegments().size() == 1) {