[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")
}
KtFirConstructorSymbolPointer(requireOwnerPointer(), isPrimary, firSymbol.fir.createSignature())
KtFirConstructorSymbolPointer(requireOwnerPointer(), isPrimary, firSymbol.createSignature())
}
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.declarations.FirConstructor
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.ir.util.IdSignature
internal class KtFirConstructorSymbolPointer(
ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
private val isPrimary: Boolean,
private val signature: IdSignature,
private val signature: FirCallableSignature,
) : KtFirMemberSymbolPointer<KtConstructorSymbol>(ownerPointer) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope,
firSession: FirSession,
): KtConstructorSymbol? {
val firConstructor = candidates.findDeclarationWithSignature<FirConstructor>(signature, firSession) {
val firConstructor = candidates.findDeclarationWithSignature<FirConstructor>(signature) {
processDeclaredConstructors(it)
} ?: 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.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name
internal class KtFirMemberFunctionSymbolPointer(
ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
private val name: Name,
private val signature: IdSignature
private val signature: FirCallableSignature,
) : KtFirMemberSymbolPointer<KtFunctionSymbol>(ownerPointer) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope,
firSession: FirSession
): KtFunctionSymbol? {
val firFunction = candidates.findDeclarationWithSignature<FirSimpleFunction>(signature, firSession) {
val firFunction = candidates.findDeclarationWithSignature<FirSimpleFunction>(signature) {
processFunctionsByName(name, it)
} ?: return null
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.declarations.FirProperty
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name
internal class KtFirMemberPropertySymbolPointer(
ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
private val name: Name,
private val signature: IdSignature
private val signature: FirCallableSignature
) : KtFirMemberSymbolPointer<KtKotlinPropertySymbol>(ownerPointer) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope,
firSession: FirSession
): KtKotlinPropertySymbol? {
val firProperty = candidates.findDeclarationWithSignature<FirProperty>(signature, firSession) {
val firProperty = candidates.findDeclarationWithSignature<FirProperty>(signature) {
processPropertiesByName(name, it)
} ?: 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.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.CallableId
internal class KtFirTopLevelFunctionSymbolPointer(
callableId: CallableId,
private val signature: IdSignature
private val signature: FirCallableSignature,
) : KtTopLevelCallableSymbolPointer<KtFunctionSymbol>(callableId) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: Collection<FirCallableSymbol<*>>,
firSession: FirSession
): KtFunctionSymbol? {
val firFunction = candidates.findDeclarationWithSignatureBySymbols<FirSimpleFunction>(signature, firSession) ?: return null
val firFunction = candidates.findDeclarationWithSignatureBySymbols<FirSimpleFunction>(signature) ?: return null
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.declarations.FirProperty
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
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) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: Collection<FirCallableSymbol<*>>,
firSession: FirSession,
): 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
}
}
@@ -6,32 +6,25 @@
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.ideSessionComponents
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
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.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
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.Name
internal inline fun <reified D : FirDeclaration> FirScope.findDeclarationWithSignature(
signature: IdSignature,
firSession: FirSession,
processor: FirScope.((FirBasedSymbol<*>) -> Unit) -> Unit
internal inline fun <reified D : FirCallableDeclaration> FirScope.findDeclarationWithSignature(
signature: FirCallableSignature,
processor: FirScope.((FirBasedSymbol<*>) -> Unit) -> Unit,
): D? {
val signatureComposer = firSession.ideSessionComponents.signatureComposer
var foundSymbol: D? = null
processor { symbol ->
val declaration = symbol.fir
if (declaration is D && signatureComposer.composeSignature(declaration, allowLocalClasses = true) == signature) {
if (declaration is D && signature.sameSignature(declaration)) {
foundSymbol = declaration
}
}
@@ -50,14 +43,12 @@ internal inline fun <reified D : FirClassifierSymbol<*>> FirScope.findClassifier
return foundSymbol
}
internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>>.findDeclarationWithSignatureBySymbols(
signature: IdSignature,
firSession: FirSession
internal inline fun <reified D : FirCallableDeclaration> Collection<FirCallableSymbol<*>>.findDeclarationWithSignatureBySymbols(
signature: FirCallableSignature,
): D? {
val signatureComposer = firSession.ideSessionComponents.signatureComposer
for (symbol in this) {
val declaration = symbol.fir
if (declaration is D && signatureComposer.composeSignature(declaration) == signature) {
if (declaration is D && signature.sameSignature(declaration)) {
return declaration
}
}
@@ -65,14 +56,5 @@ internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>
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) =
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
class Foo
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test
class Foo
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test
class SomeClass1
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test
class SomeClass
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test
class SomeClass
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
package test
interface ClassA