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.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
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.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.*
@@ -54,7 +51,7 @@ class JavaClassEnhancementScope(
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 ->
val field = enhancements.getOrPut(original) { enhance(original, name) }
@@ -75,7 +72,7 @@ class JavaClassEnhancementScope(
}
private fun enhance(
original: ConePropertySymbol,
original: ConeVariableSymbol,
name: Name
): FirPropertySymbol {
val firField = (original as FirBasedSymbol<*>).fir as? FirJavaField ?: error("Can't make enhancement for $original")
@@ -109,7 +106,7 @@ class JavaClassEnhancementScope(
): FirFunctionSymbol {
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)
@@ -220,7 +217,7 @@ class JavaClassEnhancementScope(
private fun enhanceReceiverType(
ownerFunction: FirJavaMethod,
overriddenMembers: List<FirCallableMember>,
overriddenMembers: List<FirCallableMemberDeclaration>,
memberContext: FirJavaEnhancementContext
): FirResolvedTypeRef {
val signatureParts = ownerFunction.partsForValueParameter(
@@ -237,8 +234,8 @@ class JavaClassEnhancementScope(
private data class EnhanceValueParameterResult(val typeRef: FirResolvedTypeRef, val defaultValue: FirExpression?)
private fun enhanceValueParameter(
ownerFunction: FirCallableMember,
overriddenMembers: List<FirCallableMember>,
ownerFunction: FirCallableMemberDeclaration,
overriddenMembers: List<FirCallableMemberDeclaration>,
hasReceiver: Boolean,
memberContext: FirJavaEnhancementContext,
predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?,
@@ -263,8 +260,8 @@ class JavaClassEnhancementScope(
}
private fun enhanceReturnType(
owner: FirCallableMember,
overriddenMembers: List<FirCallableMember>,
owner: FirCallableMemberDeclaration,
overriddenMembers: List<FirCallableMemberDeclaration>,
memberContext: FirJavaEnhancementContext,
predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?
): FirResolvedTypeRef {
@@ -281,11 +278,11 @@ class JavaClassEnhancementScope(
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) {
val result = mutableListOf<FirCallableMember>()
val result = mutableListOf<FirCallableMemberDeclaration>()
if (this is FirNamedFunction) {
val superTypesScope = useSiteScope.superTypesScope
superTypesScope.processFunctionsByName(this.name) { basicFunctionSymbol ->
@@ -294,7 +291,7 @@ class JavaClassEnhancementScope(
}
val overriddenByFir = (overriddenBy as? FirFunctionSymbol)?.fir
if (overriddenByFir === this@overriddenMembers) {
result += (basicFunctionSymbol as FirFunctionSymbol).fir
result += (basicFunctionSymbol as FirFunctionSymbol).fir as FirCallableMemberDeclaration
}
ProcessorAction.NEXT
}
@@ -304,21 +301,21 @@ class JavaClassEnhancementScope(
}
private sealed class TypeInSignature {
abstract fun getTypeRef(member: FirCallableMember): FirTypeRef
abstract fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef
object Return : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef = member.returnTypeRef
override fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef = member.returnTypeRef
}
object Receiver : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef {
override fun getTypeRef(member: FirCallableMemberDeclaration): FirTypeRef {
if (member is FirJavaMethod) return member.valueParameters[0].returnTypeRef
return member.receiverTypeRef!!
}
}
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) {
return (member as FirFunction).valueParameters[index + 1].returnTypeRef
}
@@ -327,9 +324,9 @@ class JavaClassEnhancementScope(
}
}
private fun FirCallableMember.partsForValueParameter(
private fun FirCallableMemberDeclaration.partsForValueParameter(
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)
parameterContainer: FirAnnotationContainer?,
methodContext: FirJavaEnhancementContext,
@@ -345,9 +342,9 @@ class JavaClassEnhancementScope(
typeInSignature
)
private fun FirCallableMember.parts(
private fun FirCallableMemberDeclaration.parts(
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
overriddenMembers: List<FirCallableMember>,
overriddenMembers: List<FirCallableMemberDeclaration>,
typeContainer: FirAnnotationContainer?,
isCovariant: Boolean,
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.symbols.ConeCallableSymbol
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.typeContext
import org.jetbrains.kotlin.fir.types.*
@@ -103,8 +103,8 @@ class JavaClassUseSiteScope(
}
}
override fun processPropertiesByName(name: Name, processor: (ConePropertySymbol) -> ProcessorAction): ProcessorAction {
val seen = mutableSetOf<ConePropertySymbol>()
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
val seen = mutableSetOf<ConeVariableSymbol>()
if (!declaredMemberScope.processPropertiesByName(name) {
seen += 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.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name
class FirClassDeclaredMemberScope(
@@ -32,7 +33,7 @@ class FirClassDeclaredMemberScope(
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))
for (symbol in symbols) {
if (symbol is ConePropertySymbol && !processor(symbol)) {
@@ -93,7 +93,7 @@ class FirClassSubstitutionScope(
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)
}
@@ -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.NEXT
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
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.symbols.*
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.ConeKotlinType
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>()
if (!declaredMemberScope.processPropertiesByName(name) {
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.STOP
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.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name
class FirCompositeScope(
@@ -53,7 +53,7 @@ class FirCompositeScope(
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)
}
@@ -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.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name
class FirTopLevelDeclaredMemberScope(
@@ -32,7 +33,7 @@ class FirTopLevelDeclaredMemberScope(
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))
for (symbol in symbols) {
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.VisitedSupertype
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
@@ -25,6 +27,8 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMemberDec
override val isOverride: Boolean get() = status.isOverride
override val symbol: FirFunctionSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitNamedFunction(this, data)
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
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 returnTypeRef: FirTypeRef
@@ -31,13 +31,10 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableDeclaration>,
name: Name,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
) : super(session, psi, name) {
this.symbol = symbol
symbol.bind(this)
this.receiverTypeRef = receiverTypeRef
this.returnTypeRef = returnTypeRef
}
@@ -45,7 +42,6 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableDeclaration>,
name: Name,
visibility: Visibility,
modality: Modality?,
@@ -55,8 +51,6 @@ abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCall
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
) : super(session, psi, name, visibility, modality, isExpect, isActual) {
this.symbol = symbol
symbol.bind(this)
this.receiverTypeRef = receiverTypeRef
this.returnTypeRef = returnTypeRef
status.isOverride = isOverride
@@ -10,10 +10,12 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
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.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock
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.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
@@ -24,16 +26,21 @@ import org.jetbrains.kotlin.name.Name
open class FirConstructorImpl(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
override val symbol: FirFunctionSymbol,
visibility: Visibility,
isExpect: Boolean,
isActual: Boolean,
delegatedSelfTypeRef: FirTypeRef,
final override var delegatedConstructor: FirDelegatedConstructorCall?
) : FirAbstractCallableMember(
session, psi, symbol, NAME, visibility, Modality.FINAL,
session, psi, NAME, visibility, Modality.FINAL,
isExpect, isActual, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef
), FirConstructor {
init {
symbol.bind(this)
}
override val valueParameters = mutableListOf<FirValueParameter>()
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.fir.FirElement
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.FirValueParameter
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.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
@@ -22,6 +24,8 @@ import org.jetbrains.kotlin.name.Name
open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction {
override val symbol: FirFunctionSymbol
constructor(
session: FirSession,
psi: PsiElement?,
@@ -29,7 +33,10 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
name: Name,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
) : super(session, psi, symbol, name, receiverTypeRef, returnTypeRef)
) : super(session, psi, name, receiverTypeRef, returnTypeRef) {
this.symbol = symbol
symbol.bind(this)
}
constructor(
session: FirSession,
@@ -50,7 +57,7 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef
) : super(
session, psi, symbol, name, visibility, modality,
session, psi, name, visibility, modality,
isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
) {
status.isOperator = isOperator
@@ -59,6 +66,8 @@ open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction,
status.isTailRec = isTailRec
status.isExternal = isExternal
status.isSuspend = isSuspend
this.symbol = symbol
symbol.bind(this)
}
override val valueParameters = mutableListOf<FirValueParameter>()
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.name.Name
class FirMemberPropertyImpl(
session: FirSession,
psi: PsiElement?,
symbol: FirPropertySymbol,
override val symbol: FirPropertySymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
@@ -39,9 +39,10 @@ class FirMemberPropertyImpl(
override var setter: FirPropertyAccessor,
override var delegate: FirExpression?
) : FirAbstractCallableMember(
session, psi, symbol, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
), FirProperty {
init {
symbol.bind(this)
status.isConst = isConst
status.isLateInit = isLateInit
}
@@ -25,7 +25,7 @@ class FirVariableImpl(
override var returnTypeRef: FirTypeRef,
override val isVar: Boolean,
override var initializer: FirExpression?,
override val symbol: FirBasedSymbol<FirCallableDeclaration> = FirVariableSymbol(name),
override val symbol: FirVariableSymbol = FirVariableSymbol(name),
override var delegate: FirExpression? = null
) : 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.declarations.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirCallableDeclaration, FirNamedDeclaration, FirStatement {
@@ -19,6 +21,8 @@ interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, F
val delegate: FirExpression?
override val symbol: FirVariableSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
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.symbols.ConeClassifierSymbol
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
interface FirScope {
@@ -25,7 +25,7 @@ interface FirScope {
fun processPropertiesByName(
name: Name,
processor: (ConePropertySymbol) -> ProcessorAction
processor: (ConeVariableSymbol) -> ProcessorAction
): ProcessorAction = NEXT
}
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.FqName
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?
}