[FIR IDE] Make annotations and extension receiver lazy

This commit is contained in:
Igor Yakovlev
2020-12-16 16:21:00 +03:00
parent 9c2d06cf70
commit 9670f67912
20 changed files with 141 additions and 113 deletions
@@ -62,7 +62,7 @@ object DebugSymbolRenderer {
is KtNamedConstantValue -> "${renderValue(value.name)} = ${renderValue(value.expression)}"
is KtAnnotationCall ->
"${renderValue(value.classId)}${value.arguments.joinToString(prefix = "(", postfix = ")") { renderValue(it) }}"
is ReceiverTypeAndAnnotations -> "${renderValue(value.annotations)} ${renderValue(value.type)}"
is KtTypeAndAnnotations -> "${renderValue(value.annotations)} ${renderValue(value.type)}"
else -> value::class.simpleName!!
}
@@ -6,11 +6,12 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols.markers
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtCallElement
abstract class KtAnnotationCall {
abstract class KtAnnotationCall : ValidityTokenOwner {
abstract val classId: ClassId?
abstract val useSiteTarget: AnnotationUseSiteTarget?
abstract val psi: KtCallElement?
@@ -5,13 +5,17 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols.markers
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
data class ReceiverTypeAndAnnotations(val type: KtType, val annotations: List<KtAnnotationCall>)
abstract class KtTypeAndAnnotations : ValidityTokenOwner {
abstract val type: KtType
abstract val annotations: List<KtAnnotationCall>
}
interface KtPossibleExtensionSymbol {
val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations?
val receiverType: KtTypeAndAnnotations?
val isExtension: Boolean
}
@@ -14,13 +14,13 @@ import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.ReceiverTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtPossibleExtensionSymbol
import org.jetbrains.kotlin.psi.KtParameter
internal class FirLightParameterForReceiver private constructor(
private val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations,
private val receiverTypeAndAnnotations: KtTypeAndAnnotations,
private val context: KtSymbol,
methodName: String,
method: FirLightMethod
@@ -36,7 +36,7 @@ internal class FirLightParameterForReceiver private constructor(
if (callableSymbol !is KtPossibleExtensionSymbol) return null
if (!callableSymbol.isExtension) return null
val extensionTypeAndAnnotations = callableSymbol.receiverTypeAndAnnotations ?: return null
val extensionTypeAndAnnotations = callableSymbol.receiverType ?: return null
return FirLightParameterForReceiver(
receiverTypeAndAnnotations = extensionTypeAndAnnotations,
@@ -6,13 +6,58 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.mapAnnotationParameters
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtCallElement
class KtFirAnnotationCall(
override val classId: ClassId,
override val useSiteTarget: AnnotationUseSiteTarget?,
override val psi: KtCallElement?,
override val arguments: List<KtNamedConstantValue>
) : KtAnnotationCall()
containingDeclaration: FirDeclaration,
annotationCall: FirAnnotationCall,
resolveState: FirModuleResolveState,
override val token: ValidityToken,
) : KtAnnotationCall() {
private val containingDeclarationRef = firRef(containingDeclaration, resolveState)
private val annotationCallRef by weakRef(annotationCall)
override val psi: KtCallElement? by containingDeclarationRef.withFirAndCache { fir ->
annotationCallRef.findPsi(fir.session) as? KtCallElement
}
private fun ConeClassLikeType.expandTypeAliasIfNeeded(session: FirSession): ConeClassLikeType {
val firTypeAlias = lookupTag.toSymbol(session) as? FirTypeAliasSymbol ?: return this
val expandedType = firTypeAlias.fir.expandedTypeRef.coneType
return expandedType.fullyExpandedType(session) as? ConeClassLikeType
?: return this
}
override val classId: ClassId? by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) {
val declaredCone = annotationCallRef.annotationTypeRef.coneType as? ConeClassLikeType
declaredCone?.expandTypeAliasIfNeeded(it.session)?.classId
}
override val useSiteTarget: AnnotationUseSiteTarget? get() = annotationCallRef.useSiteTarget
override val arguments: List<KtNamedConstantValue> by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) {
mapAnnotationParameters(annotationCallRef, it.session).map { (name, expression) ->
KtNamedConstantValue(name, expression.convertConstantExpression())
}
}
}
@@ -13,10 +13,8 @@ import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtAnonymousObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
@@ -35,8 +33,8 @@ internal class KtFirAnonymousObjectSymbol(
override val symbolKind: KtSymbolKind = KtSymbolKind.LOCAL
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) }
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val superTypes: List<KtType> by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir ->
@@ -13,9 +13,10 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirClassOrObjectInLibrarySymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolModality
@@ -45,8 +46,8 @@ internal class KtFirClassOrObjectSymbol(
override val visibility: KtSymbolVisibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val isInner: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isInner }
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirConstructorSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol
@@ -49,8 +48,8 @@ internal class KtFirConstructorSymbol(
override val visibility: KtSymbolVisibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val containingClassIdIfNonLocal: ClassId?
@@ -11,15 +11,15 @@ import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorParameterSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.name.Name
internal class KtFirConstructorValueParameterSymbol(
@@ -41,8 +41,8 @@ internal class KtFirConstructorValueParameterSymbol(
}
}
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val constructorParameterKind: KtConstructorParameterSymbolKind
@@ -7,12 +7,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
@@ -35,7 +33,7 @@ internal class KtFirFileSymbol(
TODO("Creating pointers for files from library is not supported yet")
}
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
}
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberFunctionSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
@@ -48,20 +47,16 @@ internal class KtFirFunctionSymbol(
}
}
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val isSuspend: Boolean get() = firRef.withFir { it.isSuspend }
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
override val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir ->
fir.receiverTypeRef?.let { typeRef ->
val type = builder.buildKtType(typeRef)
val annotations = typeRef.annotations.mapNotNull {
convertAnnotation(it, fir.session)
}
ReceiverTypeAndAnnotations(type, annotations)
KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder)
}
}
@@ -11,14 +11,13 @@ import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.name.Name
internal class KtFirFunctionValueParameterSymbol(
@@ -36,8 +35,8 @@ internal class KtFirFunctionValueParameterSymbol(
override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null }
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override fun createPointer(): KtSymbolPointer<KtFunctionParameterSymbol> {
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtKotlinPropertySymbol
@@ -48,13 +47,9 @@ internal class KtFirKotlinPropertySymbol(
override val name: Name get() = firRef.withFir { it.name }
override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { fir -> builder.buildKtType(fir.returnTypeRef) }
override val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir ->
fir.receiverTypeRef?.let { typeRef ->
val type = builder.buildKtType(typeRef)
val annotations = typeRef.annotations.mapNotNull {
convertAnnotation(it, fir.session)
}
ReceiverTypeAndAnnotations(type, annotations)
KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder)
}
}
@@ -71,9 +66,8 @@ internal class KtFirKotlinPropertySymbol(
override val visibility: KtSymbolVisibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val callableIdIfNonLocal: FqName?
@@ -8,14 +8,11 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
@@ -54,8 +51,8 @@ internal class KtFirPropertyGetterSymbol(
override val type: KtType by firRef.withFirAndCache { builder.buildKtType(it.returnTypeRef) }
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() }
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> {
@@ -8,12 +8,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySetterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSetterParameterSymbol
@@ -23,7 +21,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
internal class KtFirPropertySetterSymbol(
fir: FirPropertyAccessor,
@@ -45,8 +42,8 @@ internal class KtFirPropertySetterSymbol(
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() }
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir ->
builder.buildFirSetterParameter(fir.valueParameters.single())
@@ -11,14 +11,13 @@ import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSetterParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.name.Name
internal class KtFirSetterParameterSymbol(
@@ -37,8 +36,8 @@ internal class KtFirSetterParameterSymbol(
override val isVararg: Boolean = false
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override fun createPointer(): KtSymbolPointer<KtSetterParameterSymbol> {
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol
@@ -42,13 +41,9 @@ internal class KtFirSyntheticJavaPropertySymbol(
override val isVal: Boolean get() = firRef.withFir { it.isVal }
override val name: Name get() = firRef.withFir { it.name }
override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { fir -> builder.buildKtType(fir.returnTypeRef) }
override val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir ->
fir.receiverTypeRef?.let { typeRef ->
val type = builder.buildKtType(typeRef)
val annotations = typeRef.annotations.mapNotNull {
convertAnnotation(it, fir.session)
}
ReceiverTypeAndAnnotations(type, annotations)
KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder)
}
}
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
@@ -59,9 +54,8 @@ internal class KtFirSyntheticJavaPropertySymbol(
override val visibility: KtSymbolVisibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
convertAnnotation(it)
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache { fir ->
fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) }
}
override val callableIdIfNonLocal: FqName?
@@ -0,0 +1,40 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
internal class KtFirTypeAndAnnotations(
containingDeclaration: FirDeclaration,
receiverTypeRef: FirTypeRef,
resolveState: FirModuleResolveState,
override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder
) : KtTypeAndAnnotations() {
private val containingDeclarationRef = firRef(containingDeclaration, resolveState)
private val receiverWeakTypeRef by weakRef(receiverTypeRef)
override val type: KtType by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) {
builder.buildKtType(receiverWeakTypeRef)
}
override val annotations: List<KtAnnotationCall> by containingDeclarationRef.withFirAndCache { fir ->
receiverWeakTypeRef.annotations.map {
KtFirAnnotationCall(fir, it, resolveState, token)
}
}
}
@@ -55,37 +55,4 @@ internal fun FirExpression.convertConstantExpression(): KtConstantValue =
when (this) {
is FirConstExpression<*> -> KtSimpleConstantValue(value)
else -> KtUnsupportedConstantValue
}
private fun ConeClassLikeType.expandTypeAliasIfNeeded(session: FirSession): ConeClassLikeType {
val firTypeAlias = lookupTag.toSymbol(session) as? FirTypeAliasSymbol ?: return this
val expandedType = firTypeAlias.fir.expandedTypeRef.coneType
return expandedType.fullyExpandedType(session) as? ConeClassLikeType
?: return this
}
internal fun convertAnnotation(
annotationCall: FirAnnotationCall,
session: FirSession
): KtFirAnnotationCall? {
val declaredCone = annotationCall.annotationTypeRef.coneType as? ConeClassLikeType ?: return null
val classId = declaredCone.expandTypeAliasIfNeeded(session).classId ?: return null
val resultList = mapAnnotationParameters(annotationCall, session).map {
KtNamedConstantValue(it.key, it.value.convertConstantExpression())
}
return KtFirAnnotationCall(
classId = classId,
useSiteTarget = annotationCall.useSiteTarget,
psi = annotationCall.psi as? KtCallElement,
arguments = resultList
)
}
internal fun convertAnnotation(declaration: FirAnnotatedDeclaration): List<KtFirAnnotationCall> =
declaration.annotations.mapNotNull {
convertAnnotation(it, declaration.session)
}
@@ -95,7 +95,7 @@ private fun KtCall.stringRepresentation(): String {
is KtFunctionLikeSymbol -> buildString {
append(if (this@stringValue is KtFunctionSymbol) callableIdIfNonLocal ?: name else "<constructor>")
append("(")
(this@stringValue as? KtFunctionSymbol)?.receiverTypeAndAnnotations?.let { receiver ->
(this@stringValue as? KtFunctionSymbol)?.receiverType?.let { receiver ->
append("<receiver>: ${receiver.type.render()}")
if (valueParameters.isNotEmpty()) append(", ")
}