FIR: Make possible to return variable symbols from scope

This commit is contained in:
Simon Ogorodnik
2019-03-06 18:04:02 +03:00
parent 02079bbeb5
commit 61eb19fbbf
16 changed files with 70 additions and 55 deletions
@@ -21,10 +21,7 @@ import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType
import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -54,7 +51,7 @@ class JavaClassEnhancementScope(
private val enhancements = mutableMapOf<ConeCallableSymbol, ConeCallableSymbol>() private val enhancements = mutableMapOf<ConeCallableSymbol, ConeCallableSymbol>()
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
useSiteScope.processPropertiesByName(name) process@{ original -> useSiteScope.processPropertiesByName(name) process@{ original ->
val field = enhancements.getOrPut(original) { enhance(original, name) } val field = enhancements.getOrPut(original) { enhance(original, name) }
@@ -75,7 +72,7 @@ class JavaClassEnhancementScope(
} }
private fun enhance( private fun enhance(
original: ConePropertySymbol, original: ConeVariableSymbol,
name: Name name: Name
): FirPropertySymbol { ): FirPropertySymbol {
val firField = (original as FirBasedSymbol<*>).fir as? FirJavaField ?: error("Can't make enhancement for $original") val firField = (original as FirBasedSymbol<*>).fir as? FirJavaField ?: error("Can't make enhancement for $original")
@@ -109,7 +106,7 @@ class JavaClassEnhancementScope(
): FirFunctionSymbol { ): FirFunctionSymbol {
val firMethod = (original as FirFunctionSymbol).fir as? FirFunction val firMethod = (original as FirFunctionSymbol).fir as? FirFunction
if (firMethod !is FirJavaMethod && firMethod !is FirJavaConstructor || firMethod !is FirCallableMember) return original if (firMethod !is FirJavaMethod && firMethod !is FirJavaConstructor || firMethod !is FirCallableMemberDeclaration) return original
val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firMethod.annotations) val memberContext = context.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, firMethod.annotations)
@@ -220,7 +217,7 @@ class JavaClassEnhancementScope(
private fun enhanceReceiverType( private fun enhanceReceiverType(
ownerFunction: FirJavaMethod, ownerFunction: FirJavaMethod,
overriddenMembers: List<FirCallableMember>, overriddenMembers: List<FirCallableMemberDeclaration>,
memberContext: FirJavaEnhancementContext memberContext: FirJavaEnhancementContext
): FirResolvedTypeRef { ): FirResolvedTypeRef {
val signatureParts = ownerFunction.partsForValueParameter( val signatureParts = ownerFunction.partsForValueParameter(
@@ -237,8 +234,8 @@ class JavaClassEnhancementScope(
private data class EnhanceValueParameterResult(val typeRef: FirResolvedTypeRef, val defaultValue: FirExpression?) private data class EnhanceValueParameterResult(val typeRef: FirResolvedTypeRef, val defaultValue: FirExpression?)
private fun enhanceValueParameter( private fun enhanceValueParameter(
ownerFunction: FirCallableMember, ownerFunction: FirCallableMemberDeclaration,
overriddenMembers: List<FirCallableMember>, overriddenMembers: List<FirCallableMemberDeclaration>,
hasReceiver: Boolean, hasReceiver: Boolean,
memberContext: FirJavaEnhancementContext, memberContext: FirJavaEnhancementContext,
predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?, predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?,
@@ -263,8 +260,8 @@ class JavaClassEnhancementScope(
} }
private fun enhanceReturnType( private fun enhanceReturnType(
owner: FirCallableMember, owner: FirCallableMemberDeclaration,
overriddenMembers: List<FirCallableMember>, overriddenMembers: List<FirCallableMemberDeclaration>,
memberContext: FirJavaEnhancementContext, memberContext: FirJavaEnhancementContext,
predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo? predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?
): FirResolvedTypeRef { ): FirResolvedTypeRef {
@@ -281,11 +278,11 @@ class JavaClassEnhancementScope(
return signatureParts.type return signatureParts.type
} }
private val overriddenMemberCache = mutableMapOf<FirCallableMember, List<FirCallableMember>>() private val overriddenMemberCache = mutableMapOf<FirCallableMemberDeclaration, List<FirCallableMemberDeclaration>>()
private fun FirCallableMember.overriddenMembers(): List<FirCallableMember> { private fun FirCallableMemberDeclaration.overriddenMembers(): List<FirCallableMemberDeclaration> {
return overriddenMemberCache.getOrPut(this) { return overriddenMemberCache.getOrPut(this) {
val result = mutableListOf<FirCallableMember>() val result = mutableListOf<FirCallableMemberDeclaration>()
if (this is FirNamedFunction) { if (this is FirNamedFunction) {
val superTypesScope = useSiteScope.superTypesScope val superTypesScope = useSiteScope.superTypesScope
superTypesScope.processFunctionsByName(this.name) { basicFunctionSymbol -> superTypesScope.processFunctionsByName(this.name) { basicFunctionSymbol ->
@@ -294,7 +291,7 @@ class JavaClassEnhancementScope(
} }
val overriddenByFir = (overriddenBy as? FirFunctionSymbol)?.fir val overriddenByFir = (overriddenBy as? FirFunctionSymbol)?.fir
if (overriddenByFir === this@overriddenMembers) { if (overriddenByFir === this@overriddenMembers) {
result += (basicFunctionSymbol as FirFunctionSymbol).fir result += (basicFunctionSymbol as FirFunctionSymbol).fir as FirCallableMemberDeclaration
} }
ProcessorAction.NEXT ProcessorAction.NEXT
} }
@@ -304,21 +301,21 @@ class JavaClassEnhancementScope(
} }
private sealed class TypeInSignature { private sealed class TypeInSignature {
abstract fun getTypeRef(member: FirCallableMember): FirTypeRef abstract fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef
object Return : TypeInSignature() { object Return : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef = member.returnTypeRef override fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef = member.returnTypeRef
} }
object Receiver : TypeInSignature() { object Receiver : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef { override fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef {
if (member is FirJavaMethod) return member.valueParameters[0].returnTypeRef if (member is FirJavaMethod) return member.valueParameters[0].returnTypeRef
return member.receiverTypeRef!! return member.receiverTypeRef!!
} }
} }
class ValueParameter(val hasReceiver: Boolean, val index: Int) : TypeInSignature() { class ValueParameter(val hasReceiver: Boolean, val index: Int) : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef { override fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef {
if (hasReceiver && member is FirJavaMethod) { if (hasReceiver && member is FirJavaMethod) {
return (member as FirFunction).valueParameters[index + 1].returnTypeRef return (member as FirFunction).valueParameters[index + 1].returnTypeRef
} }
@@ -327,9 +324,9 @@ class JavaClassEnhancementScope(
} }
} }
private fun FirCallableMember.partsForValueParameter( private fun FirCallableMemberDeclaration.partsForValueParameter(
typeQualifierResolver: FirAnnotationTypeQualifierResolver, typeQualifierResolver: FirAnnotationTypeQualifierResolver,
overriddenMembers: List<FirCallableMember>, overriddenMembers: List<FirCallableMemberDeclaration>,
// TODO: investigate if it's really can be a null (check properties' with extension overrides in Java) // TODO: investigate if it's really can be a null (check properties' with extension overrides in Java)
parameterContainer: FirAnnotationContainer?, parameterContainer: FirAnnotationContainer?,
methodContext: FirJavaEnhancementContext, methodContext: FirJavaEnhancementContext,
@@ -345,9 +342,9 @@ class JavaClassEnhancementScope(
typeInSignature typeInSignature
) )
private fun FirCallableMember.parts( private fun FirCallableMemberDeclaration.parts(
typeQualifierResolver: FirAnnotationTypeQualifierResolver, typeQualifierResolver: FirAnnotationTypeQualifierResolver,
overriddenMembers: List<FirCallableMember>, overriddenMembers: List<FirCallableMemberDeclaration>,
typeContainer: FirAnnotationContainer?, typeContainer: FirAnnotationContainer?,
isCovariant: Boolean, isCovariant: Boolean,
containerContext: FirJavaEnhancementContext, containerContext: FirJavaEnhancementContext,
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractProviderBasedScope
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -103,8 +103,8 @@ class JavaClassUseSiteScope(
} }
} }
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
val seen = mutableSetOf<ConePropertySymbol>() val seen = mutableSetOf<ConeVariableSymbol>()
if (!declaredMemberScope.processPropertiesByName(name) { if (!declaredMemberScope.processPropertiesByName(name) {
seen += it seen += it
processor(it) processor(it)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirClassDeclaredMemberScope( class FirClassDeclaredMemberScope(
@@ -32,7 +33,7 @@ class FirClassDeclaredMemberScope(
return NEXT return NEXT
} }
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
val symbols = provider.getCallableSymbols(CallableId(classId.packageFqName, classId.relativeClassName, name)) val symbols = provider.getCallableSymbols(CallableId(classId.packageFqName, classId.relativeClassName, name))
for (symbol in symbols) { for (symbol in symbols) {
if (symbol is ConePropertySymbol && !processor(symbol)) { if (symbol is ConePropertySymbol && !processor(symbol)) {
@@ -93,7 +93,7 @@ class FirClassSubstitutionScope(
return super.processFunctionsByName(name, processor) return super.processFunctionsByName(name, processor)
} }
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
return useSiteScope.processPropertiesByName(name, processor) return useSiteScope.processPropertiesByName(name, processor)
} }
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeContext import org.jetbrains.kotlin.fir.types.ConeTypeContext
@@ -96,7 +93,7 @@ class FirClassUseSiteScope(
} }
} }
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
val seen = mutableSetOf<ConeCallableSymbol>() val seen = mutableSetOf<ConeCallableSymbol>()
if (!declaredMemberScope.processPropertiesByName(name) { if (!declaredMemberScope.processPropertiesByName(name) {
seen += it seen += it
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirCompositeScope( class FirCompositeScope(
@@ -53,7 +53,7 @@ class FirCompositeScope(
return processComposite(FirScope::processFunctionsByName, name, processor) return processComposite(FirScope::processFunctionsByName, name, processor)
} }
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
return processComposite(FirScope::processPropertiesByName, name, processor) return processComposite(FirScope::processPropertiesByName, name, processor)
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirTopLevelDeclaredMemberScope( class FirTopLevelDeclaredMemberScope(
@@ -32,7 +33,7 @@ class FirTopLevelDeclaredMemberScope(
return NEXT return NEXT
} }
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction { override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
val symbols = provider.getCallableSymbols(CallableId(packageFqName, name)) val symbols = provider.getCallableSymbols(CallableId(packageFqName, name))
for (symbol in symbols) { for (symbol in symbols) {
if (symbol is ConePropertySymbol && !processor(symbol)) { if (symbol is ConePropertySymbol && !processor(symbol)) {
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType @BaseTransformedType
@@ -25,6 +27,8 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMemberDec
override val isOverride: Boolean get() = status.isOverride override val isOverride: Boolean get() = status.isOverride
override val symbol: FirFunctionSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitNamedFunction(this, data) visitor.visitNamedFunction(this, data)
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCallableMemberDeclaration { abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCallableMemberDeclaration {
final override val symbol: FirBasedSymbol<FirCallableDeclaration> // final override val symbol: FirBasedSymbol<FirCallableDeclaration>
final override var receiverTypeRef: FirTypeRef? final override var receiverTypeRef: FirTypeRef?
final override var returnTypeRef: FirTypeRef final override var returnTypeRef: FirTypeRef
@@ -31,13 +31,10 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
constructor( constructor(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableDeclaration>,
name: Name, name: Name,
receiverTypeRef: FirTypeRef?, receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef returnTypeRef: FirTypeRef
) : super(session, psi, name) { ) : super(session, psi, name) {
this.symbol = symbol
symbol.bind(this)
this.receiverTypeRef = receiverTypeRef this.receiverTypeRef = receiverTypeRef
this.returnTypeRef = returnTypeRef this.returnTypeRef = returnTypeRef
} }
@@ -45,7 +42,6 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
constructor( constructor(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableDeclaration>,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
modality: Modality?, modality: Modality?,
@@ -55,8 +51,6 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
receiverTypeRef: FirTypeRef?, receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef returnTypeRef: FirTypeRef
) : super(session, psi, name, visibility, modality, isExpect, isActual) { ) : super(session, psi, name, visibility, modality, isExpect, isActual) {
this.symbol = symbol
symbol.bind(this)
this.receiverTypeRef = receiverTypeRef this.receiverTypeRef = receiverTypeRef
this.returnTypeRef = returnTypeRef this.returnTypeRef = returnTypeRef
status.isOverride = isOverride status.isOverride = isOverride
@@ -10,10 +10,12 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
@@ -24,16 +26,21 @@ import org.jetbrains.kotlin.name.Name
open class FirConstructorImpl( open class FirConstructorImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
symbol: FirFunctionSymbol, override val symbol: FirFunctionSymbol,
visibility: Visibility, visibility: Visibility,
isExpect: Boolean, isExpect: Boolean,
isActual: Boolean, isActual: Boolean,
delegatedSelfTypeRef: FirTypeRef, delegatedSelfTypeRef: FirTypeRef,
final override var delegatedConstructor: FirDelegatedConstructorCall? final override var delegatedConstructor: FirDelegatedConstructorCall?
) : FirAbstractCallableMember( ) : FirAbstractCallableMember(
session, psi, symbol, NAME, visibility, Modality.FINAL, session, psi, NAME, visibility, Modality.FINAL,
isExpect, isActual, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef isExpect, isActual, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef
), FirConstructor { ), FirConstructor {
init {
symbol.bind(this)
}
override val valueParameters = mutableListOf<FirValueParameter>() override val valueParameters = mutableListOf<FirValueParameter>()
override var body: FirBlock? = null override var body: FirBlock? = null
@@ -10,9 +10,11 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
@@ -22,6 +24,8 @@ import org.jetbrains.kotlin.name.Name
open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction { open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction {
override val symbol: FirFunctionSymbol
constructor( constructor(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
@@ -29,7 +33,10 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
name: Name, name: Name,
receiverTypeRef: FirTypeRef?, receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef returnTypeRef: FirTypeRef
) : super(session, psi, symbol, name, receiverTypeRef, returnTypeRef) ) : super(session, psi, name, receiverTypeRef, returnTypeRef) {
this.symbol = symbol
symbol.bind(this)
}
constructor( constructor(
session: FirSession, session: FirSession,
@@ -50,7 +57,7 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
receiverTypeRef: FirTypeRef?, receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef returnTypeRef: FirTypeRef
) : super( ) : super(
session, psi, symbol, name, visibility, modality, session, psi, name, visibility, modality,
isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
) { ) {
status.isOperator = isOperator status.isOperator = isOperator
@@ -59,6 +66,8 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
status.isTailRec = isTailRec status.isTailRec = isTailRec
status.isExternal = isExternal status.isExternal = isExternal
status.isSuspend = isSuspend status.isSuspend = isSuspend
this.symbol = symbol
symbol.bind(this)
} }
override val valueParameters = mutableListOf<FirValueParameter>() override val valueParameters = mutableListOf<FirValueParameter>()
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.name.Name
class FirMemberPropertyImpl( class FirMemberPropertyImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
symbol: FirPropertySymbol, override val symbol: FirPropertySymbol,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
modality: Modality?, modality: Modality?,
@@ -39,9 +39,10 @@ class FirMemberPropertyImpl(
override var setter: FirPropertyAccessor, override var setter: FirPropertyAccessor,
override var delegate: FirExpression? override var delegate: FirExpression?
) : FirAbstractCallableMember( ) : FirAbstractCallableMember(
session, psi, symbol, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
), FirProperty { ), FirProperty {
init { init {
symbol.bind(this)
status.isConst = isConst status.isConst = isConst
status.isLateInit = isLateInit status.isLateInit = isLateInit
} }
@@ -25,7 +25,7 @@ class FirVariableImpl(
override var returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override val isVar: Boolean, override val isVar: Boolean,
override var initializer: FirExpression?, override var initializer: FirExpression?,
override val symbol: FirBasedSymbol<FirCallableDeclaration> = FirVariableSymbol(name), override val symbol: FirVariableSymbol = FirVariableSymbol(name),
override var delegate: FirExpression? = null override var delegate: FirExpression? = null
) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable { ) : FirAbstractNamedAnnotatedDeclaration(session, psiElement, name), FirVariable {
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirCallableDeclaration, FirNamedDeclaration, FirStatement { interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirCallableDeclaration, FirNamedDeclaration, FirStatement {
@@ -19,6 +21,8 @@ interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, F
val delegate: FirExpression? val delegate: FirExpression?
override val symbol: FirVariableSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitVariable(this, data) visitor.visitVariable(this, data)
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface FirScope { interface FirScope {
@@ -25,7 +25,7 @@ interface FirScope {
fun processPropertiesByName( fun processPropertiesByName(
name: Name, name: Name,
processor: (ConePropertySymbol) -> ProcessorAction processor: (ConeVariableSymbol) -> ProcessorAction
): ProcessorAction = NEXT ): ProcessorAction = NEXT
} }
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirPropertySymbol(override val callableId: CallableId) : ConePropertySymbol, AbstractFirBasedSymbol<FirCallableDeclaration>() class FirPropertySymbol(callableId: CallableId) : FirVariableSymbol(callableId), ConePropertySymbol
class FirVariableSymbol(override val callableId: CallableId) : ConeVariableSymbol, AbstractFirBasedSymbol<FirCallableDeclaration>() { open class FirVariableSymbol(override val callableId: CallableId) : ConeVariableSymbol, AbstractFirBasedSymbol<FirCallableDeclaration>() {
constructor(name: Name) : this(CallableId(FqName("var"), name)) // TODO? constructor(name: Name) : this(CallableId(FqName("var"), name)) // TODO?
} }