diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToMethod/transformations/AsTypeTransformation.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToMethod/transformations/AsTypeTransformation.java index b9ef64260e9a..1ef6d558cd22 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToMethod/transformations/AsTypeTransformation.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToMethod/transformations/AsTypeTransformation.java @@ -15,6 +15,8 @@ */ package org.jetbrains.plugins.groovy.codeInspection.changeToMethod.transformations; +import com.intellij.psi.PsiClassType; +import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -35,7 +37,11 @@ public class AsTypeTransformation extends Transformation { @Override protected boolean couldApply(@NotNull GrSafeCastExpression expression) { - return expression.getCastTypeElement() != null; + GrTypeElement typeElement = expression.getCastTypeElement(); + if (typeElement == null ) return false; + PsiType type = typeElement.getType(); + return type instanceof PsiClassType && ((PsiClassType)type).getParameterCount() == 0; + } @Override diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToOperator/transformations/AsTypeTransformation.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToOperator/transformations/AsTypeTransformation.java index d4744e06c424..0a503b467778 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToOperator/transformations/AsTypeTransformation.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/changeToOperator/transformations/AsTypeTransformation.java @@ -15,24 +15,38 @@ */ package org.jetbrains.plugins.groovy.codeInspection.changeToOperator.transformations; -import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.codeInspection.changeToOperator.ChangeToOperatorInspection; -import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; -import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; + +import static java.lang.String.format; +import static org.jetbrains.plugins.groovy.codeInspection.GrInspectionUtil.replaceExpression; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.kAS; public class AsTypeTransformation extends SimpleBinaryTransformation { public AsTypeTransformation() { - super(GroovyTokenTypes.kAS); + super(kAS); + } + + + @Override + public void apply(@NotNull GrMethodCall methodCall, @NotNull ChangeToOperatorInspection.Options options) { + GrReferenceExpression rhs = (GrReferenceExpression) getRhs(methodCall); + + GrExpression rhsQualifierExpression = rhs.isQualified() ? rhs.getQualifierExpression() : rhs; + + if (rhsQualifierExpression == null) return; + + replaceExpression(methodCall, format("%s %s %s", getLhs(methodCall).getText(), kAS, rhsQualifierExpression.getText())); } @Override public boolean couldApplyInternal(@NotNull GrMethodCall methodCall, @NotNull ChangeToOperatorInspection.Options options) { GrExpression rhs = getRhs(methodCall); return super.couldApplyInternal(methodCall, options) - && rhs instanceof GrReferenceElement - && ((GrReferenceElement)rhs).resolve() instanceof PsiClass; + && ResolveUtil.resolvesToClass(rhs); } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToMethodTest.groovy index 5500678f72fb..7e53e159b9b6 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToMethodTest.groovy @@ -110,14 +110,19 @@ class Operators { "a << b" :"a.leftShift(b)", "a >> b" :"a.rightShift(b)", "a >>> b" :"a.rightShiftUnsigned(b)", - "a in b" :"b.isCase(a)", - "a as String" :"a.asType(String)", - "!(a as String)" :"!a.asType(String)" + "a in b" :"b.isCase(a)" ].each { doTest it.key, it.value } } + void testAsType() { + doTest "a as String", "a.asType(String)" + doTest "!(a as String)", "!a.asType(String)" + doTest "a as List" + doTest "a as List", "a.asType(List)" + } + void testCompareTo() { doTest "a <=> b", "a.compareTo(b)" doTest "a < b", "a.compareTo(b) < 0" diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToOperatorTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToOperatorTest.groovy index 736a426c177e..75a0006a599d 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToOperatorTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/inspections/GrChangeToOperatorTest.groovy @@ -201,7 +201,7 @@ class Operators { void testAsType() { doTest "a.asType(String)", "a as String" doTest "!a.asType(String)", "!(a as String)" - doTest "a.asType(String.class)" + doTest "a.asType(String.class)", "a as String" doTest "a.asType(a.getClass())" doTest "a.asType(UnknownClass)" }