[FE] Fix 'containingClassForStaticMemberAttr' for fake overrides (KTIJ-22808)

This commit is contained in:
Yan Zhulanow
2022-10-24 15:35:38 +09:00
committed by Space Team
parent 2e9f9f987b
commit fe69b21aed
19 changed files with 176 additions and 84 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.AllCandidatesResolver
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
@@ -73,6 +74,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
import org.jetbrains.kotlin.analysis.utils.errors.shouldIjPlatformExceptionBeRethrown
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
internal class KtFirCallResolver(
@@ -966,11 +968,23 @@ internal class KtFirCallResolver(
psi: KtElement,
resolveFragmentOfCall: Boolean
): List<KtCallCandidateInfo> {
val candidates = AllCandidatesResolver(analysisSession.useSiteSession).getAllCandidatesForDelegatedConstructor(
analysisSession.firResolveSession,
this,
psi
)
fun findDerivedClass(psi: KtElement): KtClassOrObject? {
val parent = psi.parent
return when (psi) {
is KtConstructorDelegationCall -> ((parent as? KtSecondaryConstructor)?.parent as? KtClassBody)?.parent as? KtClassOrObject
is KtSuperTypeCallEntry -> (parent as? KtSuperTypeList)?.parent as? KtClassOrObject
is KtConstructorCalleeExpression -> (parent as? KtElement)?.let(::findDerivedClass)
else -> null
}
}
val derivedClass = findDerivedClass(psi)
?.getOrBuildFirSafe<FirClass>(firResolveSession)
?: return emptyList()
val candidates = AllCandidatesResolver(analysisSession.useSiteSession)
.getAllCandidatesForDelegatedConstructor(analysisSession.firResolveSession, this, derivedClass.symbol.toLookupTag(), psi)
return candidates.mapNotNull {
convertToKtCallCandidateInfo(
this,
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
import org.jetbrains.kotlin.fir.resolve.calls.tower.FirTowerResolver
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneType
@@ -71,6 +72,7 @@ class AllCandidatesResolver(private val firSession: FirSession) {
fun getAllCandidatesForDelegatedConstructor(
firResolveSession: LLFirResolveSession,
delegatedConstructorCall: FirDelegatedConstructorCall,
derivedClassLookupTag: ConeClassLikeLookupTag,
element: KtElement
): List<OverloadCandidate> {
initializeBodyResolveContext(firResolveSession, element)
@@ -78,10 +80,10 @@ class AllCandidatesResolver(private val firSession: FirSession) {
val firFile = element.containingKtFile.getOrBuildFirFile(firResolveSession)
val constructedType = delegatedConstructorCall.constructedTypeRef.coneType as ConeClassLikeType
return bodyResolveComponents.context.withFile(firFile, bodyResolveComponents) {
bodyResolveComponents.callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, constructedType)
bodyResolveComponents.collector.allCandidates.map {
OverloadCandidate(it, isInBestCandidates = it in bodyResolveComponents.collector.bestCandidates())
}
bodyResolveComponents.callResolver
.resolveDelegatingConstructorCall(delegatedConstructorCall, constructedType, derivedClassLookupTag)
bodyResolveComponents.collector.allCandidates
.map { OverloadCandidate(it, isInBestCandidates = it in bodyResolveComponents.collector.bestCandidates()) }
}
}