diff --git a/build.gradle b/build.gradle index ef2c297..5b26a22 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'de.platon42' -version '0.3' +version '0.4' repositories { mavenCentral() @@ -41,23 +41,27 @@ intellij { patchPluginXml { changeNotes """ -

V0.3 (07-Apr-19)

- +""" } test { diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt b/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt new file mode 100644 index 0000000..e2319f5 --- /dev/null +++ b/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt @@ -0,0 +1,17 @@ +package de.platon42.intellij.plugins.cajon + +import com.intellij.psi.PsiExpression +import com.intellij.psi.PsiMethodCallExpression + +val PsiMethodCallExpression.qualifierExpression: PsiExpression get() = this.methodExpression.qualifierExpression!! +val PsiMethodCallExpression.firstArg: PsiExpression get() = this.argumentList.expressions[0]!! + +fun PsiMethodCallExpression.replaceQualifier(qualifier: PsiExpression) { + this.qualifierExpression.replace(qualifier) +} + +fun PsiMethodCallExpression.replaceQualifierFromMethodCall(oldMethodCall: PsiMethodCallExpression) { + this.qualifierExpression.replace(oldMethodCall.qualifierExpression) +} + +fun PsiMethodCallExpression.getArg(n: Int): PsiExpression = this.argumentList.expressions[n] diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt index 9ccbb7f..1f6d576 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt @@ -6,6 +6,8 @@ import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiTypesUtil import com.siyeh.ig.callMatcher.CallMatcher +import de.platon42.intellij.plugins.cajon.getArg +import de.platon42.intellij.plugins.cajon.qualifierExpression import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceSimpleMethodCallQuickFix import org.jetbrains.annotations.NonNls @@ -110,8 +112,8 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() { } protected fun checkAssertedType(expression: PsiMethodCallExpression, classname: String): Boolean { - var assertedType = expression.methodExpression.qualifierExpression?.type ?: return false - if (assertedType is PsiCapturedWildcardType) { + var assertedType = expression.qualifierExpression.type ?: return false + while (assertedType is PsiCapturedWildcardType) { assertedType = assertedType.upperBound } val assertedClass = PsiTypesUtil.getPsiClass(assertedType) ?: return false @@ -131,18 +133,26 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() { val originalMethod = getOriginalMethodName(expression) ?: return val description = REPLACE_DESCRIPTION_TEMPLATE.format(originalMethod, replacementMethod) val message = SIMPLIFY_MESSAGE_TEMPLATE.format(originalMethod, replacementMethod) - holder.registerProblem( - expression, - message, - ReplaceSimpleMethodCallQuickFix(description, replacementMethod) - ) + val quickFix = ReplaceSimpleMethodCallQuickFix(description, replacementMethod) + holder.registerProblem(expression, message, quickFix) } protected fun calculateConstantParameterValue(expression: PsiMethodCallExpression, argIndex: Int): Any? { if (argIndex >= expression.argumentList.expressionCount) return null - val valueExpression = expression.argumentList.expressions[argIndex] ?: return null + val valueExpression = expression.getArg(argIndex) val constantEvaluationHelper = JavaPsiFacade.getInstance(expression.project).constantEvaluationHelper - return constantEvaluationHelper.computeConstantExpression(valueExpression) + val value = constantEvaluationHelper.computeConstantExpression(valueExpression) + if (value == null) { + val field = (valueExpression as? PsiReferenceExpression)?.resolve() as? PsiField + if (field?.containingClass?.qualifiedName == CommonClassNames.JAVA_LANG_BOOLEAN) { + return when (field.name) { + "TRUE" -> true + "FALSE" -> false + else -> null + } + } + } + return value } protected fun hasAssertJMethod(element: PsiElement, classAndMethod: String): Boolean { diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionIsTrueOrFalseInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionIsTrueOrFalseInspection.kt index defaeba..8b6694c 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionIsTrueOrFalseInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionIsTrueOrFalseInspection.kt @@ -5,6 +5,7 @@ import com.intellij.psi.* import com.intellij.psi.tree.IElementType import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.TypeConversionUtil +import de.platon42.intellij.plugins.cajon.firstArg import de.platon42.intellij.plugins.cajon.quickfixes.SplitBinaryExpressionMethodCallQuickFix import de.platon42.intellij.plugins.cajon.quickfixes.SplitEqualsExpressionMethodCallQuickFix @@ -26,19 +27,17 @@ class AssertThatBinaryExpressionIsTrueOrFalseInspection : AbstractAssertJInspect Mapping(JavaTokenType.LE, "isLessThanOrEqualTo()", "isGreaterThan()") ) - private val PRIMITIVE_MAPPINGS_SWAPPED = listOf( - Mapping(JavaTokenType.EQEQ, "isEqualTo()", "isNotEqualTo()"), - Mapping(JavaTokenType.NE, "isNotEqualTo()", "isEqualTo()"), - Mapping(JavaTokenType.GT, "isLessThan()", "isGreaterThanOrEqualTo()"), - Mapping(JavaTokenType.GE, "isLessThanOrEqualTo()", "isGreaterThan()"), - Mapping(JavaTokenType.LT, "isGreaterThan()", "isLessThanOrEqualTo()"), - Mapping(JavaTokenType.LE, "isGreaterThanOrEqualTo()", "isLessThan()") - ) - private val OBJECT_MAPPINGS = listOf( Mapping(JavaTokenType.EQEQ, "isSameAs()", "isNotSameAs()"), Mapping(JavaTokenType.NE, "isNotSameAs()", "isSameAs()") ) + + private val SWAP_BINARY_OPERATOR = mapOf( + JavaTokenType.GT to JavaTokenType.LT, + JavaTokenType.GE to JavaTokenType.LE, + JavaTokenType.LT to JavaTokenType.GT, + JavaTokenType.LE to JavaTokenType.GE + ) } override fun getDisplayName() = DISPLAY_NAME @@ -55,14 +54,11 @@ class AssertThatBinaryExpressionIsTrueOrFalseInspection : AbstractAssertJInspect val expectedCallExpression = PsiTreeUtil.findChildOfType(statement, PsiMethodCallExpression::class.java) ?: return val isInverted = getExpectedResult(expectedCallExpression) ?: return - val assertThatArgument = expression.argumentList.expressions[0] ?: return + val assertThatArgument = expression.firstArg if (assertThatArgument is PsiMethodCallExpression && OBJECT_EQUALS.test(assertThatArgument)) { val replacementMethod = if (isInverted) "isNotEqualTo()" else "isEqualTo()" - holder.registerProblem( - expression, - EQUALS_MORE_MEANINGFUL_MESSAGE, - SplitEqualsExpressionMethodCallQuickFix(SPLIT_EQUALS_EXPRESSION_DESCRIPTION, replacementMethod) - ) + val quickFix = SplitEqualsExpressionMethodCallQuickFix(SPLIT_EQUALS_EXPRESSION_DESCRIPTION, replacementMethod) + holder.registerProblem(expression, EQUALS_MORE_MEANINGFUL_MESSAGE, quickFix) return } @@ -71,8 +67,8 @@ class AssertThatBinaryExpressionIsTrueOrFalseInspection : AbstractAssertJInspect val leftType = binaryExpression.lOperand.type ?: return val rightType = binaryExpression.rOperand?.type ?: return - val isLeftNull = TypeConversionUtil.isNullType(leftType) - val isRightNull = TypeConversionUtil.isNullType(rightType) + val bothTypes = listOf(leftType, rightType) + val (isLeftNull, isRightNull) = bothTypes.map(TypeConversionUtil::isNullType) if (isLeftNull && isRightNull) { return } else if (isLeftNull || isRightNull) { @@ -86,15 +82,17 @@ class AssertThatBinaryExpressionIsTrueOrFalseInspection : AbstractAssertJInspect return } - val isPrimitive = TypeConversionUtil.isPrimitiveAndNotNull(leftType) && TypeConversionUtil.isPrimitiveAndNotNull(rightType) - val isNumericType = TypeConversionUtil.isNumericType(leftType) && TypeConversionUtil.isNumericType(rightType) + val isPrimitive = bothTypes.all(TypeConversionUtil::isPrimitiveAndNotNull) + val isNumericType = bothTypes.all(TypeConversionUtil::isNumericType) val constantEvaluationHelper = JavaPsiFacade.getInstance(expression.project).constantEvaluationHelper val swapExpectedAndActual = constantEvaluationHelper.computeConstantExpression(binaryExpression.lOperand) != null - val tokenType = binaryExpression.operationSign.tokenType + val tokenType = binaryExpression.operationSign.tokenType.let { + if (swapExpectedAndActual) SWAP_BINARY_OPERATOR.getOrDefault(it, it) else it + } ?: return val mappingToUse = if (isPrimitive || isNumericType) { - if (swapExpectedAndActual) PRIMITIVE_MAPPINGS_SWAPPED else PRIMITIVE_MAPPINGS + PRIMITIVE_MAPPINGS } else { OBJECT_MAPPINGS } @@ -127,11 +125,8 @@ class AssertThatBinaryExpressionIsTrueOrFalseInspection : AbstractAssertJInspect pickRightOperand: Boolean = false, noExpectedExpression: Boolean = false ) { - holder.registerProblem( - expression, - BINARY_MORE_MEANINGFUL_MESSAGE, - SplitBinaryExpressionMethodCallQuickFix(SPLIT_BINARY_EXPRESSION_DESCRIPTION, replacementMethod, pickRightOperand, noExpectedExpression) - ) + val quickFix = SplitBinaryExpressionMethodCallQuickFix(SPLIT_BINARY_EXPRESSION_DESCRIPTION, replacementMethod, pickRightOperand, noExpectedExpression) + holder.registerProblem(expression, BINARY_MORE_MEANINGFUL_MESSAGE, quickFix) } } } diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanIsTrueOrFalseInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanIsTrueOrFalseInspection.kt index c72a059..def31f5 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanIsTrueOrFalseInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanIsTrueOrFalseInspection.kt @@ -1,8 +1,11 @@ package de.platon42.intellij.plugins.cajon.inspections import com.intellij.codeInspection.ProblemsHolder -import com.intellij.psi.* +import com.intellij.psi.JavaElementVisitor +import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.util.TypeConversionUtil +import de.platon42.intellij.plugins.cajon.firstArg class AssertThatBooleanIsTrueOrFalseInspection : AbstractAssertJInspection() { @@ -16,34 +19,23 @@ class AssertThatBooleanIsTrueOrFalseInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - val isEqualToObject = IS_EQUAL_TO_OBJECT.test(expression) - val isEqualToBoolean = IS_EQUAL_TO_BOOLEAN.test(expression) - val isNotEqualToObject = IS_NOT_EQUAL_TO_OBJECT.test(expression) - val isNotEqualToBoolean = IS_NOT_EQUAL_TO_BOOLEAN.test(expression) - val normalBooleanTest = isEqualToObject || isEqualToBoolean - val flippedBooleanTest = isNotEqualToObject || isNotEqualToBoolean - if (!(normalBooleanTest || flippedBooleanTest)) { + val matchingCalls = listOf( + IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_BOOLEAN, + IS_NOT_EQUAL_TO_OBJECT, IS_NOT_EQUAL_TO_BOOLEAN + ).map { it.test(expression) } + if (matchingCalls.none { it }) { return } if (!checkAssertedType(expression, ABSTRACT_BOOLEAN_ASSERT_CLASSNAME)) { return } - val equalToExpression = expression.argumentList.expressions[0] ?: return + val equalToExpression = expression.firstArg if (!TypeConversionUtil.isBooleanType(equalToExpression.type)) { return } - var value = calculateConstantParameterValue(expression, 0) - if (value == null) { - val field = (equalToExpression as? PsiReferenceExpression)?.resolve() as? PsiField - if (field?.containingClass?.qualifiedName == CommonClassNames.JAVA_LANG_BOOLEAN) { - when { - field.name == "TRUE" -> value = true - field.name == "FALSE" -> value = false - } - } - } - val expectedResult = value as? Boolean ?: return + val expectedResult = calculateConstantParameterValue(expression, 0)as? Boolean ?: return + val flippedBooleanTest = matchingCalls.drop(2).any { it } val replacementMethod = if (expectedResult xor flippedBooleanTest) "isTrue()" else "isFalse()" registerSimplifyMethod(holder, expression, replacementMethod) diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatEnumerableIsEmptyInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatEnumerableIsEmptyInspection.kt index 90f5af0..fd07ab9 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatEnumerableIsEmptyInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatEnumerableIsEmptyInspection.kt @@ -17,8 +17,7 @@ class AssertThatEnumerableIsEmptyInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - val hasSize = HAS_SIZE.test(expression) - if (!hasSize) { + if (!HAS_SIZE.test(expression)) { return } diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectIsNullOrNotNullInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectIsNullOrNotNullInspection.kt index 0e92e32..f4e56fb 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectIsNullOrNotNullInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectIsNullOrNotNullInspection.kt @@ -5,6 +5,7 @@ import com.intellij.psi.JavaElementVisitor import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.PsiType +import de.platon42.intellij.plugins.cajon.firstArg class AssertThatObjectIsNullOrNotNullInspection : AbstractAssertJInspection() { @@ -24,7 +25,7 @@ class AssertThatObjectIsNullOrNotNullInspection : AbstractAssertJInspection() { return } - if (expression.argumentList.expressions[0].type == PsiType.NULL) { + if (expression.firstArg.type == PsiType.NULL) { registerSimplifyMethod(holder, expression, if (isEqualTo) "isNull()" else "isNotNull()") } } diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt index ae0e333..6452ab7 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt @@ -3,6 +3,7 @@ package de.platon42.intellij.plugins.cajon.inspections import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil +import de.platon42.intellij.plugins.cajon.firstArg import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceSizeMethodCallQuickFix class AssertThatSizeInspection : AbstractAssertJInspection() { @@ -21,7 +22,7 @@ class AssertThatSizeInspection : AbstractAssertJInspection() { if (!ASSERT_THAT_INT.test(expression)) { return } - val actualExpression = expression.argumentList.expressions[0] ?: return + val actualExpression = expression.firstArg if (isArrayLength(actualExpression) || isCollectionSize(actualExpression)) { val statement = PsiTreeUtil.getParentOfType(expression, PsiStatement::class.java) ?: return @@ -32,7 +33,7 @@ class AssertThatSizeInspection : AbstractAssertJInspection() { registerSizeMethod(holder, expression, expectedCallExpression, "isEmpty()", noExpectedExpression = true) return } - val equalToExpression = expectedCallExpression.argumentList.expressions[0] + val equalToExpression = expectedCallExpression.firstArg if (isCollectionSize(equalToExpression) || isArrayLength(equalToExpression)) { registerSizeMethod(holder, expression, expectedCallExpression, "hasSameSizeAs()", expectedIsCollection = true) return @@ -56,10 +57,10 @@ class AssertThatSizeInspection : AbstractAssertJInspection() { // new stuff in AssertJ 13.2.0 if (hasAssertJMethod(expression, "AbstractIterableAssert.hasSizeLessThan")) { val matchedMethod = listOf( - Pair(IS_GREATER_THAN_INT, "hasSizeGreaterThan()"), - Pair(IS_GREATER_THAN_OR_EQUAL_TO_INT, "hasSizeGreaterThanOrEqualTo()"), - Pair(IS_LESS_THAN_OR_EQUAL_TO_INT, "hasSizeLessThanOrEqualTo()"), - Pair(IS_LESS_THAN_INT, "hasSizeLessThan()") + IS_GREATER_THAN_INT to "hasSizeGreaterThan()", + IS_GREATER_THAN_OR_EQUAL_TO_INT to "hasSizeGreaterThanOrEqualTo()", + IS_LESS_THAN_OR_EQUAL_TO_INT to "hasSizeLessThanOrEqualTo()", + IS_LESS_THAN_INT to "hasSizeLessThan()" ).find { it.first.test(expectedCallExpression) }?.second if (matchedMethod != null) { registerSizeMethod(holder, expression, expectedCallExpression, matchedMethod) @@ -89,11 +90,8 @@ class AssertThatSizeInspection : AbstractAssertJInspection() { val originalMethod = getOriginalMethodName(expectedCallExpression) ?: return val description = REPLACE_DESCRIPTION_TEMPLATE.format(originalMethod, replacementMethod) val message = MORE_CONCISE_MESSAGE_TEMPLATE.format(replacementMethod, originalMethod) - holder.registerProblem( - expression, - message, - ReplaceSizeMethodCallQuickFix(description, replacementMethod, noExpectedExpression, expectedIsCollection) - ) + val quickfix = ReplaceSizeMethodCallQuickFix(description, replacementMethod, noExpectedExpression, expectedIsCollection) + holder.registerProblem(expression, message, quickfix) } } } diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt index 78c49cb..78a280e 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt @@ -142,11 +142,8 @@ class JUnitAssertToAssertJInspection : AbstractJUnitAssertInspection() { val originalMethod = getOriginalMethodName(expression) ?: return val description = REPLACE_DESCRIPTION_TEMPLATE.format(originalMethod, replacementMethod) val message = CONVERT_MESSAGE_TEMPLATE.format(originalMethod) - holder.registerProblem( - expression, - message, - ReplaceJUnitAssertMethodCallQuickFix(description, hasExpected, replacementMethod) - ) + val quickFix = ReplaceJUnitAssertMethodCallQuickFix(description, hasExpected, replacementMethod) + holder.registerProblem(expression, message, quickFix) } private fun registerDeltaReplacementMethod( @@ -157,11 +154,8 @@ class JUnitAssertToAssertJInspection : AbstractJUnitAssertInspection() { val originalMethod = getOriginalMethodName(expression) ?: return val description = REPLACE_DESCRIPTION_TEMPLATE.format(originalMethod, replacementMethod) val message = CONVERT_MESSAGE_TEMPLATE.format(originalMethod) - holder.registerProblem( - expression, - message, - ReplaceJUnitDeltaAssertMethodCallQuickFix(description, replacementMethod) - ) + val quickFix = ReplaceJUnitDeltaAssertMethodCallQuickFix(description, replacementMethod) + holder.registerProblem(expression, message, quickFix) } private class Mapping( diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitAssertMethodCallQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitAssertMethodCallQuickFix.kt index bcc4440..c3c6b48 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitAssertMethodCallQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitAssertMethodCallQuickFix.kt @@ -6,13 +6,14 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.codeStyle.JavaCodeStyleManager +import de.platon42.intellij.plugins.cajon.firstArg +import de.platon42.intellij.plugins.cajon.replaceQualifier class ReplaceJUnitAssertMethodCallQuickFix(description: String, private val hasExpected: Boolean, private val replacementMethod: String) : AbstractCommonQuickFix(description) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.startElement - val factory = JavaPsiFacade.getElementFactory(element.project) val methodCallExpression = element as? PsiMethodCallExpression ?: return val args = methodCallExpression.argumentList val count = args.expressionCount @@ -20,31 +21,32 @@ class ReplaceJUnitAssertMethodCallQuickFix(description: String, private val hasE val (expectedExpression, messageExpression) = if (hasExpected) { val expected = args.expressions[count - 2] ?: return val message = if (count > 2) args.expressions[0] else null - Pair(expected, message) + expected to message } else { val message = if (count > 1) args.expressions[0] else null - Pair(null, message) + null to message } + val factory = JavaPsiFacade.getElementFactory(element.project) val expectedMethodCall = factory.createExpressionFromText( "a.${if (hasExpected) replacementMethod.replace("()", "(e)") else replacementMethod}", element ) as PsiMethodCallExpression if (hasExpected) { - expectedMethodCall.argumentList.expressions[0].replace(expectedExpression!!) + expectedMethodCall.firstArg.replace(expectedExpression!!) } val newMethodCall = factory.createExpressionFromText( "org.assertj.core.api.Assertions.assertThat(a)", element ) as PsiMethodCallExpression - newMethodCall.argumentList.expressions[0].replace(actualExpression) + newMethodCall.firstArg.replace(actualExpression) if (messageExpression != null) { val asExpression = factory.createExpressionFromText("a.as(desc)", element) as PsiMethodCallExpression - asExpression.argumentList.expressions[0].replace(messageExpression) - asExpression.methodExpression.qualifierExpression!!.replace(newMethodCall) - expectedMethodCall.methodExpression.qualifierExpression!!.replace(asExpression) + asExpression.firstArg.replace(messageExpression) + asExpression.replaceQualifier(newMethodCall) + expectedMethodCall.replaceQualifier(asExpression) } else { - expectedMethodCall.methodExpression.qualifierExpression!!.replace(newMethodCall) + expectedMethodCall.replaceQualifier(newMethodCall) } val assertThatMethod = newMethodCall.resolveMethod() ?: return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitDeltaAssertMethodCallQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitDeltaAssertMethodCallQuickFix.kt index 1c1d308..050bdf5 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitDeltaAssertMethodCallQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceJUnitDeltaAssertMethodCallQuickFix.kt @@ -6,12 +6,14 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.codeStyle.JavaCodeStyleManager +import de.platon42.intellij.plugins.cajon.firstArg +import de.platon42.intellij.plugins.cajon.getArg +import de.platon42.intellij.plugins.cajon.replaceQualifier class ReplaceJUnitDeltaAssertMethodCallQuickFix(description: String, private val replacementMethod: String) : AbstractCommonQuickFix(description) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.startElement - val factory = JavaPsiFacade.getElementFactory(element.project) val methodCallExpression = element as? PsiMethodCallExpression ?: return val args = methodCallExpression.argumentList val count = args.expressionCount @@ -20,31 +22,32 @@ class ReplaceJUnitDeltaAssertMethodCallQuickFix(description: String, private val val expectedExpression = args.expressions[count - 3] ?: return val deltaExpression = args.expressions[count - 1] ?: return + val factory = JavaPsiFacade.getElementFactory(element.project) val offsetMethodCall = factory.createExpressionFromText( "org.assertj.core.data.Offset.offset(c)", element ) as PsiMethodCallExpression - offsetMethodCall.argumentList.expressions[0].replace(deltaExpression) + offsetMethodCall.firstArg.replace(deltaExpression) val expectedMethodCall = factory.createExpressionFromText( "a.${replacementMethod.removeSuffix("()")}(e, offs)", element ) as PsiMethodCallExpression - expectedMethodCall.argumentList.expressions[0].replace(expectedExpression) - expectedMethodCall.argumentList.expressions[1].replace(offsetMethodCall) + expectedMethodCall.firstArg.replace(expectedExpression) + expectedMethodCall.getArg(1).replace(offsetMethodCall) val newMethodCall = factory.createExpressionFromText( "org.assertj.core.api.Assertions.assertThat(a)", element ) as PsiMethodCallExpression - newMethodCall.argumentList.expressions[0].replace(actualExpression) + newMethodCall.firstArg.replace(actualExpression) if (messageExpression != null) { val asExpression = factory.createExpressionFromText("a.as(desc)", element) as PsiMethodCallExpression - asExpression.argumentList.expressions[0].replace(messageExpression) - asExpression.methodExpression.qualifierExpression!!.replace(newMethodCall) - expectedMethodCall.methodExpression.qualifierExpression!!.replace(asExpression) + asExpression.firstArg.replace(messageExpression) + asExpression.replaceQualifier(newMethodCall) + expectedMethodCall.replaceQualifier(asExpression) } else { - expectedMethodCall.methodExpression.qualifierExpression!!.replace(newMethodCall) + expectedMethodCall.replaceQualifier(newMethodCall) } val assertThatMethod = newMethodCall.resolveMethod() ?: return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSimpleMethodCallQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSimpleMethodCallQuickFix.kt index 880564b..7bb7ebc 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSimpleMethodCallQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSimpleMethodCallQuickFix.kt @@ -4,17 +4,18 @@ import com.intellij.codeInspection.ProblemDescriptor import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiMethodCallExpression +import de.platon42.intellij.plugins.cajon.replaceQualifierFromMethodCall class ReplaceSimpleMethodCallQuickFix(description: String, private val replacementMethod: String) : AbstractCommonQuickFix(description) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.startElement - val factory = JavaPsiFacade.getElementFactory(element.project) val methodCallExpression = element as? PsiMethodCallExpression ?: return - val oldQualifier = methodCallExpression.methodExpression.qualifierExpression ?: return + + val factory = JavaPsiFacade.getElementFactory(element.project) val expectedExpression = factory.createExpressionFromText("a.$replacementMethod", element) as PsiMethodCallExpression - expectedExpression.methodExpression.qualifierExpression!!.replace(oldQualifier) + expectedExpression.replaceQualifierFromMethodCall(methodCallExpression) element.replace(expectedExpression) } } \ No newline at end of file diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSizeMethodCallQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSizeMethodCallQuickFix.kt index 8014b36..590df21 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSizeMethodCallQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/ReplaceSizeMethodCallQuickFix.kt @@ -4,6 +4,9 @@ import com.intellij.codeInspection.ProblemDescriptor import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil +import de.platon42.intellij.plugins.cajon.firstArg +import de.platon42.intellij.plugins.cajon.qualifierExpression +import de.platon42.intellij.plugins.cajon.replaceQualifierFromMethodCall class ReplaceSizeMethodCallQuickFix( description: String, @@ -14,21 +17,22 @@ class ReplaceSizeMethodCallQuickFix( override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.startElement - val factory = JavaPsiFacade.getElementFactory(element.project) val methodCallExpression = element as? PsiMethodCallExpression ?: return - val assertExpression = methodCallExpression.argumentList.expressions[0] ?: return + val assertExpression = methodCallExpression.firstArg replaceCollectionSizeOrArrayLength(assertExpression) val statement = PsiTreeUtil.getParentOfType(element, PsiStatement::class.java) ?: return val oldExpectedExpression = PsiTreeUtil.findChildOfType(statement, PsiMethodCallExpression::class.java) ?: return + + val factory = JavaPsiFacade.getElementFactory(element.project) val expectedExpression = factory.createExpressionFromText("a.${if (noExpectedExpression) replacementMethod else replacementMethod.replace("()", "(e)")}", element) as PsiMethodCallExpression if (!noExpectedExpression) { if (expectedIsCollection) { - replaceCollectionSizeOrArrayLength(oldExpectedExpression.argumentList.expressions[0]) + replaceCollectionSizeOrArrayLength(oldExpectedExpression.firstArg) } - expectedExpression.argumentList.expressions[0].replace(oldExpectedExpression.argumentList.expressions[0]) + expectedExpression.firstArg.replace(oldExpectedExpression.firstArg) } - expectedExpression.methodExpression.qualifierExpression!!.replace(oldExpectedExpression.methodExpression.qualifierExpression!!) + expectedExpression.replaceQualifierFromMethodCall(oldExpectedExpression) oldExpectedExpression.replace(expectedExpression) } @@ -36,7 +40,7 @@ class ReplaceSizeMethodCallQuickFix( assertExpression.replace( when (assertExpression) { is PsiReferenceExpression -> assertExpression.qualifierExpression!! - is PsiMethodCallExpression -> assertExpression.methodExpression.qualifierExpression!! + is PsiMethodCallExpression -> assertExpression.qualifierExpression else -> return } ) diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitBinaryExpressionMethodCallQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitBinaryExpressionMethodCallQuickFix.kt index 02e7b7e..1d37ed9 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitBinaryExpressionMethodCallQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitBinaryExpressionMethodCallQuickFix.kt @@ -7,6 +7,8 @@ import com.intellij.psi.PsiBinaryExpression import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.PsiStatement import com.intellij.psi.util.PsiTreeUtil +import de.platon42.intellij.plugins.cajon.firstArg +import de.platon42.intellij.plugins.cajon.replaceQualifierFromMethodCall class SplitBinaryExpressionMethodCallQuickFix( description: String, @@ -17,20 +19,21 @@ class SplitBinaryExpressionMethodCallQuickFix( override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.startElement - val factory = JavaPsiFacade.getElementFactory(element.project) val methodCallExpression = element as? PsiMethodCallExpression ?: return - val binaryExpression = methodCallExpression.argumentList.expressions[0] as? PsiBinaryExpression ?: return + val binaryExpression = methodCallExpression.firstArg as? PsiBinaryExpression ?: return val expectedArgument = (if (pickRightOperand) binaryExpression.lOperand else binaryExpression.rOperand)?.copy() ?: return binaryExpression.replace(if (pickRightOperand) binaryExpression.rOperand!! else binaryExpression.lOperand) val statement = PsiTreeUtil.getParentOfType(element, PsiStatement::class.java) ?: return val oldExpectedExpression = PsiTreeUtil.findChildOfType(statement, PsiMethodCallExpression::class.java) ?: return + + val factory = JavaPsiFacade.getElementFactory(element.project) val expectedExpression = factory.createExpressionFromText("a.${if (noExpectedExpression) replacementMethod else replacementMethod.replace("()", "(e)")}", element) as PsiMethodCallExpression if (!noExpectedExpression) { - expectedExpression.argumentList.expressions[0].replace(expectedArgument) + expectedExpression.firstArg.replace(expectedArgument) } - expectedExpression.methodExpression.qualifierExpression!!.replace(oldExpectedExpression.methodExpression.qualifierExpression!!) + expectedExpression.replaceQualifierFromMethodCall(oldExpectedExpression) oldExpectedExpression.replace(expectedExpression) } } \ No newline at end of file diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitEqualsExpressionMethodCallQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitEqualsExpressionMethodCallQuickFix.kt index 737b4c1..92b71ef 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitEqualsExpressionMethodCallQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/SplitEqualsExpressionMethodCallQuickFix.kt @@ -6,23 +6,27 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.PsiStatement import com.intellij.psi.util.PsiTreeUtil +import de.platon42.intellij.plugins.cajon.firstArg +import de.platon42.intellij.plugins.cajon.qualifierExpression +import de.platon42.intellij.plugins.cajon.replaceQualifierFromMethodCall class SplitEqualsExpressionMethodCallQuickFix(description: String, private val replacementMethod: String) : AbstractCommonQuickFix(description) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.startElement - val factory = JavaPsiFacade.getElementFactory(element.project) val methodCallExpression = element as? PsiMethodCallExpression ?: return - val equalsMethodCall = methodCallExpression.argumentList.expressions[0] as? PsiMethodCallExpression ?: return - val expectedArgument = equalsMethodCall.argumentList.expressions[0].copy() - equalsMethodCall.replace(equalsMethodCall.methodExpression.qualifierExpression!!) + val equalsMethodCall = methodCallExpression.firstArg as? PsiMethodCallExpression ?: return + val expectedArgument = equalsMethodCall.firstArg.copy() + equalsMethodCall.replace(equalsMethodCall.qualifierExpression) val statement = PsiTreeUtil.getParentOfType(element, PsiStatement::class.java) ?: return val oldExpectedExpression = PsiTreeUtil.findChildOfType(statement, PsiMethodCallExpression::class.java) ?: return + + val factory = JavaPsiFacade.getElementFactory(element.project) val expectedExpression = factory.createExpressionFromText("a.${replacementMethod.replace("()", "(e)")}", element) as PsiMethodCallExpression - expectedExpression.argumentList.expressions[0].replace(expectedArgument) - expectedExpression.methodExpression.qualifierExpression!!.replace(oldExpectedExpression.methodExpression.qualifierExpression!!) + expectedExpression.firstArg.replace(expectedArgument) + expectedExpression.replaceQualifierFromMethodCall(oldExpectedExpression) oldExpectedExpression.replace(expectedExpression) } } \ No newline at end of file