[FIR] pre-resolve some scope callables before creating a scope
In a lot of cases, when we want to process the declaration in scope, it should be resolved to at least TYPES phase. To avoid doing it manually in all our variety of scopes, we do it when the scope it created. It was implicitly working manually before as lazy resolve did a lot of extra work on resolving a declaration it was not supposed to resolve. Now it's not the case, and we have to explicitly resolve all the declarations we need. ^KT-56543 Co-authored-by: Ilya Kirillov <ilya.kirillov@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
23e40693a3
commit
706ff6b61f
+11
-6
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -31,9 +31,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.AllCandidatesRes
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.rethrowExceptionWithDetails
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
||||
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
||||
@@ -191,7 +190,10 @@ internal class KtFirCallResolver(
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> transformErrorReference(call: FirElement, calleeReference: T): KtCallInfo where T : FirNamedReference, T : FirDiagnosticHolder {
|
||||
fun <T> transformErrorReference(
|
||||
call: FirElement,
|
||||
calleeReference: T,
|
||||
): KtCallInfo where T : FirNamedReference, T : FirDiagnosticHolder {
|
||||
val diagnostic = calleeReference.diagnostic
|
||||
val ktDiagnostic = calleeReference.createKtDiagnostic(psi)
|
||||
|
||||
@@ -953,7 +955,8 @@ internal class KtFirCallResolver(
|
||||
return classSymbol.unsubstitutedScope(
|
||||
analysisSession.useSiteSession,
|
||||
analysisSession.getScopeSessionFor(analysisSession.useSiteSession),
|
||||
withForcedTypeCalculator = true
|
||||
withForcedTypeCalculator = true,
|
||||
memberRequiredPhase = null,
|
||||
)
|
||||
.getConstructors(analysisSession.firSymbolBuilder)
|
||||
.toList()
|
||||
@@ -1193,8 +1196,10 @@ internal class KtFirCallResolver(
|
||||
val scope = unsubstitutedScope(
|
||||
analysisSession.useSiteSession,
|
||||
analysisSession.getScopeSessionFor(analysisSession.useSiteSession),
|
||||
false
|
||||
false,
|
||||
memberRequiredPhase = null,
|
||||
)
|
||||
|
||||
var equalsSymbol: FirNamedFunctionSymbol? = null
|
||||
scope.processFunctionsByName(EQUALS) { equalsSymbolFromScope ->
|
||||
if (equalsSymbol != null) return@processFunctionsByName
|
||||
|
||||
+15
-4
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -89,7 +89,8 @@ internal class KtFirScopeProvider(
|
||||
fir.unsubstitutedScope(
|
||||
firSession,
|
||||
getScopeSession(),
|
||||
withForcedTypeCalculator = false
|
||||
withForcedTypeCalculator = false,
|
||||
memberRequiredPhase = null,
|
||||
)
|
||||
}?.applyIf(classSymbol is KtEnumEntrySymbol, ::EnumEntryContainingNamesAwareScope)
|
||||
?: return getEmptyScope()
|
||||
@@ -269,16 +270,26 @@ internal class KtFirScopeProvider(
|
||||
)
|
||||
}
|
||||
|
||||
private fun buildJavaEnhancementDeclaredMemberScope(useSiteSession: FirSession, symbol: FirRegularClassSymbol, scopeSession: ScopeSession): JavaClassDeclaredMembersEnhancementScope {
|
||||
private fun buildJavaEnhancementDeclaredMemberScope(
|
||||
useSiteSession: FirSession,
|
||||
symbol: FirRegularClassSymbol,
|
||||
scopeSession: ScopeSession,
|
||||
): JavaClassDeclaredMembersEnhancementScope {
|
||||
return scopeSession.getOrBuild(symbol, JAVA_ENHANCEMENT_FOR_DECLARED_MEMBER) {
|
||||
val firJavaClass = symbol.fir
|
||||
require(firJavaClass is FirJavaClass) {
|
||||
"${firJavaClass.classId} is expected to be FirJavaClass, but ${firJavaClass::class} found"
|
||||
}
|
||||
|
||||
JavaClassDeclaredMembersEnhancementScope(
|
||||
useSiteSession,
|
||||
firJavaClass,
|
||||
JavaScopeProvider.getUseSiteMemberScope(firJavaClass, useSiteSession, scopeSession)
|
||||
JavaScopeProvider.getUseSiteMemberScope(
|
||||
firJavaClass,
|
||||
useSiteSession,
|
||||
scopeSession,
|
||||
memberRequiredPhase = FirResolvePhase.TYPES,
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -11,20 +11,20 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverrideFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverridePropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
|
||||
|
||||
internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
@@ -120,8 +120,10 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
val firTypeScope = firContainer.unsubstitutedScope(
|
||||
firSession,
|
||||
analysisSession.getScopeSessionFor(firSession),
|
||||
withForcedTypeCalculator = false
|
||||
withForcedTypeCalculator = false,
|
||||
memberRequiredPhase = null,
|
||||
)
|
||||
|
||||
firTypeScope.processCallableByName(firCallableDeclaration)
|
||||
process(firTypeScope, firCallableDeclaration)
|
||||
}
|
||||
|
||||
+2
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -51,6 +51,7 @@ internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
|
||||
useSiteSession = firSession,
|
||||
scopeSession = scopeSession,
|
||||
withForcedTypeCalculator = false,
|
||||
memberRequiredPhase = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user