[AA FIR] introduce FirCallableSignature to encapsulate IdSignature

^KT-54826
This commit is contained in:
Dmitrii Gridin
2022-11-21 13:53:45 +01:00
committed by Space Team
parent b04c9f02b0
commit 7e433a936d
14 changed files with 55 additions and 49 deletions
@@ -65,7 +65,7 @@ internal class KtFirConstructorSymbol(
throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException("constructor") throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException("constructor")
} }
KtFirConstructorSymbolPointer(requireOwnerPointer(), isPrimary, firSymbol.fir.createSignature()) KtFirConstructorSymbolPointer(requireOwnerPointer(), isPrimary, firSymbol.createSignature())
} }
override fun equals(other: Any?): Boolean = symbolEquals(other) override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2022 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.
*/
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.low.level.api.fir.ideSessionComponents
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.ir.util.IdSignature
internal data class FirCallableSignature(private val idSignature: IdSignature) {
fun sameSignature(declaration: FirCallableDeclaration): Boolean = this == declaration.createSignature()
fun sameSignature(declaration: FirCallableSymbol<*>): Boolean = sameSignature(declaration.fir)
}
internal fun FirCallableSymbol<*>.createSignature(): FirCallableSignature = fir.createSignature()
internal fun FirCallableDeclaration.createSignature(): FirCallableSignature {
lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
val signatureComposer = moduleData.session.ideSessionComponents.signatureComposer
return FirCallableSignature(
signatureComposer.composeSignature(this, allowLocalClasses = true)
?: error("Could not compose signature for ${this.renderWithType()}, looks like it is private or local")
)
}
@@ -12,18 +12,17 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.ir.util.IdSignature
internal class KtFirConstructorSymbolPointer( internal class KtFirConstructorSymbolPointer(
ownerPointer: KtSymbolPointer<KtSymbolWithMembers>, ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
private val isPrimary: Boolean, private val isPrimary: Boolean,
private val signature: IdSignature, private val signature: FirCallableSignature,
) : KtFirMemberSymbolPointer<KtConstructorSymbol>(ownerPointer) { ) : KtFirMemberSymbolPointer<KtConstructorSymbol>(ownerPointer) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope, candidates: FirScope,
firSession: FirSession, firSession: FirSession,
): KtConstructorSymbol? { ): KtConstructorSymbol? {
val firConstructor = candidates.findDeclarationWithSignature<FirConstructor>(signature, firSession) { val firConstructor = candidates.findDeclarationWithSignature<FirConstructor>(signature) {
processDeclaredConstructors(it) processDeclaredConstructors(it)
} ?: return null } ?: return null
@@ -12,19 +12,18 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal class KtFirMemberFunctionSymbolPointer( internal class KtFirMemberFunctionSymbolPointer(
ownerPointer: KtSymbolPointer<KtSymbolWithMembers>, ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
private val name: Name, private val name: Name,
private val signature: IdSignature private val signature: FirCallableSignature,
) : KtFirMemberSymbolPointer<KtFunctionSymbol>(ownerPointer) { ) : KtFirMemberSymbolPointer<KtFunctionSymbol>(ownerPointer) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope, candidates: FirScope,
firSession: FirSession firSession: FirSession
): KtFunctionSymbol? { ): KtFunctionSymbol? {
val firFunction = candidates.findDeclarationWithSignature<FirSimpleFunction>(signature, firSession) { val firFunction = candidates.findDeclarationWithSignature<FirSimpleFunction>(signature) {
processFunctionsByName(name, it) processFunctionsByName(name, it)
} ?: return null } ?: return null
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol)
@@ -12,19 +12,18 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal class KtFirMemberPropertySymbolPointer( internal class KtFirMemberPropertySymbolPointer(
ownerPointer: KtSymbolPointer<KtSymbolWithMembers>, ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
private val name: Name, private val name: Name,
private val signature: IdSignature private val signature: FirCallableSignature
) : KtFirMemberSymbolPointer<KtKotlinPropertySymbol>(ownerPointer) { ) : KtFirMemberSymbolPointer<KtKotlinPropertySymbol>(ownerPointer) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope, candidates: FirScope,
firSession: FirSession firSession: FirSession
): KtKotlinPropertySymbol? { ): KtKotlinPropertySymbol? {
val firProperty = candidates.findDeclarationWithSignature<FirProperty>(signature, firSession) { val firProperty = candidates.findDeclarationWithSignature<FirProperty>(signature) {
processPropertiesByName(name, it) processPropertiesByName(name, it)
} ?: return null } ?: return null
@@ -10,19 +10,17 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
internal class KtFirTopLevelFunctionSymbolPointer( internal class KtFirTopLevelFunctionSymbolPointer(
callableId: CallableId, callableId: CallableId,
private val signature: IdSignature private val signature: FirCallableSignature,
) : KtTopLevelCallableSymbolPointer<KtFunctionSymbol>(callableId) { ) : KtTopLevelCallableSymbolPointer<KtFunctionSymbol>(callableId) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: Collection<FirCallableSymbol<*>>, candidates: Collection<FirCallableSymbol<*>>,
firSession: FirSession firSession: FirSession
): KtFunctionSymbol? { ): KtFunctionSymbol? {
val firFunction = candidates.findDeclarationWithSignatureBySymbols<FirSimpleFunction>(signature, firSession) ?: return null val firFunction = candidates.findDeclarationWithSignatureBySymbols<FirSimpleFunction>(signature) ?: return null
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol)
} }
} }
@@ -10,16 +10,15 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
internal class KtFirTopLevelPropertySymbolPointer(callableId: CallableId, private val signature: IdSignature) : internal class KtFirTopLevelPropertySymbolPointer(callableId: CallableId, private val signature: FirCallableSignature) :
KtTopLevelCallableSymbolPointer<KtKotlinPropertySymbol>(callableId) { KtTopLevelCallableSymbolPointer<KtKotlinPropertySymbol>(callableId) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: Collection<FirCallableSymbol<*>>, candidates: Collection<FirCallableSymbol<*>>,
firSession: FirSession, firSession: FirSession,
): KtKotlinPropertySymbol? { ): KtKotlinPropertySymbol? {
val firProperty = candidates.findDeclarationWithSignatureBySymbols<FirProperty>(signature, firSession) ?: return null val firProperty = candidates.findDeclarationWithSignatureBySymbols<FirProperty>(signature) ?: return null
return firSymbolBuilder.variableLikeBuilder.buildPropertySymbol(firProperty.symbol) as? KtKotlinPropertySymbol return firSymbolBuilder.variableLikeBuilder.buildPropertySymbol(firProperty.symbol) as? KtKotlinPropertySymbol
} }
} }
@@ -6,32 +6,25 @@
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.ideSessionComponents import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal inline fun <reified D : FirDeclaration> FirScope.findDeclarationWithSignature( internal inline fun <reified D : FirCallableDeclaration> FirScope.findDeclarationWithSignature(
signature: IdSignature, signature: FirCallableSignature,
firSession: FirSession, processor: FirScope.((FirBasedSymbol<*>) -> Unit) -> Unit,
processor: FirScope.((FirBasedSymbol<*>) -> Unit) -> Unit
): D? { ): D? {
val signatureComposer = firSession.ideSessionComponents.signatureComposer
var foundSymbol: D? = null var foundSymbol: D? = null
processor { symbol -> processor { symbol ->
val declaration = symbol.fir val declaration = symbol.fir
if (declaration is D && signatureComposer.composeSignature(declaration, allowLocalClasses = true) == signature) { if (declaration is D && signature.sameSignature(declaration)) {
foundSymbol = declaration foundSymbol = declaration
} }
} }
@@ -50,14 +43,12 @@ internal inline fun <reified D : FirClassifierSymbol<*>> FirScope.findClassifier
return foundSymbol return foundSymbol
} }
internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>>.findDeclarationWithSignatureBySymbols( internal inline fun <reified D : FirCallableDeclaration> Collection<FirCallableSymbol<*>>.findDeclarationWithSignatureBySymbols(
signature: IdSignature, signature: FirCallableSignature,
firSession: FirSession
): D? { ): D? {
val signatureComposer = firSession.ideSessionComponents.signatureComposer
for (symbol in this) { for (symbol in this) {
val declaration = symbol.fir val declaration = symbol.fir
if (declaration is D && signatureComposer.composeSignature(declaration) == signature) { if (declaration is D && signature.sameSignature(declaration)) {
return declaration return declaration
} }
} }
@@ -65,14 +56,5 @@ internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>
return null return null
} }
internal fun FirBasedSymbol<*>.createSignature(): IdSignature = fir.createSignature()
internal fun FirDeclaration.createSignature(): IdSignature {
lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
val signatureComposer = moduleData.session.ideSessionComponents.signatureComposer
return signatureComposer.composeSignature(this, allowLocalClasses = true)
?: error("Could not compose signature for ${this.renderWithType()}, looks like it is private or local")
}
internal fun KtFirAnalysisSession.getClassLikeSymbol(classId: ClassId) = internal fun KtFirAnalysisSession.getClassLikeSymbol(classId: ClassId) =
firResolveSession.useSiteFirSession.symbolProvider.getClassLikeSymbolByClassId(classId)?.fir firResolveSession.useSiteFirSession.symbolProvider.getClassLikeSymbolByClassId(classId)?.fir
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test package test
class Foo class Foo
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test package test
class Foo class Foo
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test package test
class SomeClass1 class SomeClass1
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test package test
class SomeClass class SomeClass
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test package test
class SomeClass class SomeClass
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test package test
interface ClassA interface ClassA