FIR LC: populate fields from companion in interface

This commit is contained in:
Jinseong Jeon
2022-05-17 10:26:25 -07:00
committed by Ilya Kirillov
parent 0212e9daae
commit 89d1a6bc0f
4 changed files with 27 additions and 21 deletions
@@ -12,10 +12,12 @@ 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.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.light.classes.symbol.classes.createInnerClasses
import org.jetbrains.kotlin.light.classes.symbol.classes.getOrCreateFirLightClass
@@ -94,6 +96,27 @@ internal abstract class FirLightClassForClassOrObjectSymbol(
}
}
protected fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
classOrObjectSymbol.companionObject?.run {
analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>()
.filter { it.hasJvmFieldAnnotation() || it.hasJvmStaticAnnotation() || it is KtKotlinPropertySymbol && it.isConst }
.mapTo(result) {
FirLightFieldForPropertySymbol(
propertySymbol = it,
fieldName = it.name.asString(),
containingClass = this@FirLightClassForClassOrObjectSymbol,
lightMemberOrigin = null,
isTopLevel = false,
forceStatic = !it.hasJvmStaticAnnotation(),
takePropertyVisibility = true
)
}
}
}
}
private val _containingFile: PsiFile? by lazyPub {
val kotlinOrigin = kotlinOrigin ?: return@lazyPub null
@@ -241,27 +241,6 @@ internal open class FirLightClassForSymbol(
result
}
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
classOrObjectSymbol.companionObject?.run {
analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>()
.filter { it.hasJvmFieldAnnotation() || it.hasJvmStaticAnnotation() || it is KtKotlinPropertySymbol && it.isConst }
.mapTo(result) {
FirLightFieldForPropertySymbol(
propertySymbol = it,
fieldName = it.name.asString(),
containingClass = this@FirLightClassForSymbol,
lightMemberOrigin = null,
isTopLevel = false,
forceStatic = !it.hasJvmStaticAnnotation(),
takePropertyVisibility = true
)
}
}
}
}
private fun addPropertyBackingFields(result: MutableList<KtLightField>) {
analyzeWithSymbolAsContext(classOrObjectSymbol) {
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
@@ -31,6 +31,7 @@ internal open class FirLightInterfaceClassSymbol(
private val _ownFields: List<KtLightField> by lazyPub {
mutableListOf<KtLightField>().also {
addCompanionObjectFieldIfNeeded(it)
addFieldsFromCompanionIfNeeded(it)
}
}
@@ -2,6 +2,9 @@ public abstract interface TraitClassObjectField /* TraitClassObjectField*/ {
@org.jetbrains.annotations.NotNull()
public static final TraitClassObjectField.Companion Companion;
@org.jetbrains.annotations.Nullable()
public static final java.lang.String x = "" /* initializer type: java.lang.String */;
public static final class Companion /* TraitClassObjectField.Companion*/ {
@org.jetbrains.annotations.Nullable()