From bbd7f0443fefaae382c8859d6970c20e46ff9f99 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 29 Jan 2020 13:03:07 +0700 Subject: [PATCH] AddTypeArgumentsFix: make robust to parenthesizing GitOrigin-RevId: d8cd64e88d314d4362e7ee577ed043f6516c34c1 --- .../impl/quickfix/AddTypeArgumentsFix.java | 12 +++++++++++- .../addTypeArguments/afterParenthesesJava8.java | 16 ++++++++++++++++ .../addTypeArguments/beforeParenthesesJava8.java | 16 ++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterParenthesesJava8.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeParenthesesJava8.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java index a032fa74a3bf..45d226e011cf 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java @@ -28,6 +28,8 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + public class AddTypeArgumentsFix extends MethodArgumentFix { private static final Logger LOG = Logger.getInstance(AddTypeArgumentsFix.class); @@ -66,6 +68,8 @@ public class AddTypeArgumentsFix extends MethodArgumentFix { public static PsiExpression addTypeArguments(PsiExpression expression, PsiType toType) { if (!PsiUtil.isLanguageLevel5OrHigher(expression)) return null; + PsiExpression orig = expression; + expression = PsiUtil.skipParenthesizedExprDown(expression); if (expression instanceof PsiMethodCallExpression) { final PsiMethodCallExpression methodCall = (PsiMethodCallExpression)expression; final PsiReferenceParameterList list = methodCall.getMethodExpression().getParameterList(); @@ -116,7 +120,13 @@ public class AddTypeArgumentsFix extends MethodArgumentFix { methodExpression.setQualifierExpression(qualifierExpression); } - return (PsiExpression)JavaCodeStyleManager.getInstance(copy.getProject()).shortenClassReferences(copy); + PsiExpression result = (PsiExpression)JavaCodeStyleManager.getInstance(copy.getProject()).shortenClassReferences(copy); + if (orig != expression) { + PsiExpression parenthesized = (PsiExpression)orig.copy(); + Objects.requireNonNull(PsiUtil.skipParenthesizedExprDown(parenthesized)).replace(result); + return parenthesized; + } + return result; } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterParenthesesJava8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterParenthesesJava8.java new file mode 100644 index 000000000000..e8a4cbd2e8b8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterParenthesesJava8.java @@ -0,0 +1,16 @@ +// "Add explicit type arguments" "true" +import java.util.Iterator; + +public abstract class MyIterable implements Iterable { + static native MyIterable of(E e); + final native MyIterable append(E element); + final native MyIterable append(Iterable other); + + static native MyIterable once(Iterator iterator); + + void split() { + E next = iterator().next(); + of(next).append(once(foo().takeWhile(e -> e))); + of(next).append((MyIterable.once(foo().takeWhile(e -> e)))); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeParenthesesJava8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeParenthesesJava8.java new file mode 100644 index 000000000000..ddd7d8630465 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeParenthesesJava8.java @@ -0,0 +1,16 @@ +// "Add explicit type arguments" "true" +import java.util.Iterator; + +public abstract class MyIterable implements Iterable { + static native MyIterable of(E e); + final native MyIterable append(E element); + final native MyIterable append(Iterable other); + + static native MyIterable once(Iterator iterator); + + void split() { + E next = iterator().next(); + of(next).append(once(foo().takeWhile(e -> e))); + of(next).append((once(foo().takeWhile(e -> e)))); + } +} \ No newline at end of file