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 86a685bb539..e74aba3b71b 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 @@ -19,7 +19,9 @@ package org.jetbrains.kotlin.load.java.structure.impl import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiClass +import com.intellij.psi.PsiMethod import com.intellij.psi.PsiTypeParameter +import com.intellij.psi.SyntheticElement import com.intellij.psi.search.SearchScope import org.jetbrains.kotlin.asJava.KtLightClassMarker import org.jetbrains.kotlin.descriptors.Visibility @@ -27,6 +29,7 @@ import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtPsiUtil +import org.jetbrains.kotlin.resolve.DescriptorUtils class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass), VirtualFileBoundJavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl { init { @@ -75,7 +78,11 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) 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) - return methods(psi.methods.filter { method -> !method.isConstructor && method.returnType != null }).distinct() + return methods( + psi.methods.filter { method -> + !method.isConstructor && method.returnType != null && !isSyntheticValuesOrValueOfMethod(method) + } + ).distinct() } override val fields: Collection @@ -117,6 +124,12 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) override fun getAnnotationOwnerPsi() = psi.modifierList + private fun isSyntheticValuesOrValueOfMethod(method: PsiMethod): Boolean { + if (!isEnum) return false + if (method !is SyntheticElement) return false + return DescriptorUtils.ENUM_VALUE_OF.asString() == method.name || DescriptorUtils.ENUM_VALUES.asString() == method.name + } + private fun assertNotLightClass() { val psiClass = psi if (psiClass !is KtLightClassMarker) return