[AA FIR] introduce FirCallableSignature to encapsulate IdSignature
^KT-54826
This commit is contained in:
committed by
Space Team
parent
b04c9f02b0
commit
7e433a936d
+1
-1
@@ -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)
|
||||
|
||||
+30
@@ -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")
|
||||
)
|
||||
}
|
||||
+2
-3
@@ -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
|
||||
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
+2
-3
@@ -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
|
||||
|
||||
|
||||
+2
-4
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+8
-26
@@ -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
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||
package test
|
||||
|
||||
class Foo
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||
package test
|
||||
|
||||
class Foo
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||
package test
|
||||
|
||||
class SomeClass1
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||
package test
|
||||
|
||||
class SomeClass
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||
package test
|
||||
|
||||
class SomeClass
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||
package test
|
||||
|
||||
interface ClassA
|
||||
|
||||
Reference in New Issue
Block a user