diff --git a/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateAutowiredDependenciesUtils.kt b/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateAutowiredDependenciesUtils.kt index 9ad5bda1c72..dda0e19202c 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateAutowiredDependenciesUtils.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateAutowiredDependenciesUtils.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.editor.BatchTemplateRunner +import org.jetbrains.kotlin.idea.spring.effectiveBeanClasses import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject @@ -102,7 +103,7 @@ private fun createAutowiredDependency( candidateBean: SpringBeanPointer, model: CommonSpringModel ): BatchTemplateRunner? { - val candidateBeanClasses = candidateBean.effectiveBeanType.ifEmpty { return null } + val candidateBeanClasses = candidateBean.effectiveBeanClasses().ifEmpty { return null } if (!GenerateSpringBeanDependenciesUtil.ensureFileWritable(klass)) return null val property = createAutowiredProperty(klass, candidateBean, candidateBeanClasses, model) ?: return null return addCreatePropertyTemplate(property, candidateBean, candidateBeanClasses) diff --git a/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateDependenciesUtils.kt b/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateDependenciesUtils.kt index fd629853a80..38f188f402f 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateDependenciesUtils.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/generate/generateDependenciesUtils.kt @@ -61,6 +61,8 @@ import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.getOrCreateCompanionObject import org.jetbrains.kotlin.idea.editor.BatchTemplateRunner +import org.jetbrains.kotlin.idea.spring.beanClass +import org.jetbrains.kotlin.idea.spring.effectiveBeanClasses import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.load.java.propertyNameBySetMethodName @@ -132,7 +134,7 @@ private fun SpringBean.getFactoryFunctionName(factoryBeanClass: KtClass): String factoryMethod.stringValue?.let { if (!it.isBlank()) return it } val existingNames = factoryBeanClass.declarations.mapNotNull { if (it is KtFunction || it is KtClassOrObject) it.name else null } - return KotlinNameSuggester.suggestNameByName("create${beanClass!!.name}") { it !in existingNames } + return KotlinNameSuggester.suggestNameByName("create${beanClass()!!.name}") { it !in existingNames } } internal val PsiClass.defaultTypeText: String @@ -301,8 +303,8 @@ private fun createSetterDependency( injectionKind: SpringDependencyInjectionKind ): BatchTemplateRunner? { val templatesHolder = BatchTemplateRunner(currentBean.manager.project) - val currentBeanClass = currentBean.beanClass as? KtLightClass ?: return null - val candidateBeanClasses = dependency.effectiveBeanType.ifEmpty { return null } + val currentBeanClass = currentBean.beanClass() as? KtLightClass ?: return null + val candidateBeanClasses = dependency.effectiveBeanClasses().ifEmpty { return null } val setter = getOrCreateSetter(dependency, currentBeanClass, candidateBeanClasses, templatesHolder, injectionKind) ?: return null currentBean.addProperty().apply { name.ensureXmlElementExists() @@ -355,7 +357,7 @@ private fun createConstructorWithTemplate( dependency: SpringBeanPointer, templatesHolder: BatchTemplateRunner ) { - val beanClass = currentBean.beanClass as? KtLightClass ?: return + val beanClass = currentBean.beanClass() as? KtLightClass ?: return val ktBeanClass = beanClass.kotlinOrigin as? KtClass ?: return try { @@ -415,8 +417,8 @@ private fun createConstructorDependency( dependency: SpringBeanPointer ): BatchTemplateRunner? { val templatesHolder = BatchTemplateRunner(currentBean.manager.project) - val currentBeanClass = currentBean.beanClass as? KtLightClass ?: return null - val candidateBeanClasses = dependency.effectiveBeanType.ifEmpty { return null } + val currentBeanClass = currentBean.beanClass() as? KtLightClass ?: return null + val candidateBeanClasses = dependency.effectiveBeanClasses().ifEmpty { return null } var existedConstructor = findExistedConstructor(currentBean, currentBeanClass, candidateBeanClasses) if (existedConstructor == null) { if (!ensureFileWritable(currentBeanClass)) return null @@ -485,7 +487,7 @@ fun generateDependenciesFor( .firstOrNull { acceptBean(it, false) } ?.let { springBean -> if (!springBean.ensureFileWritable()) return emptyList() - if (springBean.beanClass == null) return emptyList() + if (springBean.beanClass() == null) return emptyList() val dependencies = chooseDependentBeans(getCandidates(springBean, isSetter), project, isSetter) return dependencies.mapNotNull { generateDependency(springBean, it, injectionKind) } } diff --git a/ultimate/src/org/jetbrains/kotlin/idea/spring/springUtils.kt b/ultimate/src/org/jetbrains/kotlin/idea/spring/springUtils.kt index fcf55b6b5b5..3c0c69433b7 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/spring/springUtils.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/springUtils.kt @@ -18,9 +18,12 @@ package org.jetbrains.kotlin.idea.spring import com.intellij.codeInsight.AnnotationUtil import com.intellij.openapi.module.ModuleUtilCore +import com.intellij.psi.PsiClassType import com.intellij.psi.PsiElement import com.intellij.psi.PsiModifierListOwner import com.intellij.spring.CommonSpringModel +import com.intellij.spring.model.CommonSpringBean +import com.intellij.spring.model.SpringBeanPointer import com.intellij.spring.model.jam.utils.JamAnnotationTypeUtil import com.intellij.spring.model.utils.SpringModelUtils @@ -33,4 +36,8 @@ internal fun PsiModifierListOwner.isAnnotatedWith(annotationFqName: String): Boo } internal val PsiElement.springModel: CommonSpringModel? - get() = SpringModelUtils.getInstance().getSpringModel(this) \ No newline at end of file + get() = SpringModelUtils.getInstance().getSpringModel(this) + +internal fun CommonSpringBean.beanClass() = (beanType as? PsiClassType)?.resolve() + +internal fun SpringBeanPointer<*>.effectiveBeanClasses() = effectiveBeanTypes.mapNotNull { (it as? PsiClassType)?.resolve() }.toTypedArray() \ No newline at end of file