[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")
|
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)
|
||||||
|
|||||||
+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.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
|
||||||
|
|
||||||
|
|||||||
+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.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)
|
||||||
|
|||||||
+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.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
|
||||||
|
|
||||||
|
|||||||
+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.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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+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.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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-26
@@ -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
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user