SpringKotlinAutowiringInspection: getting rid of SpringJavaInjectionPointsAutowiringInspection

This commit is contained in:
Nicolay Mitropolsky
2017-10-27 18:41:09 +03:00
committed by Nikolay Krasko
parent bef100b46e
commit 3a06b8fe3b
@@ -16,7 +16,8 @@ import com.intellij.spring.CommonSpringModel
import com.intellij.spring.SpringBundle
import com.intellij.spring.model.SpringBeanPointer
import com.intellij.spring.model.converters.SpringConverterUtil
import com.intellij.spring.model.highlighting.autowire.SpringJavaInjectionPointsAutowiringInspection
import com.intellij.spring.model.highlighting.autowire.SpringJavaConstructorAutowiringInspection
import com.intellij.spring.model.highlighting.autowire.SpringUastInjectionPointsAutowiringInspection
import com.intellij.spring.model.utils.SpringAutowireUtil
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -28,6 +29,10 @@ import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
import org.jetbrains.kotlin.idea.inspections.registerWithElementsUnwrapped
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.utils.SmartList
import org.jetbrains.uast.UClass
import org.jetbrains.uast.UDeclaration
import org.jetbrains.uast.toUElementOfType
class SpringKotlinAutowiringInspection : AbstractKotlinInspection() {
// Based on SpringJavaInjectionPointsAutowiringInspection.AddSpringBeanQualifierFix
@@ -86,7 +91,8 @@ class SpringKotlinAutowiringInspection : AbstractKotlinInspection() {
}
}
private val javaInspection by lazy { SpringJavaInjectionPointsAutowiringInspection() }
private val uastInspection by lazy { SpringUastInjectionPointsAutowiringInspection() }
private val nonUastInspection by lazy { SpringJavaConstructorAutowiringInspection() }
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean) = object : KtVisitorVoid() {
// TODO: SpringJavaInjectionPointsAutowiringInspection.checkAutowiredMethod() is not accessible here
@@ -95,7 +101,9 @@ class SpringKotlinAutowiringInspection : AbstractKotlinInspection() {
when {
resourceAnnotation != null -> {
val propertyType = PropertyUtil.getPropertyType(psiMethod) ?: return
SpringJavaInjectionPointsAutowiringInspection.checkInjectionPoint(psiMethod, propertyType, holder, springModel, required)
psiMethod.toUElementOfType<UDeclaration>()?.let { uMethod ->
SpringUastInjectionPointsAutowiringInspection.checkInjectionPoint(uMethod, propertyType, holder, springModel, required)
}
}
psiMethod.parameterList.parametersCount == 0 &&
SpringAutowireUtil.isAutowiredByAnnotation(psiMethod) -> {
@@ -107,7 +115,9 @@ class SpringKotlinAutowiringInspection : AbstractKotlinInspection() {
else -> {
for (parameter in psiMethod.parameterList.parameters) {
if (AnnotationUtil.isAnnotated(parameter, "org.springframework.beans.factory.annotation.Value", true)) continue
SpringJavaInjectionPointsAutowiringInspection.checkInjectionPoint(parameter, parameter.type, holder, springModel, required)
parameter.toUElementOfType<UDeclaration>()?.let { uParameter ->
SpringUastInjectionPointsAutowiringInspection.checkInjectionPoint(uParameter, parameter.type, holder, springModel, required)
}
}
}
}
@@ -153,12 +163,19 @@ class SpringKotlinAutowiringInspection : AbstractKotlinInspection() {
private fun PsiField.processLightField() {
if (!SpringAutowireUtil.isAutowiredByAnnotation(this)) return
processLightMember { holder, model, required ->
SpringJavaInjectionPointsAutowiringInspection.checkInjectionPoint(this, type, holder, model, required)
this.toUElementOfType<UDeclaration>()?.let { uDeclaration ->
SpringUastInjectionPointsAutowiringInspection.checkInjectionPoint(uDeclaration, type, holder, model, required)
}
}
}
private fun PsiClass.processLightClass() {
javaInspection.checkClass(this, holder.manager, isOnTheFly)?.registerAdjustedProblems()
val reports = SmartList<ProblemDescriptor>()
this.toUElementOfType<UClass>()?.let { uClass ->
uastInspection.checkClass(uClass, holder.manager, isOnTheFly)?.let { reports.addAll(it) }
}
nonUastInspection.checkClass(this, holder.manager, isOnTheFly)?.let { reports.addAll(it) }
reports.toTypedArray().registerAdjustedProblems()
}
override fun visitNamedFunction(function: KtNamedFunction) {