diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt index 3b08dffc1d2..664a1c2b302 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt @@ -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) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt new file mode 100644 index 00000000000..affb9099e21 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt @@ -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") + ) +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt index 09db869c61a..3025a4e1b4c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt @@ -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, private val isPrimary: Boolean, - private val signature: IdSignature, + private val signature: FirCallableSignature, ) : KtFirMemberSymbolPointer(ownerPointer) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: FirScope, firSession: FirSession, ): KtConstructorSymbol? { - val firConstructor = candidates.findDeclarationWithSignature(signature, firSession) { + val firConstructor = candidates.findDeclarationWithSignature(signature) { processDeclaredConstructors(it) } ?: return null diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt index b28b8b954a3..810595b6185 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt @@ -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, private val name: Name, - private val signature: IdSignature + private val signature: FirCallableSignature, ) : KtFirMemberSymbolPointer(ownerPointer) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: FirScope, firSession: FirSession ): KtFunctionSymbol? { - val firFunction = candidates.findDeclarationWithSignature(signature, firSession) { + val firFunction = candidates.findDeclarationWithSignature(signature) { processFunctionsByName(name, it) } ?: return null return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt index db5bccbc8c9..63d41af04d6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt @@ -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, private val name: Name, - private val signature: IdSignature + private val signature: FirCallableSignature ) : KtFirMemberSymbolPointer(ownerPointer) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: FirScope, firSession: FirSession ): KtKotlinPropertySymbol? { - val firProperty = candidates.findDeclarationWithSignature(signature, firSession) { + val firProperty = candidates.findDeclarationWithSignature(signature) { processPropertiesByName(name, it) } ?: return null diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt index 63c41127436..72c7e7a6f65 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt @@ -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(callableId) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: Collection>, firSession: FirSession ): KtFunctionSymbol? { - val firFunction = candidates.findDeclarationWithSignatureBySymbols(signature, firSession) ?: return null + val firFunction = candidates.findDeclarationWithSignatureBySymbols(signature) ?: return null return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) } } - diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelPropertySymbolPointer.kt index 18de9d5a424..9ca2e1876e9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelPropertySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelPropertySymbolPointer.kt @@ -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(callableId) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: Collection>, firSession: FirSession, ): KtKotlinPropertySymbol? { - val firProperty = candidates.findDeclarationWithSignatureBySymbols(signature, firSession) ?: return null + val firProperty = candidates.findDeclarationWithSignatureBySymbols(signature) ?: return null return firSymbolBuilder.variableLikeBuilder.buildPropertySymbol(firProperty.symbol) as? KtKotlinPropertySymbol } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt index 9ef9d38a044..a9ae77c5a4b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt @@ -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 FirScope.findDeclarationWithSignature( - signature: IdSignature, - firSession: FirSession, - processor: FirScope.((FirBasedSymbol<*>) -> Unit) -> Unit +internal inline fun 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 > FirScope.findClassifier return foundSymbol } -internal inline fun Collection>.findDeclarationWithSignatureBySymbols( - signature: IdSignature, - firSession: FirSession +internal inline fun Collection>.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 Collection 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 diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase1.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase1.kt index 6a2f591be3d..35258728006 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase1.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase1.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 package test class Foo diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase2.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase2.kt index 12c6809a3fc..0e82102a64b 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase2.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase2.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 package test class Foo diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase4.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase4.kt index ecc7f851fe7..69b52265bc6 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase4.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/ClassWithGenericBase4.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 package test class SomeClass1 diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass1.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass1.kt index 507b41853cd..b180bfde4b9 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass1.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass1.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 package test class SomeClass diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass2.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass2.kt index 7bf435d3bac..aad1923793a 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass2.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromOuterClassInInnerClass2.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 package test class SomeClass diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/MemberPropertyWithOuterTypeParameterBound.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/MemberPropertyWithOuterTypeParameterBound.kt index b49d7b64ff1..2d5b93af8d8 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/MemberPropertyWithOuterTypeParameterBound.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/MemberPropertyWithOuterTypeParameterBound.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 package test interface ClassA