diff --git a/README.md b/README.md index 0ddab9f..18188d2 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,8 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the ``` from: assertThat(expected).someCondition(); assertThat(expected).anotherCondition(); - to: assertThat(expected).someCondition().anotherCondition(); + to: assertThat(expected).someCondition() + .anotherCondition(); ``` Joining will work on actual expressions inside ```assertThat()``` that are equivalent expressions, except for method calls with known side-effect methods such as ```Iterator.next()``` and @@ -87,6 +88,9 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the The comments of the statements will be preserved. When using ```extracting()``` or similar, the statements will not be merged. + + The behavior regarding the insertion of line breaks between the expressions can be configured in the + inspection settings. - AssertThatObjectIsNullOrNotNull @@ -516,6 +520,10 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo ## Changelog +#### V1.2 (23-Jun-19) +- Due to popular demand the JoinAssertThatStatements inspection will now add line breaks on joining statements. + The amount of statements joined without causing line breaks can be configured but defaults to 1 (always). + #### V1.1 (09-Jun-19) - Improved JoinAssertThatStatements detection of expressions with side-effects and added pre/post-increment/decrement detection. - Added Guava Optional ```opt.orNull() == null``` case. You know, I'm not making this stuff up, people actually write this kind of code. diff --git a/build.gradle b/build.gradle index e9c106f..07a8f5d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ plugins { id 'java' id 'org.jetbrains.intellij' version '0.4.9' - id 'org.jetbrains.kotlin.jvm' version '1.3.31' + id 'org.jetbrains.kotlin.jvm' version '1.3.40' id 'jacoco' id 'com.github.kt3k.coveralls' version '2.8.2' } group 'de.platon42' -version '1.1' +version '1.2' repositories { mavenCentral() @@ -22,8 +22,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" testCompile "org.assertj:assertj-core:3.12.2" testCompile "org.assertj:assertj-guava:3.2.1" - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.0-RC1' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.0-RC1' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.0-RC2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.0-RC2' testImplementation "org.jetbrains.kotlin:kotlin-test" // testImplementation "org.jetbrains.kotlin:kotlin-test-junit" } @@ -35,23 +35,17 @@ compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } intellij { - version '2019.1.2' + version '2019.1.3' // pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)' updateSinceUntilBuild false } patchPluginXml { changeNotes """ -
Full changelog available at Github project site.
""" @@ -65,7 +59,7 @@ test { } jacoco { - toolVersion = '0.8.3' + toolVersion = '0.8.4' } jacocoTestReport { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ad9423e..e3dc04d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt b/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt index a566ed8..059a09b 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/Extensions.kt @@ -144,9 +144,7 @@ fun PsiExpression.getAllTheSameExpectedBooleanConstants(): Boolean? { for (methodCall in methodsToView) { val expectedResult = methodCall.getExpectedBooleanResult() if (expectedResult != null) { - if ((lockedResult != null) && (lockedResult != expectedResult)) { - return null - } + if ((lockedResult != null) && (lockedResult != expectedResult)) return null lockedResult = expectedResult } else { val isNotConstant = CallMatcher.anyOf( @@ -157,9 +155,7 @@ fun PsiExpression.getAllTheSameExpectedBooleanConstants(): Boolean? { AbstractAssertJInspection.IS_NOT_EQUAL_TO_BOOLEAN, AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT ).test(methodCall) - if (isNotConstant) { - return null - } + if (isNotConstant) return null } } return lockedResult @@ -173,9 +169,7 @@ fun PsiExpression.getAllTheSameNullNotNullConstants(): Boolean? { for (methodCall in methodsToView) { val expectedResult = methodCall.getExpectedNullNonNullResult() if (expectedResult != null) { - if ((lockedResult != null) && (lockedResult != expectedResult)) { - return null - } + if ((lockedResult != null) && (lockedResult != expectedResult)) return null lockedResult = expectedResult } else { val isNotConstant = CallMatcher.anyOf( @@ -184,9 +178,7 @@ fun PsiExpression.getAllTheSameNullNotNullConstants(): Boolean? { AbstractAssertJInspection.IS_EQUAL_TO_OBJECT, AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT ).test(methodCall) - if (isNotConstant) { - return null - } + if (isNotConstant) return null } } return lockedResult diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionInspection.kt index a87ff20..5bfab13 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBinaryExpressionInspection.kt @@ -21,13 +21,9 @@ class AssertThatBinaryExpressionInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return val expectedCallExpression = statement.findOutmostMethodCall() ?: return val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return @@ -39,9 +35,9 @@ class AssertThatBinaryExpressionInspection : AbstractAssertJInspection() { val bothTypes = listOf(leftType, rightType) val (isLeftNull, isRightNull) = bothTypes.map(TypeConversionUtil::isNullType) - if (isLeftNull && isRightNull) { - return - } else if (isLeftNull || isRightNull) { + + if (isLeftNull && isRightNull) return + if (isLeftNull || isRightNull) { val replacementMethod = expectedResult.map(MethodNames.IS_NULL, MethodNames.IS_NOT_NULL) registerSplitMethod(holder, expectedCallExpression, replacementMethod) { desc, method -> SplitBinaryExpressionMethodCallQuickFix(desc, method, pickRightOperand = isLeftNull, noExpectedExpression = true) diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanConditionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanConditionInspection.kt index 38e5759..442e551 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanConditionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatBooleanConditionInspection.kt @@ -20,24 +20,17 @@ class AssertThatBooleanConditionInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return 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 - } + if (matchingCalls.none { it }) return + if (!checkAssertedType(expression, ABSTRACT_BOOLEAN_ASSERT_CLASSNAME)) return val expectedExpression = expression.firstArg - if (!TypeConversionUtil.isBooleanType(expectedExpression.type)) { - return - } + if (!TypeConversionUtil.isBooleanType(expectedExpression.type)) return + val expectedResult = expression.calculateConstantParameterValue(0) as? Boolean ?: return val flippedBooleanTest = matchingCalls.drop(2).any { it } diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatCollectionOrMapExpressionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatCollectionOrMapExpressionInspection.kt index 36207d1..6bf13e6 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatCollectionOrMapExpressionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatCollectionOrMapExpressionInspection.kt @@ -44,13 +44,10 @@ class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection( return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return + val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val mapping = MAPPINGS.firstOrNull { it.callMatcher.test(assertThatArgument) } ?: return 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 dc86576..1842204 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 @@ -21,13 +21,9 @@ class AssertThatEnumerableIsEmptyInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return val isLastExpression = expression.parent is PsiStatement - if (!(HAS_SIZE.test(expression) && isLastExpression)) { - return - } + if (!(HAS_SIZE.test(expression) && isLastExpression)) return val value = expression.calculateConstantParameterValue(0) ?: return if (value == 0) { diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatGuavaOptionalInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatGuavaOptionalInspection.kt index 3c541ce..84e376d 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatGuavaOptionalInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatGuavaOptionalInspection.kt @@ -21,16 +21,12 @@ class AssertThatGuavaOptionalInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!checkPreconditions(staticMethodCall)) { - return - } - val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return + if (!checkPreconditions(staticMethodCall)) return + val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val outmostMethodCall = statement.findOutmostMethodCall() ?: return if (GUAVA_OPTIONAL_GET.test(actualExpression)) { val expectedCallExpression = staticMethodCall.gatherAssertionCalls().singleOrNull() ?: return @@ -65,13 +61,10 @@ class AssertThatGuavaOptionalInspection : AbstractAssertJInspection() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return val staticMethodCall = expression.findStaticMethodCall() ?: return - if (!checkPreconditions(staticMethodCall)) { - return - } + if (!checkPreconditions(staticMethodCall)) return + // We're not calling an assertThat() from Guava, but a core-AssertJ one! // We need to replace that by the Guava one, if we want to apply a formally correct fix. if (IS_EQUAL_TO_OBJECT.test(expression)) { diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInstanceOfInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInstanceOfInspection.kt index ce3d533..fb0adb6 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInstanceOfInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInstanceOfInspection.kt @@ -20,13 +20,9 @@ class AssertThatInstanceOfInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return val expectedCallExpression = statement.findOutmostMethodCall() ?: return val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInvertedBooleanConditionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInvertedBooleanConditionInspection.kt index 0dba5b5..39b86d7 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInvertedBooleanConditionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatInvertedBooleanConditionInspection.kt @@ -18,13 +18,9 @@ class AssertThatInvertedBooleanConditionInspection : AbstractAssertJInspection() return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return val staticMethodCall = expression.findStaticMethodCall() ?: return - if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return expression.getExpectedBooleanResult() ?: return val prefixExpression = staticMethodCall.firstArg as? PsiPrefixExpression ?: return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatJava8OptionalInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatJava8OptionalInspection.kt index d662d59..a4644f9 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatJava8OptionalInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatJava8OptionalInspection.kt @@ -20,15 +20,11 @@ class AssertThatJava8OptionalInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!ASSERT_THAT_ANY.test(staticMethodCall)) { - return - } - val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return + if (!ASSERT_THAT_ANY.test(staticMethodCall)) return + val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val outmostMethodCall = statement.findOutmostMethodCall() ?: return if (OPTIONAL_GET.test(actualExpression)) { val expectedCallExpression = staticMethodCall.gatherAssertionCalls().singleOrNull() ?: return @@ -58,13 +54,9 @@ class AssertThatJava8OptionalInspection : AbstractAssertJInspection() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return val staticMethodCall = expression.findStaticMethodCall() ?: return - if (!ASSERT_THAT_JAVA8_OPTIONAL.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_JAVA8_OPTIONAL.test(staticMethodCall)) return if (IS_EQUAL_TO_OBJECT.test(expression)) { val innerExpectedCall = expression.firstArg as? PsiMethodCallExpression ?: return if (CallMatcher.anyOf(OPTIONAL_OF, OPTIONAL_OF_NULLABLE).test(innerExpectedCall)) { diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectExpressionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectExpressionInspection.kt index a6b3737..b93a5a7 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectExpressionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatObjectExpressionInspection.kt @@ -24,9 +24,7 @@ class AssertThatObjectExpressionInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: 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 301ac74..0606859 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 @@ -19,15 +19,11 @@ class AssertThatObjectIsNullOrNotNullInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return val isNotEqualTo = IS_NOT_EQUAL_TO_OBJECT.test(expression) val isEqualTo = IS_EQUAL_TO_OBJECT.test(expression) val isLastExpression = expression.parent is PsiStatement - if (!((isEqualTo && isLastExpression) || isNotEqualTo)) { - return - } + if (!((isEqualTo && isLastExpression) || isNotEqualTo)) return if (expression.firstArg.type == PsiType.NULL) { registerSimplifyMethod(holder, expression, isEqualTo.map(MethodNames.IS_NULL, MethodNames.IS_NOT_NULL)) 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 e2756c3..0ba11e6 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 @@ -74,19 +74,15 @@ class AssertThatSizeInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!ASSERT_THAT_INT.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_INT.test(staticMethodCall)) return + val actualExpression = staticMethodCall.firstArg val isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression) val isForString = isCharSequenceLength(actualExpression) - if (!(isForArrayOrCollection || isForString)) { - return - } + if (!(isForArrayOrCollection || isForString)) return + val matches = staticMethodCall.collectMethodCallsUpToStatement() .mapNotNull { getMatch(it, isForArrayOrCollection, isForString) } .toList() @@ -112,21 +108,16 @@ class AssertThatSizeInspection : AbstractAssertJInspection() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } - if (!HAS_SIZE.test(expression)) { - return - } + if (!expression.hasAssertThat()) return + if (!HAS_SIZE.test(expression)) return val actualExpression = expression.firstArg val isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression) val isForString = isCharSequenceLength(actualExpression) if (!(isForArrayOrCollection || (isForString && checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME))) - ) { - return - } + ) return + registerConciseMethod( REMOVE_SIZE_DESCRIPTION_TEMPLATE, holder, diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringExpressionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringExpressionInspection.kt index ea761f0..0a75609 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringExpressionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringExpressionInspection.kt @@ -48,13 +48,10 @@ class AssertThatStringExpressionInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitExpressionStatement(statement: PsiExpressionStatement) { super.visitExpressionStatement(statement) - if (!statement.hasAssertThat()) { - return - } + if (!statement.hasAssertThat()) return val staticMethodCall = statement.findStaticMethodCall() ?: return - if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { - return - } + if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return + val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val mapping = MAPPINGS.firstOrNull { it.callMatcher.test(assertThatArgument) } ?: return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringIsEmptyInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringIsEmptyInspection.kt index 2f67226..ae55a7f 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringIsEmptyInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatStringIsEmptyInspection.kt @@ -22,19 +22,13 @@ class AssertThatStringIsEmptyInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return val isEqual = IS_EQUAL_TO_OBJECT.test(expression) val hasSize = HAS_SIZE.test(expression) val isLastExpression = expression.parent is PsiStatement - if (!((isEqual || hasSize) && isLastExpression)) { - return - } + if (!((isEqual || hasSize) && isLastExpression)) return - if (!checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME)) { - return - } + if (!checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME)) return val value = expression.calculateConstantParameterValue(0) ?: return if ((isEqual && (value == "")) || (hasSize && (value == 0))) { diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssumeThatInsteadOfReturnInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssumeThatInsteadOfReturnInspection.kt index 81117f3..7ad5db5 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssumeThatInsteadOfReturnInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssumeThatInsteadOfReturnInspection.kt @@ -54,9 +54,7 @@ class AssumeThatInsteadOfReturnInspection : AbstractAssertJInspection() { super.visitMethod(method) // Note: replace with if(TEST_ANNOTATIONS.none(method::hasAnnotation)) for IDEA >= 2018.2 val annotations = method.annotations.mapNotNull { it.qualifiedName } - if (annotations.none(TEST_ANNOTATIONS::contains)) { - return - } + if (annotations.none(TEST_ANNOTATIONS::contains)) return val containingClass = method.containingClass ?: return val visitor: PsiElementVisitor = TestMethodVisitor(holder, isOnTheFly, containingClass) method.accept(visitor) @@ -119,9 +117,7 @@ class AssumeThatInsteadOfReturnInspection : AbstractAssertJInspection() { var aborted = false override fun visitExpressionStatement(statement: PsiExpressionStatement) { - if (foundAssertThat || aborted) { - return - } + if (foundAssertThat || aborted) return if (++statementCount > MAX_STATEMENTS_COUNT) { aborted = true return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/ImplicitAssertionInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/ImplicitAssertionInspection.kt index d25aac0..c4f6fdb 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/ImplicitAssertionInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/ImplicitAssertionInspection.kt @@ -113,9 +113,8 @@ class ImplicitAssertionInspection : AbstractAssertJInspection() { return object : JavaElementVisitor() { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { super.visitMethodCallExpression(expression) - if (!expression.hasAssertThat()) { - return - } + if (!expression.hasAssertThat()) return + val mapping = MAPPINGS.firstOrNull { it.first.test(expression) } ?: return val followupExpression = expression.findFluentCallTo(mapping.second) ?: return val redundantName = getOriginalMethodName(expression) ?: return diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JoinAssertThatStatementsInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JoinAssertThatStatementsInspection.kt index 7468c88..6105284 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JoinAssertThatStatementsInspection.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JoinAssertThatStatementsInspection.kt @@ -2,19 +2,25 @@ package de.platon42.intellij.plugins.cajon.inspections import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder +import com.intellij.codeInspection.ui.SingleIntegerFieldOptionsPanel import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil import com.siyeh.ig.psiutils.EquivalenceChecker import de.platon42.intellij.plugins.cajon.* import de.platon42.intellij.plugins.cajon.quickfixes.JoinStatementsQuickFix +import javax.swing.JComponent class JoinAssertThatStatementsInspection : AbstractAssertJInspection() { companion object { private const val DISPLAY_NAME = "Join multiple assertThat() statements with same actual expression" private const val CAN_BE_JOINED_DESCRIPTION = "Multiple assertThat() statements can be joined together" + private const val DEFAULT_SEPARATE_LINE_LIMIT = 1 } + @JvmField + var separateLineLimit: Int = DEFAULT_SEPARATE_LINE_LIMIT + override fun getDisplayName() = DISPLAY_NAME override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { @@ -63,9 +69,8 @@ class JoinAssertThatStatementsInspection : AbstractAssertJInspection() { private fun isLegitAssertThatCall(statement: PsiStatement?): PsiMethodCallExpression? { if ((statement is PsiExpressionStatement) && (statement.expression is PsiMethodCallExpression)) { - if (!statement.hasAssertThat()) { - return null - } + if (!statement.hasAssertThat()) return null + val assertThatCall = PsiTreeUtil.findChildrenOfType(statement, PsiMethodCallExpression::class.java).find { ALL_ASSERT_THAT_MATCHERS.test(it) } return assertThatCall?.takeIf { it.findFluentCallTo(EXTRACTING_CALL_MATCHERS) == null } } @@ -93,6 +98,10 @@ class JoinAssertThatStatementsInspection : AbstractAssertJInspection() { } } + override fun createOptionsPanel(): JComponent { + return SingleIntegerFieldOptionsPanel("Limit for joins before adding line breaks:", this, "separateLineLimit") + } + private fun registerProblem(holder: ProblemsHolder, isOnTheFly: Boolean, firstStatement: PsiStatement, lastStatement: PsiStatement) { val problemDescriptor = holder.manager.createProblemDescriptor( firstStatement, @@ -100,7 +109,7 @@ class JoinAssertThatStatementsInspection : AbstractAssertJInspection() { CAN_BE_JOINED_DESCRIPTION, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly, - JoinStatementsQuickFix() + JoinStatementsQuickFix(separateLineLimit) ) holder.registerProblem(problemDescriptor) } diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/JoinStatementsQuickFix.kt b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/JoinStatementsQuickFix.kt index e1a2891..db7a2fb 100644 --- a/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/JoinStatementsQuickFix.kt +++ b/src/main/java/de/platon42/intellij/plugins/cajon/quickfixes/JoinStatementsQuickFix.kt @@ -7,7 +7,7 @@ import com.intellij.psi.util.PsiTreeUtil import de.platon42.intellij.plugins.cajon.findStaticMethodCall import de.platon42.intellij.plugins.cajon.shortenAndReformat -class JoinStatementsQuickFix : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) { +class JoinStatementsQuickFix(private val separateLineLimit: Int) : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) { companion object { private const val JOIN_STATEMENTS_MESSAGE = "Join assertThat() statements" @@ -16,6 +16,10 @@ class JoinStatementsQuickFix : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val firstStatement = descriptor.startElement as PsiExpressionStatement val lastStatement = descriptor.endElement as PsiExpressionStatement + + val expressionCount = countExpressions(firstStatement, lastStatement) + val addLineBreaks = (expressionCount > separateLineLimit) + do { val commentsToKeep = ArrayList
+ Full documentation here...
]]>
-