Initial check-in with two inspections working.
This commit is contained in:
+23
@@ -0,0 +1,23 @@
|
||||
package de.platon42.intellij.plugins.cajon.inspections
|
||||
|
||||
import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool
|
||||
import com.intellij.psi.CommonClassNames
|
||||
import com.siyeh.ig.callMatcher.CallMatcher
|
||||
|
||||
open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
|
||||
|
||||
companion object {
|
||||
private const val ABSTRACT_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractAssert"
|
||||
private const val IS_EQUAL_TO = "isEqualTo"
|
||||
private const val IS_NOT_EQUAL_TO = "isNotEqualTo"
|
||||
|
||||
val IS_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ABSTRACT_ASSERT_CLASSNAME, IS_EQUAL_TO)
|
||||
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
|
||||
val IS_NOT_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ABSTRACT_ASSERT_CLASSNAME, IS_NOT_EQUAL_TO)
|
||||
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
|
||||
}
|
||||
|
||||
override fun getGroupDisplayName(): String {
|
||||
return "AssertJ"
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
package de.platon42.intellij.plugins.cajon.inspections
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix
|
||||
import com.intellij.codeInspection.ProblemDescriptor
|
||||
import com.intellij.codeInspection.ProblemHighlightType
|
||||
import com.intellij.codeInspection.ProblemsHolder
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.annotations.NonNls
|
||||
|
||||
class AssertThatObjectIsNotNullInspection : AbstractAssertJInspection() {
|
||||
|
||||
companion object {
|
||||
@NonNls
|
||||
private val DISPLAY_NAME = "Comparing to non-null"
|
||||
|
||||
@NonNls
|
||||
private val INSPECTION_MESSAGE = "isNotEqualTo(null) can be simplified to isNotNull()"
|
||||
|
||||
@NonNls
|
||||
private val QUICKFIX_DESCRIPTION = "Replace isNotEqualTo(null) with isNotNull()"
|
||||
}
|
||||
|
||||
override fun getDisplayName() = DISPLAY_NAME
|
||||
|
||||
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
|
||||
return object : JavaElementVisitor() {
|
||||
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
|
||||
super.visitMethodCallExpression(expression)
|
||||
if (!IS_NOT_EQUAL_TO_OBJECT.test(expression)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (expression.argumentList.expressions[0].type == PsiType.NULL) {
|
||||
holder.registerProblem(
|
||||
expression,
|
||||
INSPECTION_MESSAGE,
|
||||
ProblemHighlightType.INFORMATION,
|
||||
null as TextRange?,
|
||||
ReplaceWithIsNotNullQuickFix()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ReplaceWithIsNotNullQuickFix : LocalQuickFix {
|
||||
override fun getFamilyName() = QUICKFIX_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 isNotNullExpression =
|
||||
factory.createExpressionFromText("a.isNotNull()", null) as PsiMethodCallExpression
|
||||
isNotNullExpression.methodExpression.qualifierExpression!!.replace(oldQualifier)
|
||||
element.replace(isNotNullExpression)
|
||||
}
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
package de.platon42.intellij.plugins.cajon.inspections
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix
|
||||
import com.intellij.codeInspection.ProblemDescriptor
|
||||
import com.intellij.codeInspection.ProblemHighlightType
|
||||
import com.intellij.codeInspection.ProblemsHolder
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.annotations.NonNls
|
||||
|
||||
class AssertThatObjectIsNullInspection : AbstractAssertJInspection() {
|
||||
|
||||
companion object {
|
||||
@NonNls
|
||||
private val DISPLAY_NAME = "Comparing to null"
|
||||
|
||||
@NonNls
|
||||
private val INSPECTION_MESSAGE = "isEqualTo(null) can be simplified to isNull()"
|
||||
|
||||
@NonNls
|
||||
private val QUICKFIX_DESCRIPTION = "Replace isEqualTo(null) with isNull()"
|
||||
}
|
||||
|
||||
override fun getDisplayName() = DISPLAY_NAME
|
||||
|
||||
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
|
||||
return object : JavaElementVisitor() {
|
||||
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
|
||||
super.visitMethodCallExpression(expression)
|
||||
if (!IS_EQUAL_TO_OBJECT.test(expression)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (expression.argumentList.expressions[0].type == PsiType.NULL) {
|
||||
holder.registerProblem(
|
||||
expression,
|
||||
INSPECTION_MESSAGE,
|
||||
ProblemHighlightType.INFORMATION,
|
||||
null as TextRange?,
|
||||
ReplaceWithIsNullQuickFix()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ReplaceWithIsNullQuickFix : LocalQuickFix {
|
||||
override fun getFamilyName() = QUICKFIX_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 isNullExpression =
|
||||
factory.createExpressionFromText("a.isNull()", null) as PsiMethodCallExpression
|
||||
isNullExpression.methodExpression.qualifierExpression!!.replace(oldQualifier)
|
||||
element.replace(isNullExpression)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<idea-plugin>
|
||||
<id>de.platon42.cajon</id>
|
||||
<name>Concise AssertJ Optimizing Nitpicker (Cajon)</name>
|
||||
<vendor email="chrisly@platon42.de" url="http://platon42.de">Platon Computer Products</vendor>
|
||||
|
||||
<description><![CDATA[
|
||||
This plugin will add inspections and quick fixes to fully make use of the AssertJ methods
|
||||
to make the intention clear and concise.
|
||||
]]></description>
|
||||
|
||||
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
|
||||
<idea-version since-build="182.0"/>
|
||||
|
||||
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
|
||||
on how to target different products -->
|
||||
<depends>com.intellij.modules.lang</depends>
|
||||
<depends>com.intellij.modules.platform</depends>
|
||||
<depends>com.intellij.modules.java</depends>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<localInspection groupPath="Java" shortName="AssertThatObjectIsNull" enabledByDefault="true" level="WARNING"
|
||||
implementationClass="de.platon42.intellij.plugins.cajon.inspections.AssertThatObjectIsNullInspection"/>
|
||||
<localInspection groupPath="Java" shortName="AssertThatObjectIsNotNull" enabledByDefault="true" level="WARNING"
|
||||
implementationClass="de.platon42.intellij.plugins.cajon.inspections.AssertThatObjectIsNotNullInspection"/>
|
||||
</extensions>
|
||||
|
||||
<actions>
|
||||
</actions>
|
||||
</idea-plugin>
|
||||
@@ -0,0 +1,6 @@
|
||||
<html>
|
||||
<body>
|
||||
Turns assertThat(object).isNotEqualTo(null) into assertThat(object).isNotNull().
|
||||
<!-- tooltip end -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,6 @@
|
||||
<html>
|
||||
<body>
|
||||
Turns assertThat(object).isEqualTo(null) into assertThat(object).isNull().
|
||||
<!-- tooltip end -->
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user