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