FIR: Update fir hierarchy, decouple member declaration from callable
This commit is contained in:
@@ -56,20 +56,20 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
|
||||
classifierContainerFileMap[classId] = file
|
||||
}
|
||||
|
||||
override fun visitCallableMember(callableMember: FirCallableMember) {
|
||||
override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
|
||||
val callableId = when (containerFqName) {
|
||||
FqName.ROOT -> CallableId(packageName, callableMember.name)
|
||||
else -> CallableId(packageName, containerFqName, callableMember.name)
|
||||
FqName.ROOT -> CallableId(packageName, callableMemberDeclaration.name)
|
||||
else -> CallableId(packageName, containerFqName, callableMemberDeclaration.name)
|
||||
}
|
||||
callableMap.merge(callableId, listOf(callableMember)) { a, b -> a + b }
|
||||
callableMap.merge(callableId, listOf(callableMemberDeclaration)) { a, b -> a + b }
|
||||
}
|
||||
|
||||
override fun visitNamedFunction(namedFunction: FirNamedFunction) {
|
||||
visitCallableMember(namedFunction)
|
||||
visitCallableMemberDeclaration(namedFunction)
|
||||
}
|
||||
|
||||
override fun visitProperty(property: FirProperty) {
|
||||
visitCallableMember(property)
|
||||
visitCallableMemberDeclaration(property)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
+3
-3
@@ -161,7 +161,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
||||
?: return CandidateApplicability.HIDDEN
|
||||
declaration as FirDeclaration
|
||||
|
||||
if (declaration is FirCallableMember) {
|
||||
if (declaration is FirCallableDeclaration) {
|
||||
if ((declaration.receiverTypeRef == null) != (explicitReceiverType == null)) return CandidateApplicability.PARAMETER_MAPPING_ERROR
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
||||
val lastCandidate = variableChecker.candidates.lastOrNull()
|
||||
if (variableChecker.currentApplicability == CandidateApplicability.RESOLVED && lastCandidate == symbol) {
|
||||
val receiverScope =
|
||||
(lastCandidate as FirBasedSymbol<FirCallableMember>).fir.returnTypeRef.coneTypeUnsafe().scope(session)
|
||||
(lastCandidate as FirBasedSymbol<FirCallableDeclaration>).fir.returnTypeRef.coneTypeUnsafe().scope(session)
|
||||
|
||||
|
||||
lookupInvoke = true
|
||||
@@ -393,7 +393,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
||||
is FirErrorNamedReference ->
|
||||
FirErrorTypeRefImpl(session, access.psi, newCallee.errorReason)
|
||||
is FirResolvedCallableReference ->
|
||||
(newCallee.callableSymbol as FirBasedSymbol<FirCallableMember>).fir.returnTypeRef
|
||||
(newCallee.callableSymbol as FirBasedSymbol<FirCallableDeclaration>).fir.returnTypeRef
|
||||
else -> return
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer() {
|
||||
return when (this) {
|
||||
is FirEnumEntry -> Modality.FINAL
|
||||
is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL
|
||||
is FirCallableMember -> {
|
||||
is FirCallableMemberDeclaration -> {
|
||||
val containingClass = classes.lastOrNull()
|
||||
when {
|
||||
containingClass == null -> Modality.FINAL
|
||||
|
||||
+3
-1
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
@@ -129,7 +130,8 @@ class FirClassSubstitutionScope(
|
||||
FirValueParameterImpl(
|
||||
this@FirClassSubstitutionScope.session, psi,
|
||||
name, this.returnTypeRef.withReplacedConeType(this@FirClassSubstitutionScope.session, newType),
|
||||
defaultValue, isCrossinline, isNoinline, isVararg
|
||||
defaultValue, isCrossinline, isNoinline, isVararg,
|
||||
FirVariableSymbol(valueParameter.symbol.callableId)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+7
-10
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
||||
@@ -60,18 +57,18 @@ class FirClassUseSiteScope(
|
||||
}
|
||||
}
|
||||
|
||||
fun similarFunctionsOrBothProperties(member: FirCallableMember, self: FirCallableMember): Boolean {
|
||||
return when (member) {
|
||||
is FirNamedFunction -> self is FirNamedFunction && isOverriddenFunCheck(member, self)
|
||||
fun similarFunctionsOrBothProperties(declaration: FirCallableDeclaration, self: FirCallableDeclaration): Boolean {
|
||||
return when (declaration) {
|
||||
is FirNamedFunction -> self is FirNamedFunction && isOverriddenFunCheck(declaration, self)
|
||||
is FirConstructor -> false
|
||||
is FirProperty -> self is FirProperty
|
||||
else -> error("Unknown fir callable type: $member, $self")
|
||||
else -> error("Unknown fir callable type: $declaration, $self")
|
||||
}
|
||||
}
|
||||
|
||||
val self = (this as AbstractFirBasedSymbol<*>).fir as FirCallableMember
|
||||
val self = (this as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration
|
||||
val overriding = seen.firstOrNull {
|
||||
val member = (it as AbstractFirBasedSymbol<*>).fir as FirCallableMember
|
||||
val member = (it as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration
|
||||
self.modality != Modality.FINAL
|
||||
&& sameReceivers(member.receiverTypeRef, self.receiverTypeRef)
|
||||
&& similarFunctionsOrBothProperties(member, self)
|
||||
|
||||
Reference in New Issue
Block a user