FIR LC: populate JvmStatic accessors from companion
This commit is contained in:
committed by
Ilya Kirillov
parent
63fb00fa21
commit
a7a01a1f7e
+26
-3
@@ -12,14 +12,15 @@ import com.intellij.psi.search.SearchScope
|
|||||||
import com.intellij.psi.stubs.IStubElementType
|
import com.intellij.psi.stubs.IStubElementType
|
||||||
import com.intellij.psi.stubs.StubElement
|
import com.intellij.psi.stubs.StubElement
|
||||||
import org.jetbrains.annotations.NonNls
|
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.getOutermostClassOrObject
|
||||||
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightField
|
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.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.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.light.classes.symbol.classes.getOrCreateFirLightClass
|
||||||
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
||||||
import org.jetbrains.kotlin.psi.KtClassBody
|
import org.jetbrains.kotlin.psi.KtClassBody
|
||||||
@@ -84,6 +85,28 @@ internal abstract class FirLightClassForClassOrObjectSymbol(
|
|||||||
override fun isWritable() = false
|
override fun isWritable() = false
|
||||||
override val kotlinOrigin: KtClassOrObject? = classOrObjectSymbol.psi as? KtClassOrObject
|
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>) {
|
protected fun addCompanionObjectFieldIfNeeded(result: MutableList<KtLightField>) {
|
||||||
classOrObjectSymbol.companionObject?.run {
|
classOrObjectSymbol.companionObject?.run {
|
||||||
result.add(
|
result.add(
|
||||||
|
|||||||
-11
@@ -126,17 +126,6 @@ internal open class FirLightClassForSymbol(
|
|||||||
result
|
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>) {
|
private fun addMethodsFromDataClass(result: MutableList<KtLightMethod>) {
|
||||||
if (!classOrObjectSymbol.isData) return
|
if (!classOrObjectSymbol.isData) return
|
||||||
|
|
||||||
|
|||||||
+2
@@ -48,6 +48,8 @@ internal open class FirLightInterfaceClassSymbol(
|
|||||||
createMethods(visibleDeclarations, result)
|
createMethods(visibleDeclarations, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addMethodsFromCompanionIfNeeded(result)
|
||||||
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -251,6 +251,7 @@ internal fun FirLightClassBase.createPropertyAccessors(
|
|||||||
declaration: KtPropertySymbol,
|
declaration: KtPropertySymbol,
|
||||||
isTopLevel: Boolean,
|
isTopLevel: Boolean,
|
||||||
isMutable: Boolean = !declaration.isVal,
|
isMutable: Boolean = !declaration.isVal,
|
||||||
|
onlyJvmStatic: Boolean = false,
|
||||||
) {
|
) {
|
||||||
if (declaration is KtKotlinPropertySymbol && declaration.isConst) return
|
if (declaration is KtKotlinPropertySymbol && declaration.isConst) return
|
||||||
|
|
||||||
@@ -262,6 +263,7 @@ internal fun FirLightClassBase.createPropertyAccessors(
|
|||||||
if (declaration.hasJvmFieldAnnotation()) return
|
if (declaration.hasJvmFieldAnnotation()) return
|
||||||
|
|
||||||
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
|
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
|
||||||
|
if (onlyJvmStatic && !hasJvmStaticAnnotation(siteTarget) && !declaration.hasJvmStaticAnnotation()) return false
|
||||||
if (declaration.hasReifiedParameters) return false
|
if (declaration.hasReifiedParameters) return false
|
||||||
if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false
|
if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false
|
||||||
if (declaration.isHiddenOrSynthetic(project, siteTarget)) return false
|
if (declaration.isHiddenOrSynthetic(project, siteTarget)) return false
|
||||||
|
|||||||
@@ -15,8 +15,13 @@ public final class C /* C*/ {
|
|||||||
@kotlin.jvm.JvmStatic()
|
@kotlin.jvm.JvmStatic()
|
||||||
public static final void foo();// foo()
|
public static final void foo();// foo()
|
||||||
|
|
||||||
|
@org.jetbrains.annotations.NotNull()
|
||||||
|
public final java.lang.String getX();// getX()
|
||||||
|
|
||||||
public C();// .ctor()
|
public C();// .ctor()
|
||||||
|
|
||||||
|
public final void setX(@org.jetbrains.annotations.NotNull() java.lang.String);// setX(java.lang.String)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Companion ...
|
class Companion ...
|
||||||
|
|||||||
Reference in New Issue
Block a user