diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt index 11e416e5a48..8d8a62bec70 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.load.java.structure.impl +import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiClass import com.intellij.psi.PsiTypeParameter import org.jetbrains.kotlin.asJava.KtLightClassMarker @@ -63,22 +64,31 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) override val supertypes: Collection get() = classifierTypes(psi.superTypes) - override // We apply distinct here because PsiClass#getMethods() can return duplicate PSI methods, for example in Lombok (see KT-11778) + override val methods: Collection + get() { + assertNotLightClass() + // We apply distinct here because PsiClass#getMethods() can return duplicate PSI methods, for example in Lombok (see KT-11778) // Return type seems to be null for example for the 'clone' Groovy method generated by @AutoClone (see EA-73795) - val methods: Collection - get() = methods(psi.methods.filter { method -> !method.isConstructor && method.returnType != null }).distinct() + return methods(psi.methods.filter { method -> !method.isConstructor && method.returnType != null }).distinct() + } - override // ex. Android plugin generates LightFields for resources started from '.' (.DS_Store file etc) - val fields: Collection - get() = fields(psi.fields.filter { field -> - val name = field.name - name != null && Name.isValidIdentifier(name) - }) + override val fields: Collection + get() { + assertNotLightClass() + return fields(psi.fields.filter { field -> + val name = field.name + // ex. Android plugin generates LightFields for resources started from '.' (.DS_Store file etc) + name != null && Name.isValidIdentifier(name) + }) + } - override // See for example org.jetbrains.plugins.scala.lang.psi.light.ScFunctionWrapper, + override val constructors: Collection + get() { + assertNotLightClass() + // See for example org.jetbrains.plugins.scala.lang.psi.light.ScFunctionWrapper, // which is present in getConstructors(), but its isConstructor() returns false - val constructors: Collection - get() = constructors(psi.constructors.filter { method -> method.isConstructor }) + return constructors(psi.constructors.filter { method -> method.isConstructor }) + } override val isAbstract: Boolean get() = JavaElementUtil.isAbstract(this) @@ -93,7 +103,19 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) get() = JavaElementUtil.getVisibility(this) override val lightClassOriginKind: LightClassOriginKind? - get() = (psi as? KtLightClassMarker)?.originKind + get() = (psi as? KtLightClassMarker)?.originKind override fun getAnnotationOwnerPsi() = psi.modifierList + + private fun assertNotLightClass() { + val psiClass = psi + if (psiClass !is KtLightClassMarker) return + + val message = "Querying members of JavaClass created for $psiClass of type ${psiClass.javaClass} defined in file ${psiClass.containingFile?.virtualFile?.canonicalPath}" + LOGGER.error(message) + } + + companion object { + private val LOGGER = Logger.getInstance(JavaClassImpl::class.java) + } }