diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt index a1ea27ce9ff..bddbc135cc2 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt @@ -12,14 +12,15 @@ import com.intellij.psi.search.SearchScope import com.intellij.psi.stubs.IStubElementType import com.intellij.psi.stubs.StubElement import org.jetbrains.annotations.NonNls -import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightField -import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind +import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.light.classes.symbol.classes.createInnerClasses +import org.jetbrains.kotlin.light.classes.symbol.classes.createMethods +import org.jetbrains.kotlin.light.classes.symbol.classes.createPropertyAccessors import org.jetbrains.kotlin.light.classes.symbol.classes.getOrCreateFirLightClass import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.psi.KtClassBody @@ -84,6 +85,28 @@ internal abstract class FirLightClassForClassOrObjectSymbol( override fun isWritable() = false override val kotlinOrigin: KtClassOrObject? = classOrObjectSymbol.psi as? KtClassOrObject + protected fun addMethodsFromCompanionIfNeeded(result: MutableList) { + classOrObjectSymbol.companionObject?.run { + analyzeWithSymbolAsContext(this) { + val methods = getDeclaredMemberScope().getCallableSymbols() + .filterIsInstance() + .filter { it.hasJvmStaticAnnotation() } + createMethods(methods, result) + + val properties = getDeclaredMemberScope().getCallableSymbols() + .filterIsInstance() + properties.forEach { property -> + createPropertyAccessors( + result, + property, + isTopLevel = false, + onlyJvmStatic = true + ) + } + } + } + } + protected fun addCompanionObjectFieldIfNeeded(result: MutableList) { classOrObjectSymbol.companionObject?.run { result.add( diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt index b3766fc59cf..d1f3434813b 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt @@ -126,17 +126,6 @@ internal open class FirLightClassForSymbol( result } - private fun addMethodsFromCompanionIfNeeded(result: MutableList) { - classOrObjectSymbol.companionObject?.run { - analyzeWithSymbolAsContext(this) { - val methods = getDeclaredMemberScope().getCallableSymbols() - .filterIsInstance() - .filter { it.hasJvmStaticAnnotation() } - createMethods(methods, result) - } - } - } - private fun addMethodsFromDataClass(result: MutableList) { if (!classOrObjectSymbol.isData) return diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt index 101eb8682e0..7098b188eca 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt @@ -48,6 +48,8 @@ internal open class FirLightInterfaceClassSymbol( createMethods(visibleDeclarations, result) } + addMethodsFromCompanionIfNeeded(result) + result } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt index 1b0752c0a75..e4e0628861a 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt @@ -251,6 +251,7 @@ internal fun FirLightClassBase.createPropertyAccessors( declaration: KtPropertySymbol, isTopLevel: Boolean, isMutable: Boolean = !declaration.isVal, + onlyJvmStatic: Boolean = false, ) { if (declaration is KtKotlinPropertySymbol && declaration.isConst) return @@ -262,6 +263,7 @@ internal fun FirLightClassBase.createPropertyAccessors( if (declaration.hasJvmFieldAnnotation()) return fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean { + if (onlyJvmStatic && !hasJvmStaticAnnotation(siteTarget) && !declaration.hasJvmStaticAnnotation()) return false if (declaration.hasReifiedParameters) return false if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false if (declaration.isHiddenOrSynthetic(project, siteTarget)) return false diff --git a/compiler/testData/asJava/ultraLightClasses/objects.fir.java b/compiler/testData/asJava/ultraLightClasses/objects.fir.java index 9ef5c97251a..0058a78615c 100644 --- a/compiler/testData/asJava/ultraLightClasses/objects.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/objects.fir.java @@ -15,8 +15,13 @@ public final class C /* C*/ { @kotlin.jvm.JvmStatic() public static final void foo();// foo() + @org.jetbrains.annotations.NotNull() + public final java.lang.String getX();// getX() + public C();// .ctor() + public final void setX(@org.jetbrains.annotations.NotNull() java.lang.String);// setX(java.lang.String) + class Companion ...