FIR: Update fir hierarchy, decouple member declaration from callable

This commit is contained in:
Simon Ogorodnik
2019-03-06 17:47:01 +03:00
parent 7b6f4d8ba4
commit 02079bbeb5
31 changed files with 243 additions and 94 deletions
@@ -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)
}
})
}
@@ -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
}
}
@@ -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
@@ -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,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)