From 697ec130fb1fa8c2c44e39e999036e0fb2e6b199 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Wed, 25 May 2011 17:16:26 +0400 Subject: [PATCH] convert elvis & some tests --- .../convertToJava/ExpressionGenerator.java | 54 +++++++++++++++---- .../CodeBlockGenerationTest.groovy | 5 +- .../codeBlock/asserts.groovy | 3 ++ .../codeBlock/asserts.java | 3 ++ .../codeBlock/binary.groovy | 7 +++ .../convertGroovyToJava/codeBlock/binary.java | 6 +++ .../codeBlock/conditional.groovy | 12 +++++ .../codeBlock/conditional.java | 9 ++++ 8 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.groovy create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.java create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.groovy create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.java create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.groovy create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java index 9c35c20a8bcc..7f3bdc3af452 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java @@ -30,6 +30,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; import org.jetbrains.plugins.groovy.lang.psi.api.formatter.GrControlStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; @@ -60,7 +61,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; -import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; +import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; import static org.jetbrains.plugins.groovy.refactoring.convertToJava.GenerationUtil.*; @@ -300,19 +301,36 @@ public class ExpressionGenerator extends Generator { generateMethodCall(applicationStatement); } + @Override public void visitConditionalExpression(GrConditionalExpression expression) { final GrExpression condition = expression.getCondition(); final GrExpression thenBranch = expression.getThenBranch(); final GrExpression elseBranch = expression.getElseBranch(); - final PsiType type = condition.getType(); - if (type == null || TypesUtil.unboxPrimitiveTypeWrapper(type) == PsiType.BOOLEAN) { - condition.accept(this); + final boolean elvis = expression instanceof GrElvisExpression; + final String var; + if (elvis) { + var = createVarByInitializer(condition); } else { - GenerationUtil.invokeMethodByName( - condition, + var = null; + } + final PsiType type = condition.getType(); + if (type == null || TypesUtil.unboxPrimitiveTypeWrapper(type) == PsiType.BOOLEAN) { + if (elvis) { + builder.append(var); + } + else { + condition.accept(this); + } + } + else { + final GroovyResolveResult[] results = ResolveUtil.getMethodCandidates(type, "asBoolean", expression, PsiType.EMPTY_ARRAY); + final GroovyResolveResult result = PsiImplUtil.extractUniqueResult(results); + GenerationUtil.invokeMethodByResolveResult( + elvis ? factory.createReferenceExpressionFromText(var, expression) : condition, + result, "asBoolean", GrExpression.EMPTY_ARRAY, GrNamedArgument.EMPTY_ARRAY, GrClosableBlock.EMPTY_ARRAY, this, @@ -321,9 +339,19 @@ public class ExpressionGenerator extends Generator { } builder.append("?"); - thenBranch.accept(this); + if (thenBranch != null) { + if (elvis) { + builder.append(var); + } + else { + thenBranch.accept(this); + } + } + builder.append(":"); - elseBranch.accept(this); + if (elseBranch != null) { + elseBranch.accept(this); + } } /** @@ -699,6 +727,10 @@ public class ExpressionGenerator extends Generator { final GroovyResolveResult resolveResult = referenceExpression.advancedResolve(); final PsiElement resolved = resolveResult.getElement(); + if (resolved == null && qualifier == null && context.myUsedVarNames.contains(referenceExpression.getReferenceName())) { + builder.append(referenceExpression.getReferenceName()); + return; + } if (qualifier == null && (resolved == null || resolved instanceof LightElement) && !(referenceExpression.getParent() instanceof GrCall) && PsiUtil.isInScriptContext(referenceExpression)) { @@ -779,11 +811,15 @@ public class ExpressionGenerator extends Generator { } private String createVarByInitializer(GrExpression initializer) { + GrExpression inner = initializer; + while (inner instanceof GrParenthesizedExpression) inner = ((GrParenthesizedExpression)inner).getOperand(); + if (inner != null) initializer = inner; + if (initializer instanceof GrReferenceExpression) { final GrExpression qualifier = ((GrReferenceExpression)initializer).getQualifier(); if (qualifier == null) { final PsiElement resolved = ((GrReferenceExpression)initializer).resolve(); - if (resolved instanceof GrVariable && GroovyRefactoringUtil.isLocalVariable((GrVariable)resolved)) { + if (resolved instanceof GrVariable && !(resolved instanceof GrField)) { //don't create new var. it is already exists return ((GrVariable)resolved).getName(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy index ba89ce123b6b..3ee15ae4bff8 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy @@ -19,10 +19,10 @@ package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.intellij.lang.StdLanguages import com.intellij.psi.PsiFile import com.intellij.psi.impl.source.PostprocessReformattingAspect +import org.jetbrains.plugins.groovy.LightGroovyTestCase import org.jetbrains.plugins.groovy.lang.psi.GroovyFile import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.GrTopStatement import org.jetbrains.plugins.groovy.util.TestUtils -import org.jetbrains.plugins.groovy.LightGroovyTestCase /** * @author Maxim.Medvedev @@ -154,4 +154,7 @@ public final class Matcher { void testUnresolvedArrayAccess() {doTest()} void testArrayAccess() {doTest()} void testCastWithEquality() {doTest()} + void testAsserts() {doTest()} + void testConditional() {doTest()} + void testBinary() {doTest()} } diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.groovy new file mode 100644 index 000000000000..cd6889d07d9a --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.groovy @@ -0,0 +1,3 @@ +assert 4<5; +assert (4+5).asBoolean() +assert diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.java new file mode 100644 index 000000000000..ecf9ceaacb59 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/asserts.java @@ -0,0 +1,3 @@ +assert 4 < 5; +assert org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean((4 + 5)); +assert; diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.groovy new file mode 100644 index 000000000000..331754ecc5a1 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.groovy @@ -0,0 +1,7 @@ +def a = 5 +def b =9 + +print a+b +print a+; +print (+5) +print ("sdf"+'f') \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.java new file mode 100644 index 000000000000..9c0e4586f6e0 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/binary.java @@ -0,0 +1,6 @@ +java.lang.Integer a = 5; +java.lang.Integer b = 9; +print(a + b); +print(a +); +print(+5); +print("sdf" + "f"); diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.groovy new file mode 100644 index 000000000000..d16ee993b4c7 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.groovy @@ -0,0 +1,12 @@ +def a = 5 +print a ? 1 : 2 + +print a ?: 4 + +def b = true +print b ? 3 : 4 +print b ?: 5 + +print b? : 4 + +print( (3-4)?:4) \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.java new file mode 100644 index 000000000000..aac06072db7a --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/conditional.java @@ -0,0 +1,9 @@ +java.lang.Integer a = 5; +print(org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean(a)?1:2); +print(org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean(a)?a:4); +java.lang.Boolean b = true; +print(b?3:4); +print(b?b:5); +print(b?:4); +final java.lang.Integer i = 3 - 4; +print(org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean(i)?i:4);