From d0cc88ffe0323678624ba9021cebf686d26e9423 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Fri, 21 Oct 2022 10:02:05 +0200 Subject: [PATCH] [AA] KtCallableSymbol: introduce receiverType extension ^KT-54417 --- .../components/AbstractKtSignatureSubstitutorImpl.kt | 9 +++++---- .../AbstractAnalysisApiSignatureContractsTest.kt | 4 ++-- .../kotlin/analysis/api/symbols/KtCallableSymbol.kt | 3 +++ .../PsiDeclarationAndKtSymbolEqualityChecker.kt | 3 ++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtSignatureSubstitutorImpl.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtSignatureSubstitutorImpl.kt index b76117cb98e..9a9cbeb53d1 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtSignatureSubstitutorImpl.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtSignatureSubstitutorImpl.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.signatures.KtVariableLikeSignature import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.receiverType import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError @@ -47,7 +48,7 @@ abstract class AbstractKtSignatureSubstitutorImpl : KtSignatureSubstitutor() { return KtFunctionLikeSignature( symbol, substitutor.substitute(symbol.returnType), - symbol.receiverParameter?.type?.let { substitutor.substitute(it) }, + symbol.receiverType?.let { substitutor.substitute(it) }, symbol.valueParameters.map { substitute(it, substitutor) } ) } @@ -57,7 +58,7 @@ abstract class AbstractKtSignatureSubstitutorImpl : KtSignatureSubstitutor() { return KtVariableLikeSignature( symbol, substitutor.substitute(symbol.returnType), - symbol.receiverParameter?.type?.let { substitutor.substitute(it) }, + symbol.receiverType?.let { substitutor.substitute(it) }, ) } @@ -70,10 +71,10 @@ abstract class AbstractKtSignatureSubstitutorImpl : KtSignatureSubstitutor() { } override fun asSignature(symbol: S): KtFunctionLikeSignature { - return KtFunctionLikeSignature(symbol, symbol.returnType, symbol.receiverParameter?.type, symbol.valueParameters.map { asSignature(it) }) + return KtFunctionLikeSignature(symbol, symbol.returnType, symbol.receiverType, symbol.valueParameters.map { asSignature(it) }) } override fun asSignature(symbol: S): KtVariableLikeSignature { - return KtVariableLikeSignature(symbol, symbol.returnType, symbol.receiverParameter?.type) + return KtVariableLikeSignature(symbol, symbol.returnType, symbol.receiverType) } } \ No newline at end of file diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureContractsTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureContractsTest.kt index 5ee514226da..5cbc19fc5d7 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureContractsTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureContractsTest.kt @@ -102,7 +102,7 @@ abstract class AbstractAnalysisApiSignatureContractsTest : AbstractAnalysisApiSi substitutor: KtSubstitutor, testServices: TestServices ) { - testServices.assertions.assertEquals(symbol.receiverParameter?.type?.let(substitutor::substitute), signature.receiverType) + testServices.assertions.assertEquals(symbol.receiverType?.let(substitutor::substitute), signature.receiverType) testServices.assertions.assertEquals(symbol.returnType.let(substitutor::substitute), signature.returnType) testServices.assertions.assertEquals(symbol.valueParameters.size, signature.valueParameters.size) @@ -118,7 +118,7 @@ abstract class AbstractAnalysisApiSignatureContractsTest : AbstractAnalysisApiSi substitutor: KtSubstitutor, testServices: TestServices ) { - testServices.assertions.assertEquals(symbol.receiverParameter?.type?.let(substitutor::substitute), signature.receiverType) + testServices.assertions.assertEquals(symbol.receiverType?.let(substitutor::substitute), signature.receiverType) testServices.assertions.assertEquals(symbol.returnType.let(substitutor::substitute), signature.returnType) } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt index c8c22fbc2c2..3bbf2721c62 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt @@ -23,6 +23,9 @@ public sealed class KtCallableSymbol : KtSymbolWithKind, KtPossibleMemberSymbol, abstract override fun createPointer(): KtSymbolPointer } +public val KtCallableSymbol.receiverType: KtType? + get() = receiverParameter?.type + /** * Symbol for a receiver parameter of a function or property. For example, consider code `fun String.foo() {...}`, the declaration of * `String` receiver parameter is such a symbol. diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/PsiDeclarationAndKtSymbolEqualityChecker.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/PsiDeclarationAndKtSymbolEqualityChecker.kt index 6a9f41e07d3..d8afd13241f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/PsiDeclarationAndKtSymbolEqualityChecker.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/PsiDeclarationAndKtSymbolEqualityChecker.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.receiverType import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode @@ -51,7 +52,7 @@ internal object PsiDeclarationAndKtSymbolEqualityChecker { if (psi.parameterList.parametersCount != valueParameterCount) return false if (symbol.isExtension) { val psiParameter = psi.parameterList.parameters[0] - if (symbol.receiverParameter?.type?.let { isTheSameTypes(psi, psiParameter.type, it, isVararg = false) } != true) return false + if (symbol.receiverType?.let { isTheSameTypes(psi, psiParameter.type, it, isVararg = false) } != true) return false } val offset = if (symbol.isExtension) 1 else 0 symbol.valueParameters.forEachIndexed { index, valueParameterSymbol ->