From 0a520f8bdd6909808f813a8057760b6f8da076b4 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 20 Oct 2015 19:13:51 +0300 Subject: [PATCH] More creation by pattern instead of text --- .../intentions/OperatorToFunctionIntention.kt | 83 ++++++++----------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt index c327eaffb07..76d8752c603 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt @@ -87,48 +87,38 @@ public class OperatorToFunctionIntention : JetSelfTargetingIntention "plus()" - KtTokens.MINUS -> "minus()" - KtTokens.PLUSPLUS -> "inc()" - KtTokens.MINUSMINUS -> "dec()" - KtTokens.EXCL -> "not()" + val op = element.operationReference.getReferencedNameElementType() + val operatorName = when (op) { + KtTokens.PLUS -> OperatorNameConventions.PLUS + KtTokens.MINUS -> OperatorNameConventions.MINUS + KtTokens.PLUSPLUS -> OperatorNameConventions.INC + KtTokens.MINUSMINUS -> OperatorNameConventions.DEC + KtTokens.EXCL -> OperatorNameConventions.NOT else -> return element } - val transformation = "$base.$call" - val transformed = KtPsiFactory(element).createExpression(transformation) + val transformed = KtPsiFactory(element).createExpressionByPattern("$0.$1()", element.baseExpression!!, operatorName) return element.replace(transformed) as KtExpression } - //TODO: don't use creation by plain text private fun convertPostFix(element: KtPostfixExpression): KtExpression { val op = element.getOperationReference().getReferencedNameElementType() - val base = element.getBaseExpression()!!.getText() - - val call = when (op) { - KtTokens.PLUSPLUS -> "inc()" - KtTokens.MINUSMINUS -> "dec()" + val operatorName = when (op) { + KtTokens.PLUSPLUS -> OperatorNameConventions.INC + KtTokens.MINUSMINUS -> OperatorNameConventions.DEC else -> return element } - val transformation = "$base.$call" - val transformed = KtPsiFactory(element).createExpression(transformation) + val transformed = KtPsiFactory(element).createExpressionByPattern("$0.$1()", element.baseExpression!!, operatorName) return element.replace(transformed) as KtExpression } //TODO: don't use creation by plain text private fun convertBinary(element: KtBinaryExpression): KtExpression { - val op = element.getOperationReference().getReferencedNameElementType() - val left = element.getLeft()!! - val right = element.getRight()!! - val leftText = left.getText() - val rightText = right.getText() + val op = element.operationReference.getReferencedNameElementType() + val left = element.left!! + val right = element.right!! if (op == KtTokens.EQ) { if (left is KtArrayAccessExpression) { @@ -142,31 +132,30 @@ public class OperatorToFunctionIntention : JetSelfTargetingIntention "$leftText.plus($rightText)" - KtTokens.MINUS -> "$leftText.minus($rightText)" - KtTokens.MUL -> "$leftText.times($rightText)" - KtTokens.DIV -> "$leftText.div($rightText)" - KtTokens.PERC -> "$leftText.mod($rightText)" - KtTokens.RANGE -> "$leftText.rangeTo($rightText)" - KtTokens.IN_KEYWORD -> "$rightText.contains($leftText)" - KtTokens.NOT_IN -> "!$rightText.contains($leftText)" - KtTokens.PLUSEQ -> if (functionName == "plusAssign") "$leftText.plusAssign($rightText)" else "$leftText = $leftText.plus($rightText)" - KtTokens.MINUSEQ -> if (functionName == "minusAssign") "$leftText.minusAssign($rightText)" else "$leftText = $leftText.minus($rightText)" - KtTokens.MULTEQ -> if (functionName == "multAssign") "$leftText.multAssign($rightText)" else "$leftText = $leftText.mult($rightText)" - KtTokens.DIVEQ -> if (functionName == "divAssign") "$leftText.divAssign($rightText)" else "$leftText = $leftText.div($rightText)" - KtTokens.PERCEQ -> if (functionName == "modAssign") "$leftText.modAssign($rightText)" else "$leftText = $leftText.mod($rightText)" - KtTokens.EQEQ -> if (elemType?.isMarkedNullable() ?: true) "$leftText?.equals($rightText) ?: $rightText.identityEquals(null)" else "$leftText.equals($rightText)" - KtTokens.EXCLEQ -> if (elemType?.isMarkedNullable() ?: true) "!($leftText?.equals($rightText) ?: $rightText.identityEquals(null))" else "!$leftText.equals($rightText)" - KtTokens.GT -> "$leftText.compareTo($rightText) > 0" - KtTokens.LT -> "$leftText.compareTo($rightText) < 0" - KtTokens.GTEQ -> "$leftText.compareTo($rightText) >= 0" - KtTokens.LTEQ -> "$leftText.compareTo($rightText) <= 0" + val pattern = when (op) { + KtTokens.PLUS -> "$0.plus($1)" + KtTokens.MINUS -> "$0.minus($1)" + KtTokens.MUL -> "$0.times($1)" + KtTokens.DIV -> "$0.div($1)" + KtTokens.PERC -> "$0.mod($1)" + KtTokens.RANGE -> "$0.rangeTo($1)" + KtTokens.IN_KEYWORD -> "$1.contains($0)" + KtTokens.NOT_IN -> "!$1.contains($0)" + KtTokens.PLUSEQ -> if (functionName == "plusAssign") "$0.plusAssign($1)" else "$0 = $0.plus($1)" + KtTokens.MINUSEQ -> if (functionName == "minusAssign") "$0.minusAssign($1)" else "$0 = $0.minus($1)" + KtTokens.MULTEQ -> if (functionName == "multAssign") "$0.multAssign($1)" else "$0 = $0.mult($1)" + KtTokens.DIVEQ -> if (functionName == "divAssign") "$0.divAssign($1)" else "$0 = $0.div($1)" + KtTokens.PERCEQ -> if (functionName == "modAssign") "$0.modAssign($1)" else "$0 = $0.mod($1)" + KtTokens.EQEQ -> if (elemType?.isMarkedNullable() ?: true) "$0?.equals($1) ?: $1.identityEquals(null)" else "$0.equals($1)" + KtTokens.EXCLEQ -> if (elemType?.isMarkedNullable() ?: true) "!($0?.equals($1) ?: $1.identityEquals(null))" else "!$0.equals($1)" + KtTokens.GT -> "$0.compareTo($1) > 0" + KtTokens.LT -> "$0.compareTo($1) < 0" + KtTokens.GTEQ -> "$0.compareTo($1) >= 0" + KtTokens.LTEQ -> "$0.compareTo($1) <= 0" else -> return element } - val transformed = KtPsiFactory(element).createExpression(transformation) - + val transformed = KtPsiFactory(element).createExpressionByPattern(pattern, left, right) return element.replace(transformed) as KtExpression }