convert elvis & some tests

This commit is contained in:
Maxim Medvedev
2011-05-25 17:18:31 +04:00
parent 6c7ce6ca58
commit 697ec130fb
8 changed files with 89 additions and 10 deletions
@@ -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();
@@ -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()}
}
@@ -0,0 +1,3 @@
assert 4<5;
assert (4+5).asBoolean()
assert
@@ -0,0 +1,3 @@
assert 4 < 5;
assert org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean((4 + 5));
assert;
@@ -0,0 +1,7 @@
def a = 5
def b =9
print a+b
print a+;
print (+5)
print ("sdf"+'f')
@@ -0,0 +1,6 @@
java.lang.Integer a = 5;
java.lang.Integer b = 9;
print(a + b);
print(a +);
print(+5);
print("sdf" + "f");
@@ -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)
@@ -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);