diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt index 9c21a75b77c..df7d68466cd 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt @@ -47,7 +47,7 @@ internal class FirLightAnnotationClassSymbol( .filterNot { it is KtFunctionSymbol && it.visibility == KtSymbolVisibility.PRIVATE } .filterNot { it is KtConstructorSymbol } - createMethods(visibleDeclarations, isTopLevel = false, result) + createMethods(visibleDeclarations, result) } result diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt index 7144e063f74..06b0995479b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnonymousClassForSymbol.kt @@ -60,7 +60,7 @@ internal class FirLightAnonymousClassForSymbol( analyzeWithSymbolAsContext(anonymousObjectSymbol) { val callableSymbols = anonymousObjectSymbol.getDeclaredMemberScope().getCallableSymbols() - createMethods(callableSymbols, isTopLevel = false, result) + createMethods(callableSymbols, result) } result diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt index afe0fe15cf4..97648a2cd1a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt @@ -128,7 +128,7 @@ internal class FirLightClassForEnumEntry( analyzeWithSymbolAsContext(enumEntrySymbol) { val callableSymbols = enumEntrySymbol.getDeclaredMemberScope().getCallableSymbols() - createMethods(callableSymbols, isTopLevel = false, result) + createMethods(callableSymbols, result) } return result diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt index a73ad96e8bc..081fa3f7f8b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt @@ -82,7 +82,7 @@ class FirLightClassForFacade( } } - createMethods(symbols.asSequence(), isTopLevel = true, result) + createMethods(symbols.asSequence(), result, isTopLevel = true) } private val _ownMethods: List by lazyPub { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt index 9ba4f8a9fbc..ec7b25a4f6d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.idea.asJava import com.intellij.psi.* +import org.jetbrains.kotlin.asJava.builder.memberIndex +import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_DEFAULT_CTOR import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightField @@ -100,7 +102,8 @@ internal open class FirLightClassForSymbol( } } - createMethods(visibleDeclarations, isTopLevel = false, result) + val suppressStatic = classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT + createMethods(visibleDeclarations, result, suppressStaticForMethods = suppressStatic) } if (result.none { it.isConstructor }) { @@ -116,6 +119,8 @@ internal open class FirLightClassForSymbol( } } + addMethodsFromCompanionIfNeeded(result) + result } @@ -140,6 +145,17 @@ internal open class FirLightClassForSymbol( } } + private fun addMethodsFromCompanionIfNeeded(result: MutableList) { + classOrObjectSymbol.companionObject?.run { + analyzeWithSymbolAsContext(this) { + val methods = getDeclaredMemberScope().getCallableSymbols() + .filterIsInstance() + .filter { it.hasJvmStaticAnnotation() } + createMethods(methods, result) + } + } + } + private fun addInstanceFieldIfNeeded(result: MutableList) { val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt index 34797721b82..2bdd005b60e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt @@ -43,7 +43,7 @@ internal class FirLightInterfaceClassSymbol( val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() .filterNot { it is KtFunctionSymbol && it.visibility == KtSymbolVisibility.PRIVATE } - createMethods(visibleDeclarations, isTopLevel = false, result) + createMethods(visibleDeclarations, result) } result diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index d8207fd284c..a3cfb594314 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -98,10 +98,10 @@ private fun lightClassForEnumEntry(ktEnumEntry: KtEnumEntry): KtLightClass? { internal fun FirLightClassBase.createMethods( declarations: Sequence, - isTopLevel: Boolean, - result: MutableList + result: MutableList, + isTopLevel: Boolean = false, + suppressStaticForMethods: Boolean = false ) { - var methodIndex = METHOD_INDEX_BASE for (declaration in declarations) { if (declaration is KtFunctionSymbol && declaration.isInline) continue @@ -112,13 +112,15 @@ internal fun FirLightClassBase.createMethods( when (declaration) { is KtFunctionSymbol -> { + var methodIndex = METHOD_INDEX_BASE result.add( FirLightSimpleMethodForSymbol( functionSymbol = declaration, lightMemberOrigin = null, containingClass = this@createMethods, isTopLevel = isTopLevel, - methodIndex = methodIndex++ + methodIndex = methodIndex, + suppressStatic = suppressStaticForMethods ) ) @@ -150,7 +152,7 @@ internal fun FirLightClassBase.createMethods( constructorSymbol = declaration, lightMemberOrigin = null, containingClass = this@createMethods, - methodIndex++ + methodIndex = METHOD_INDEX_BASE ) ) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt index 6b3caeeb277..9282450897e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt @@ -139,6 +139,7 @@ internal class FirLightAccessorMethodForSymbol( override fun equals(other: Any?): Boolean = this === other || (other is FirLightAccessorMethodForSymbol && + isGetter == other.isGetter && kotlinOrigin == other.kotlinOrigin && propertyAccessorSymbol == other.propertyAccessorSymbol) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt index 814a7c631a8..f511a5089f4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt @@ -22,13 +22,14 @@ internal class FirLightSimpleMethodForSymbol( containingClass: FirLightClassBase, methodIndex: Int, isTopLevel: Boolean, - argumentsSkipMask: BitSet? = null + argumentsSkipMask: BitSet? = null, + suppressStatic: Boolean = false ) : FirLightMethodForSymbol( functionSymbol = functionSymbol, lightMemberOrigin = lightMemberOrigin, containingClass = containingClass, methodIndex = methodIndex, - argumentsSkipMask = argumentsSkipMask + argumentsSkipMask = argumentsSkipMask, ) { private val _name: String by lazyPub { @@ -96,7 +97,7 @@ internal class FirLightSimpleMethodForSymbol( modifiers.add(_visibility) - if (functionSymbol.hasJvmStaticAnnotation()) { + if (!suppressStatic && functionSymbol.hasJvmStaticAnnotation()) { modifiers.add(PsiModifier.STATIC) } if (functionSymbol.hasAnnotation("kotlin/jvm/Strictfp", null)) {