PSI: Add parentheses around non-trivial callee expressions

#KT-8232 Fixed
This commit is contained in:
Alexey Sedunov
2015-06-25 16:18:18 +03:00
parent 5ac1fbf59b
commit 8c9863e759
5 changed files with 25 additions and 1 deletions
@@ -535,6 +535,16 @@ public class JetPsiUtil {
}
}
if (parentExpression instanceof JetCallExpression && currentInner == ((JetCallExpression) parentExpression).getCalleeExpression()) {
if (innerExpression instanceof JetSimpleNameExpression) return false;
if (PsiUtilPackage.getQualifiedExpressionForSelector(parentExpression) != null) return true;
return !(innerExpression instanceof JetThisExpression
|| innerExpression instanceof JetArrayAccessExpression
|| innerExpression instanceof JetConstantExpression
|| innerExpression instanceof JetStringTemplateExpression
|| innerExpression instanceof JetCallExpression);
}
IElementType innerOperation = getOperation(innerExpression);
IElementType parentOperation = getOperation(parentExpression);
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.callExpression
import org.jetbrains.kotlin.idea.intentions.calleeName
import org.jetbrains.kotlin.psi.JetCallExpression
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression
import org.jetbrains.kotlin.types.expressions.OperatorConventions
@@ -33,7 +34,7 @@ public class ReplaceInvokeIntention : JetSelfTargetingRangeIntention<JetDotQuali
override fun applyTo(element: JetDotQualifiedExpression, editor: Editor) {
val receiver = element.getReceiverExpression()
val callExpression = element.callExpression!!
val callExpression = element.callExpression!!.copy() as JetCallExpression
callExpression.getCalleeExpression()!!.replace(receiver)
element.replace(callExpression)
}
@@ -0,0 +1,4 @@
fun foo(x : String, y : () -> String.() -> Unit) {
val <caret>f = y()
x.f()
}
@@ -0,0 +1,3 @@
fun foo(x : String, y : () -> String.() -> Unit) {
x.(y())()
}
@@ -151,6 +151,12 @@ public class InlineTestGenerated extends AbstractInlineTest {
doTest(fileName);
}
@TestMetadata("Callee.kt")
public void testCallee() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/inline/addParenthesis/Callee.kt");
doTest(fileName);
}
@TestMetadata("Colon.kt")
public void testColon() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/inline/addParenthesis/Colon.kt");