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
This commit is contained in:
Anna Kozlova
2020-08-21 08:03:52 +00:00
committed by intellij-monorepo-bot
parent a8cd52076a
commit af1c8c2574
4 changed files with 25 additions and 7 deletions
@@ -0,0 +1,5 @@
class a {
void foo(String s, int i, boolean b) {
String desc = i18nizedExpr;
}
}
@@ -0,0 +1,5 @@
class a {
void foo(String s, int i, boolean b) {
String desc = "Our " + s + " has " + (b ? i + " doo<caret>rs" : "many windows");
}
}
@@ -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\")");
@@ -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) {