FIR LC: populate JvmStatic accessors from companion

This commit is contained in:
Jinseong Jeon
2022-05-17 15:07:00 -07:00
committed by Ilya Kirillov
parent 63fb00fa21
commit a7a01a1f7e
5 changed files with 35 additions and 14 deletions
@@ -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<KtLightMethod>) {
classOrObjectSymbol.companionObject?.run {
analyzeWithSymbolAsContext(this) {
val methods = getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtFunctionSymbol>()
.filter { it.hasJvmStaticAnnotation() }
createMethods(methods, result)
val properties = getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>()
properties.forEach { property ->
createPropertyAccessors(
result,
property,
isTopLevel = false,
onlyJvmStatic = true
)
}
}
}
}
protected fun addCompanionObjectFieldIfNeeded(result: MutableList<KtLightField>) {
classOrObjectSymbol.companionObject?.run {
result.add(
@@ -126,17 +126,6 @@ internal open class FirLightClassForSymbol(
result
}
private fun addMethodsFromCompanionIfNeeded(result: MutableList<KtLightMethod>) {
classOrObjectSymbol.companionObject?.run {
analyzeWithSymbolAsContext(this) {
val methods = getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtFunctionSymbol>()
.filter { it.hasJvmStaticAnnotation() }
createMethods(methods, result)
}
}
}
private fun addMethodsFromDataClass(result: MutableList<KtLightMethod>) {
if (!classOrObjectSymbol.isData) return
@@ -48,6 +48,8 @@ internal open class FirLightInterfaceClassSymbol(
createMethods(visibleDeclarations, result)
}
addMethodsFromCompanionIfNeeded(result)
result
}
@@ -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
@@ -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 ...