From 55b221776b834c149a33ddf213b00c51974a6c08 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 8 Jul 2013 19:19:41 +0400 Subject: [PATCH] Inline adds parentheses when it is necessary. Test data for Remove Unnecessary Parentheses was updated, since parentheses in foo && (bar && baz) is not "unnecessary": removing it changes program semantics. #KT-2637 in progress --- .../jet/lang/psi/JetExpressionImpl.java | 11 ++ .../jetbrains/jet/lang/psi/JetPsiUtil.java | 76 ++++++--- .../inline/addParenthesis/ArrayAccess.kt | 4 + .../addParenthesis/ArrayAccess.kt.after | 3 + .../addParenthesis/ArrayAccessDontAdd.kt | 4 + .../ArrayAccessDontAdd.kt.after | 3 + .../inline/addParenthesis/Binary.kt | 4 + .../inline/addParenthesis/Binary.kt.after | 3 + .../inline/addParenthesis/BinaryDontAdd.kt | 4 + .../addParenthesis/BinaryDontAdd.kt.after | 3 + .../refactoring/inline/addParenthesis/Call.kt | 4 + .../inline/addParenthesis/Call.kt.after | 3 + .../inline/addParenthesis/CallDontAdd.kt | 4 + .../addParenthesis/CallDontAdd.kt.after | 3 + .../inline/addParenthesis/Colon.kt | 4 + .../inline/addParenthesis/Colon.kt.after | 3 + .../inline/addParenthesis/ColonDontAdd.kt | 4 + .../addParenthesis/ColonDontAdd.kt.after | 3 + .../refactoring/inline/addParenthesis/If.kt | 4 + .../inline/addParenthesis/If.kt.after | 3 + .../addParenthesis/IfIntoArrayAccess.kt | 4 + .../addParenthesis/IfIntoArrayAccess.kt.after | 3 + .../IfIntoArrayAccessBrackets.kt | 7 + .../IfIntoArrayAccessBrackets.kt.after | 6 + .../inline/addParenthesis/IfIntoBinaryLeft.kt | 4 + .../addParenthesis/IfIntoBinaryLeft.kt.after | 3 + .../addParenthesis/IfIntoBinaryRight.kt | 4 + .../addParenthesis/IfIntoBinaryRight.kt.after | 3 + .../addParenthesis/IfIntoBinaryRightLeft.kt | 4 + .../IfIntoBinaryRightLeft.kt.after | 3 + .../IfIntoBinaryRightLeftDontAdd.kt | 4 + .../IfIntoBinaryRightLeftDontAdd.kt.after | 3 + .../inline/addParenthesis/IfIntoPostfix.kt | 4 + .../addParenthesis/IfIntoPostfix.kt.after | 3 + .../inline/addParenthesis/IfIntoPrefix.kt | 4 + .../addParenthesis/IfIntoPrefix.kt.after | 3 + .../inline/addParenthesis/IsDontAdd.kt | 4 + .../inline/addParenthesis/IsDontAdd.kt.after | 3 + .../inline/addParenthesis/IsIntoCall.kt | 4 + .../inline/addParenthesis/IsIntoCall.kt.after | 3 + .../inline/addParenthesis/LeftAssociative.kt | 4 + .../addParenthesis/LeftAssociative.kt.after | 3 + .../addParenthesis/LeftAssociativeBoolean.kt | 4 + .../LeftAssociativeBoolean.kt.after | 3 + .../addParenthesis/LeftAssociativeDontAdd.kt | 4 + .../LeftAssociativeDontAdd.kt.after | 3 + .../addParenthesis/PostfixIntoPrefix.kt | 4 + .../addParenthesis/PostfixIntoPrefix.kt.after | 3 + .../addParenthesis/PrefixIntoPostfix.kt | 4 + .../addParenthesis/PrefixIntoPostfix.kt.after | 3 + .../inline/addParenthesis/Qualified.kt | 4 + .../inline/addParenthesis/Qualified.kt.after | 3 + .../inline/addParenthesis/QualifiedDontAdd.kt | 4 + .../addParenthesis/QualifiedDontAdd.kt.after | 3 + .../inline/addParenthesis/UnaryIntoBinary.kt | 5 + .../addParenthesis/UnaryIntoBinary.kt.after | 4 + .../inline/InlineTestGenerated.java | 150 ++++++++++++++++++ 57 files changed, 413 insertions(+), 21 deletions(-) create mode 100644 idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/Binary.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/Binary.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/Call.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/Call.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/Colon.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/Colon.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/If.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/If.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/Qualified.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/Qualified.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt.after create mode 100644 idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt create mode 100644 idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt.after diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionImpl.java index eb631ff472a..bc1584cd381 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetExpressionImpl.java @@ -17,6 +17,8 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.impl.source.tree.TreeElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeType; @@ -41,4 +43,13 @@ abstract class JetExpressionImpl extends JetElementImpl implements JetExpression return containerNode.findChildByClass(JetExpression.class); } + + @Override + public void replaceChildInternal(PsiElement child, TreeElement newElement) { + PsiElement newPsi = newElement.getPsi(); + if (newPsi instanceof JetExpression && JetPsiUtil.areParenthesesNecessary((JetExpression) newPsi, ((JetExpression) child), this)) { + newElement = (TreeElement) JetPsiFactory.createExpression(getProject(), "(" + newElement.getText() + ")").getNode(); + } + super.replaceChildInternal(child, newElement); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index a5505b3783a..1319f46a676 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -20,10 +20,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiComment; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.*; import com.intellij.psi.impl.CheckUtil; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.psi.tree.IElementType; @@ -604,52 +601,89 @@ public class JetPsiUtil { return null; } - private static int getPrecedenceOfOperation(@NotNull JetExpression expression, @NotNull IElementType operation) { + private static int getPrecedenceOfOperation(@NotNull JetExpression expression, @Nullable IElementType operation) { if (expression instanceof JetPostfixExpression) return 0; if (expression instanceof JetQualifiedExpression) return 0; + if (expression instanceof JetCallExpression) return 0; + if (expression instanceof JetArrayAccessExpression) return 0; + if (expression instanceof JetPrefixExpression) return 1; + if (expression instanceof JetDeclaration) return 100; + if (expression instanceof JetStatementExpression) return 100; + if (expression instanceof JetIfExpression) return 100; + for (JetExpressionParsing.Precedence precedence : JetExpressionParsing.Precedence.values()) { if (precedence != JetExpressionParsing.Precedence.PREFIX && precedence != JetExpressionParsing.Precedence.POSTFIX && precedence.getOperations().contains(operation)) { return precedence.ordinal(); } } - throw new IllegalStateException("Unknown operation"); + + return -1; } public static boolean areParenthesesUseless(@NotNull JetParenthesizedExpression expression) { JetExpression innerExpression = expression.getExpression(); - JetExpression parentExpression = PsiTreeUtil.getParentOfType(expression, JetExpression.class, true); - if (innerExpression == null || parentExpression == null) return true; + if (innerExpression == null) return true; + + PsiElement parent = expression.getParent(); + if (!(parent instanceof JetExpression)) return true; + + return !areParenthesesNecessary(innerExpression, expression, (JetExpression) parent); + } + + public static boolean areParenthesesNecessary(@NotNull JetExpression innerExpression, @NotNull JetExpression currentInner, @NotNull JetExpression parentExpression) { + if (parentExpression instanceof JetParenthesizedExpression || innerExpression instanceof JetParenthesizedExpression) { + return false; + } + + if (parentExpression instanceof JetWhenExpression || innerExpression instanceof JetWhenExpression) { + return false; + } + + if (innerExpression instanceof JetIfExpression) { + PsiElement current = parentExpression; + + while (!(current instanceof JetBlockExpression || current instanceof JetDeclaration || current instanceof JetStatementExpression)) { + if (current.getTextRange().getEndOffset() != currentInner.getTextRange().getEndOffset()) { + return current.getText().charAt(current.getTextLength() - 1) != ')'; // if current expression is "guarded" by parenthesis, no extra parenthesis is necessary + } + + current = current.getParent(); + } + } IElementType innerOperation = getOperation(innerExpression); IElementType parentOperation = getOperation(parentExpression); // 'return (@label{...})' case if (parentExpression instanceof JetReturnExpression && innerOperation == JetTokens.LABEL_IDENTIFIER) { - return false; + return true; } // '(x: Int) < y' case if (innerExpression instanceof JetBinaryExpressionWithTypeRHS && parentOperation == JetTokens.LT) { - return false; - } - - // associative operations - if (innerOperation == parentOperation && (innerOperation == JetTokens.OROR || innerOperation == JetTokens.ANDAND)) { return true; } - if (innerOperation == null) return true; - if (parentExpression instanceof JetArrayAccessExpression) { - return ((JetArrayAccessExpression) parentExpression).getArrayExpression() != expression; - } - if (parentOperation == null) return true; - int innerPrecedence = getPrecedenceOfOperation(innerExpression, innerOperation); int parentPrecedence = getPrecedenceOfOperation(parentExpression, parentOperation); - return innerPrecedence < parentPrecedence; + + if (innerPrecedence == parentPrecedence) { + if (parentExpression instanceof JetBinaryExpression) { + if (innerOperation == JetTokens.ANDAND || innerOperation == JetTokens.OROR) { + return false; + } + return ((JetBinaryExpression) parentExpression).getRight() == currentInner; + } + if (parentExpression instanceof JetPrefixExpression || innerExpression instanceof JetPrefixExpression) { + return innerOperation == parentOperation && (innerOperation == JetTokens.PLUS || innerOperation == JetTokens.MINUS); + } + return false; + } + + return innerPrecedence >= parentPrecedence; } public static boolean isAssignment(@NotNull PsiElement element) { diff --git a/idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt b/idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt new file mode 100644 index 00000000000..6cc7791f565 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt @@ -0,0 +1,4 @@ +fun f() { + val v = s1 + s2 + println(v[1]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt.after b/idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt.after new file mode 100644 index 00000000000..16cb1c8401e --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((s1 + s2)[1]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt new file mode 100644 index 00000000000..b30bbe6cd28 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = foo() + println(v[1]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt.after new file mode 100644 index 00000000000..5dcd142637d --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(foo()[1]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Binary.kt b/idea/testData/refactoring/inline/addParenthesis/Binary.kt new file mode 100644 index 00000000000..9b061cb3828 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Binary.kt @@ -0,0 +1,4 @@ +fun f() { + val v = 150 + 150 + println(v * 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Binary.kt.after b/idea/testData/refactoring/inline/addParenthesis/Binary.kt.after new file mode 100644 index 00000000000..7c6dc3a995c --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Binary.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((150 + 150) * 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt new file mode 100644 index 00000000000..5f5a7949edf --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = 150 * 2 + println(v + 0) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt.after new file mode 100644 index 00000000000..e15fed5f655 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(150 * 2 + 0) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Call.kt b/idea/testData/refactoring/inline/addParenthesis/Call.kt new file mode 100644 index 00000000000..e72915594c2 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Call.kt @@ -0,0 +1,4 @@ +fun f() { + val v = -predicate + println(v()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Call.kt.after b/idea/testData/refactoring/inline/addParenthesis/Call.kt.after new file mode 100644 index 00000000000..cd0162a18a8 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Call.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((-predicate)()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt new file mode 100644 index 00000000000..a3c6f861519 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = foo[1] + println(v()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt.after new file mode 100644 index 00000000000..6346bbbc425 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(foo[1]()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Colon.kt b/idea/testData/refactoring/inline/addParenthesis/Colon.kt new file mode 100644 index 00000000000..fd3daac86bf --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Colon.kt @@ -0,0 +1,4 @@ +fun f() { + val v = 2..3 + println(v: IntRange) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Colon.kt.after b/idea/testData/refactoring/inline/addParenthesis/Colon.kt.after new file mode 100644 index 00000000000..eb3821e4c52 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Colon.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((2..3): IntRange) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt new file mode 100644 index 00000000000..61a09e29f22 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = -1 + println(v: Int) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt.after new file mode 100644 index 00000000000..6ec0d8b83c1 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(-1: Int) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/If.kt b/idea/testData/refactoring/inline/addParenthesis/If.kt new file mode 100644 index 00000000000..9d7a367a1ac --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/If.kt @@ -0,0 +1,4 @@ +fun f() { + val v = 2 + 3 + println(if (true) 1 else v) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/If.kt.after b/idea/testData/refactoring/inline/addParenthesis/If.kt.after new file mode 100644 index 00000000000..b9517f44e5f --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/If.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(if (true) 1 else 2 + 3) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt new file mode 100644 index 00000000000..bdaa3862443 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) a else b + println(v[0]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt.after new file mode 100644 index 00000000000..9fe9d01d9e2 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((if (true) a else b)[0]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt new file mode 100644 index 00000000000..0a4c872bd2b --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt @@ -0,0 +1,7 @@ +import java.util.ArrayList + +fun f() { + val a = ArrayList() + val v = if (true) 1 else 2 + println(a[v]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt.after new file mode 100644 index 00000000000..b7c72b3b6dc --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt.after @@ -0,0 +1,6 @@ +import java.util.ArrayList + +fun f() { + val a = ArrayList() + println(a[if (true) 1 else 2]) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt new file mode 100644 index 00000000000..c41de6b47c3 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) 1 else 2 + println(v * 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt.after new file mode 100644 index 00000000000..6ada1727c1f --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((if (true) 1 else 2) * 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt new file mode 100644 index 00000000000..97c9e3cd411 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) 1 else 2 + println(1 * v) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt.after new file mode 100644 index 00000000000..e804babd05c --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(1 * if (true) 1 else 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt new file mode 100644 index 00000000000..81751f72b85 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) 1 else 2 + println(1 * v + 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt.after new file mode 100644 index 00000000000..8a0ff4b5585 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(1 * (if (true) 1 else 2) + 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt new file mode 100644 index 00000000000..dd47e77386b --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) 1 else 2 + println((1 * v) + 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt.after new file mode 100644 index 00000000000..479b7d3c710 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((1 * if (true) 1 else 2) + 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt new file mode 100644 index 00000000000..a13ddf4e01f --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) a else b + println(v++) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt.after new file mode 100644 index 00000000000..ba606f82a70 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((if (true) a else b)++) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt b/idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt new file mode 100644 index 00000000000..dd1204e4777 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt @@ -0,0 +1,4 @@ +fun f() { + val v = if (true) a else b + println(+v) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt.after b/idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt.after new file mode 100644 index 00000000000..9971a12a2f0 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(+if (true) a else b) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt new file mode 100644 index 00000000000..6be4027d8b4 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = foo() + println(v is String) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt.after new file mode 100644 index 00000000000..8f07f5e8831 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(foo() is String) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt b/idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt new file mode 100644 index 00000000000..30292fc46aa --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt @@ -0,0 +1,4 @@ +fun f() { + val v = "" is String + println(v.toString()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt.after b/idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt.after new file mode 100644 index 00000000000..70b9affb6da --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(("" is String).toString()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt b/idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt new file mode 100644 index 00000000000..76a63f7fef0 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt @@ -0,0 +1,4 @@ +fun f() { + val v = a - b + println(c - v) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt.after b/idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt.after new file mode 100644 index 00000000000..d640259bc9d --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(c - (a - b)) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt new file mode 100644 index 00000000000..dc831d488ed --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt @@ -0,0 +1,4 @@ +fun f() { + val v = a && b + println(c && v) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt.after b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt.after new file mode 100644 index 00000000000..b24d143f0d1 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(c && a && b) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt new file mode 100644 index 00000000000..05078e3ab88 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = 150 - 150 + println(v + 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt.after new file mode 100644 index 00000000000..255100118e3 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(150 - 150 + 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt b/idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt new file mode 100644 index 00000000000..276cca1412c --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt @@ -0,0 +1,4 @@ +fun f() { + val v = y++ + println(-v) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt.after b/idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt.after new file mode 100644 index 00000000000..978b6786d85 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(-y++) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt b/idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt new file mode 100644 index 00000000000..d5d5a6fa61d --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt @@ -0,0 +1,4 @@ +fun f() { + val v = -y + println(v!!) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt.after b/idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt.after new file mode 100644 index 00000000000..616cdca5c79 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((-y)!!) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Qualified.kt b/idea/testData/refactoring/inline/addParenthesis/Qualified.kt new file mode 100644 index 00000000000..20690bbbeeb --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Qualified.kt @@ -0,0 +1,4 @@ +fun f() { + val v = 150 + 150 + println(v.toString()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/Qualified.kt.after b/idea/testData/refactoring/inline/addParenthesis/Qualified.kt.after new file mode 100644 index 00000000000..dc2ee073982 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/Qualified.kt.after @@ -0,0 +1,3 @@ +fun f() { + println((150 + 150).toString()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt b/idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt new file mode 100644 index 00000000000..e89d4f48d8f --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt @@ -0,0 +1,4 @@ +fun f() { + val v = foo() + println(v.toString()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt.after b/idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt.after new file mode 100644 index 00000000000..486b449462d --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt.after @@ -0,0 +1,3 @@ +fun f() { + println(foo().toString()) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt b/idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt new file mode 100644 index 00000000000..fc8e7659046 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt @@ -0,0 +1,5 @@ +fun f() { + // this case is not processed specifically in implementation, but it works + val x = -y + println(5-x) +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt.after b/idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt.after new file mode 100644 index 00000000000..8ddfa0fe1f2 --- /dev/null +++ b/idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt.after @@ -0,0 +1,4 @@ +fun f() { + // this case is not processed specifically in implementation, but it works + println(5- -y) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/inline/InlineTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/inline/InlineTestGenerated.java index 439fb260649..77561676703 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/inline/InlineTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/inline/InlineTestGenerated.java @@ -31,6 +31,7 @@ import org.jetbrains.jet.plugin.refactoring.inline.AbstractInlineTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("idea/testData/refactoring/inline") +@InnerTestClasses({InlineTestGenerated.AddParenthesis.class}) public class InlineTestGenerated extends AbstractInlineTest { public void testAllFilesPresentInInline() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/refactoring/inline"), Pattern.compile("^(.+)\\.kt$"), true); @@ -76,4 +77,153 @@ public class InlineTestGenerated extends AbstractInlineTest { doTest("idea/testData/refactoring/inline/Var.kt"); } + @TestMetadata("idea/testData/refactoring/inline/addParenthesis") + public static class AddParenthesis extends AbstractInlineTest { + public void testAllFilesPresentInAddParenthesis() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/refactoring/inline/addParenthesis"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("ArrayAccess.kt") + public void testArrayAccess() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/ArrayAccess.kt"); + } + + @TestMetadata("ArrayAccessDontAdd.kt") + public void testArrayAccessDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/ArrayAccessDontAdd.kt"); + } + + @TestMetadata("Binary.kt") + public void testBinary() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/Binary.kt"); + } + + @TestMetadata("BinaryDontAdd.kt") + public void testBinaryDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/BinaryDontAdd.kt"); + } + + @TestMetadata("Call.kt") + public void testCall() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/Call.kt"); + } + + @TestMetadata("CallDontAdd.kt") + public void testCallDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/CallDontAdd.kt"); + } + + @TestMetadata("Colon.kt") + public void testColon() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/Colon.kt"); + } + + @TestMetadata("ColonDontAdd.kt") + public void testColonDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/ColonDontAdd.kt"); + } + + @TestMetadata("If.kt") + public void testIf() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/If.kt"); + } + + @TestMetadata("IfIntoArrayAccess.kt") + public void testIfIntoArrayAccess() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccess.kt"); + } + + @TestMetadata("IfIntoArrayAccessBrackets.kt") + public void testIfIntoArrayAccessBrackets() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoArrayAccessBrackets.kt"); + } + + @TestMetadata("IfIntoBinaryLeft.kt") + public void testIfIntoBinaryLeft() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryLeft.kt"); + } + + @TestMetadata("IfIntoBinaryRight.kt") + public void testIfIntoBinaryRight() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRight.kt"); + } + + @TestMetadata("IfIntoBinaryRightLeft.kt") + public void testIfIntoBinaryRightLeft() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeft.kt"); + } + + @TestMetadata("IfIntoBinaryRightLeftDontAdd.kt") + public void testIfIntoBinaryRightLeftDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoBinaryRightLeftDontAdd.kt"); + } + + @TestMetadata("IfIntoPostfix.kt") + public void testIfIntoPostfix() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoPostfix.kt"); + } + + @TestMetadata("IfIntoPrefix.kt") + public void testIfIntoPrefix() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IfIntoPrefix.kt"); + } + + @TestMetadata("IsDontAdd.kt") + public void testIsDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IsDontAdd.kt"); + } + + @TestMetadata("IsIntoCall.kt") + public void testIsIntoCall() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/IsIntoCall.kt"); + } + + @TestMetadata("LeftAssociative.kt") + public void testLeftAssociative() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/LeftAssociative.kt"); + } + + @TestMetadata("LeftAssociativeBoolean.kt") + public void testLeftAssociativeBoolean() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/LeftAssociativeBoolean.kt"); + } + + @TestMetadata("LeftAssociativeDontAdd.kt") + public void testLeftAssociativeDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/LeftAssociativeDontAdd.kt"); + } + + @TestMetadata("PostfixIntoPrefix.kt") + public void testPostfixIntoPrefix() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/PostfixIntoPrefix.kt"); + } + + @TestMetadata("PrefixIntoPostfix.kt") + public void testPrefixIntoPostfix() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/PrefixIntoPostfix.kt"); + } + + @TestMetadata("Qualified.kt") + public void testQualified() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/Qualified.kt"); + } + + @TestMetadata("QualifiedDontAdd.kt") + public void testQualifiedDontAdd() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/QualifiedDontAdd.kt"); + } + + @TestMetadata("UnaryIntoBinary.kt") + public void testUnaryIntoBinary() throws Exception { + doTest("idea/testData/refactoring/inline/addParenthesis/UnaryIntoBinary.kt"); + } + + } + + public static Test suite() { + TestSuite suite = new TestSuite("InlineTestGenerated"); + suite.addTestSuite(InlineTestGenerated.class); + suite.addTestSuite(AddParenthesis.class); + return suite; + } }