[FIR IDE] Make annotations and extension receiver lazy
This commit is contained in:
+1
-1
@@ -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!!
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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?
|
||||
|
||||
+6
-2
@@ -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
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -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,
|
||||
|
||||
+50
-5
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-4
@@ -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 ->
|
||||
|
||||
+5
-4
@@ -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 }
|
||||
|
||||
+2
-3
@@ -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?
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
+2
-4
@@ -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) }
|
||||
}
|
||||
}
|
||||
+4
-9
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-4
@@ -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> {
|
||||
|
||||
+4
-10
@@ -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?
|
||||
|
||||
+2
-5
@@ -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> {
|
||||
|
||||
+2
-5
@@ -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())
|
||||
|
||||
+3
-4
@@ -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> {
|
||||
|
||||
+4
-10
@@ -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?
|
||||
|
||||
+40
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
-33
@@ -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)
|
||||
}
|
||||
+1
-1
@@ -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(", ")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user