[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,