From 2155a23e4ed288e80e7d8be2860f75bf1506bfdf Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 22 Nov 2022 11:14:46 +0100 Subject: [PATCH] [AA FIR] implement FirCallableSignature to simplify search by signature ^KT-54826 Fixed --- ...sSourceModuleSymbolByPsiTestGenerated.java | 12 ++ .../api/fir/symbols/KtFirConstructorSymbol.kt | 14 +- .../api/fir/symbols/KtFirFunctionSymbol.kt | 10 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 10 +- .../fir/symbols/KtFirTypeParameterSymbol.kt | 3 +- .../symbols/pointers/FirCallableSignature.kt | 113 +++++++++++-- ...sSourceModuleSymbolByPsiTestGenerated.java | 12 ++ ...sSourceModuleSymbolByPsiTestGenerated.java | 12 ++ .../GenericFromFunctionInLocalClass2.kt | 2 +- .../Implement_java_util_Collection.kt | 1 + .../contextReceivers/similarSignatures.kt | 16 ++ .../similarSignatures.pretty.txt | 11 ++ .../contextReceivers/similarSignatures.txt | 159 ++++++++++++++++++ .../symbolByPsi/similarGenericSignature.kt | 6 + .../similarGenericSignature.pretty.txt | 5 + .../symbolByPsi/similarGenericSignature.txt | 142 ++++++++++++++++ .../fir/backend/Fir2IrSignatureComposer.kt | 1 - .../signaturer/FirBasedSignatureComposer.kt | 3 +- .../fir/renderer/FirAnnotationRenderer.kt | 5 +- .../kotlin/fir/renderer/FirRenderer.kt | 66 ++++---- .../fir/renderer/FirRendererComponents.kt | 12 +- .../fir/renderer/FirValueParameterRenderer.kt | 4 +- 22 files changed, 546 insertions(+), 73 deletions(-) create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index f4258f7a3a4..e7937309dba 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -244,6 +244,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A runTest("analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerTypeAlias.kt"); } + @Test + @TestMetadata("similarGenericSignature.kt") + public void testSimilarGenericSignature() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt"); + } + @Test @TestMetadata("topLevelFunctions.kt") public void testTopLevelFunctions() throws Exception { @@ -306,6 +312,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A public void testContextReceiversOnProperty() throws Exception { runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt"); } + + @Test + @TestMetadata("similarSignatures.kt") + public void testSimilarSignatures() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt"); + } } @Nested 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 664a1c2b302..3acd2dd4bf7 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 @@ -9,8 +9,8 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.FirCallableSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirConstructorSymbolPointer -import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken @@ -37,7 +37,7 @@ internal class KtFirConstructorSymbol( private val builder: KtSymbolByFirBuilder ) : KtConstructorSymbol(), KtFirSymbol { override val psi: PsiElement? by cached { firSymbol.findPsi() } - + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } override val valueParameters: List by cached { firSymbol.createKtValueParameters(builder) } @@ -49,7 +49,13 @@ internal class KtFirConstructorSymbol( override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } + override val annotationsList by cached { + KtFirAnnotationListForDeclaration.create( + firSymbol, + firResolveSession.useSiteFirSession, + token, + ) + } override val containingClassIdIfNonLocal: ClassId? get() = withValidityAssertion { firSymbol.containingClassLookupTag()?.classId?.takeUnless { it.isLocal } } @@ -65,7 +71,7 @@ internal class KtFirConstructorSymbol( throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException("constructor") } - KtFirConstructorSymbolPointer(requireOwnerPointer(), isPrimary, firSymbol.createSignature()) + KtFirConstructorSymbolPointer(requireOwnerPointer(), isPrimary, FirCallableSignature.createSignature(firSymbol)) } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt index 76084ceee5a..d6ec57f4b4d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt @@ -10,9 +10,9 @@ import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.FirCallableSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberFunctionSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirTopLevelFunctionSymbolPointer -import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds @@ -96,11 +96,15 @@ internal class KtFirFunctionSymbol( KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } return when (val kind = symbolKind) { - KtSymbolKind.TOP_LEVEL -> KtFirTopLevelFunctionSymbolPointer(firSymbol.callableId, firSymbol.createSignature()) + KtSymbolKind.TOP_LEVEL -> KtFirTopLevelFunctionSymbolPointer( + firSymbol.callableId, + FirCallableSignature.createSignature(firSymbol), + ) + KtSymbolKind.CLASS_MEMBER -> KtFirMemberFunctionSymbolPointer( requireOwnerPointer(), firSymbol.name, - firSymbol.createSignature(), + FirCallableSignature.createSignature(firSymbol), ) KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt index fb2b95c0506..4436d2c7027 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -12,9 +12,9 @@ import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.FirCallableSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirTopLevelPropertySymbolPointer -import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken @@ -136,12 +136,16 @@ internal class KtFirKotlinPropertySymbol( } return when (val kind = symbolKind) { - KtSymbolKind.TOP_LEVEL -> KtFirTopLevelPropertySymbolPointer(firSymbol.callableId, firSymbol.createSignature()) + KtSymbolKind.TOP_LEVEL -> KtFirTopLevelPropertySymbolPointer( + firSymbol.callableId, + FirCallableSignature.createSignature(firSymbol), + ) + KtSymbolKind.CLASS_MEMBER -> KtFirMemberPropertySymbolPointer( requireOwnerPointer(), firSymbol.name, - firSymbol.createSignature(), + FirCallableSignature.createSignature(firSymbol), ) else -> throw UnsupportedSymbolKind(this::class, kind) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt index a863331d323..af359c91cd8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt @@ -1,11 +1,12 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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 import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration 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 index affb9099e21..ba21b325f6b 100644 --- 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 @@ -5,26 +5,109 @@ 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.FirFunction import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.renderWithType +import org.jetbrains.kotlin.fir.renderer.ConeIdFullRenderer +import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer +import org.jetbrains.kotlin.fir.renderer.FirRenderer import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase -import org.jetbrains.kotlin.ir.util.IdSignature +import org.jetbrains.kotlin.fir.types.FirTypeRef -internal data class FirCallableSignature(private val idSignature: IdSignature) { - fun sameSignature(declaration: FirCallableDeclaration): Boolean = this == declaration.createSignature() +/** + * **Note**: the signature doesn't contain a name. This check should be done externally. + */ +internal class FirCallableSignature private constructor( + private val receiverType: String?, + private val contextReceiverTypes: List, + private val parameters: List?, + private val typeParametersCount: Int, + private val returnType: String, +) { fun sameSignature(declaration: FirCallableSymbol<*>): Boolean = sameSignature(declaration.fir) + + fun sameSignature(declaration: FirCallableDeclaration): Boolean { + if ((receiverType == null) != (declaration.receiverParameter == null)) return false + if (contextReceiverTypes.size != declaration.contextReceivers.size) return false + if (typeParametersCount != declaration.typeParameters.size) return false + if (parameters?.size != (declaration as? FirFunction)?.valueParameters?.size) return false + + declaration.lazyResolveToPhase(FirResolvePhase.TYPES) + if (receiverType != declaration.receiverParameter?.typeRef?.renderType()) return false + + val receivers = declaration.contextReceivers + for ((index, parameter) in contextReceiverTypes.withIndex()) { + if (receivers[index].typeRef.renderType() != parameter) return false + } + + if (declaration is FirFunction) { + requireNotNull(parameters) + for ((index, parameter) in declaration.valueParameters.withIndex()) { + if (parameters[index] != parameter.returnTypeRef.renderType()) return false + } + } + + declaration.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + + return returnType == declaration.returnTypeRef.renderType() + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is FirCallableSignature) return false + + if (receiverType != other.receiverType) return false + if (contextReceiverTypes != other.contextReceiverTypes) return false + if (parameters != other.parameters) return false + if (typeParametersCount != other.typeParametersCount) return false + return returnType == other.returnType + + } + + override fun hashCode(): Int { + var result = receiverType?.hashCode() ?: 0 + result = 31 * result + contextReceiverTypes.hashCode() + result = 31 * result + parameters.hashCode() + result = 31 * result + typeParametersCount.hashCode() + result = 31 * result + returnType.hashCode() + return result + } + + companion object { + fun createSignature(callableSymbol: FirCallableSymbol<*>): FirCallableSignature = createSignature(callableSymbol.fir) + + fun createSignature(callableDeclaration: FirCallableDeclaration): FirCallableSignature { + callableDeclaration.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + + return FirCallableSignature( + receiverType = callableDeclaration.receiverParameter?.typeRef?.renderType(), + contextReceiverTypes = callableDeclaration.contextReceivers.map { it.typeRef.renderType() }, + parameters = if (callableDeclaration is FirFunction) { + callableDeclaration.valueParameters.map { it.returnTypeRef.renderType() } + } else { + null + }, + typeParametersCount = callableDeclaration.typeParameters.size, + returnType = callableDeclaration.returnTypeRef.renderType(), + ) + } + } } -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") - ) -} +private fun FirTypeRef.renderType(): String = FirRenderer( + annotationRenderer = null, + bodyRenderer = null, + callArgumentsRenderer = null, + classMemberRenderer = null, + contractRenderer = null, + declarationRenderer = null, + idRenderer = ConeIdFullRenderer(), + modifierRenderer = null, + packageDirectiveRenderer = null, + propertyAccessorRenderer = null, + resolvePhaseRenderer = null, + typeRenderer = ConeTypeRenderer(), + valueParameterRenderer = null, + errorExpressionRenderer = null, +).renderElementAsString(this) diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index 1ceada908e0..81b216789c4 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -244,6 +244,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab runTest("analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerTypeAlias.kt"); } + @Test + @TestMetadata("similarGenericSignature.kt") + public void testSimilarGenericSignature() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt"); + } + @Test @TestMetadata("topLevelFunctions.kt") public void testTopLevelFunctions() throws Exception { @@ -306,6 +312,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab public void testContextReceiversOnProperty() throws Exception { runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt"); } + + @Test + @TestMetadata("similarSignatures.kt") + public void testSimilarSignatures() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt"); + } } @Nested diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index 1cc9c5aca4a..c13153b4f79 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -244,6 +244,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerTypeAlias.kt"); } + @Test + @TestMetadata("similarGenericSignature.kt") + public void testSimilarGenericSignature() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt"); + } + @Test @TestMetadata("topLevelFunctions.kt") public void testTopLevelFunctions() throws Exception { @@ -306,6 +312,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext public void testContextReceiversOnProperty() throws Exception { runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt"); } + + @Test + @TestMetadata("similarSignatures.kt") + public void testSimilarSignatures() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt"); + } } @Nested diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromFunctionInLocalClass2.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromFunctionInLocalClass2.kt index 28f17b66c6c..64173629310 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromFunctionInLocalClass2.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/GenericFromFunctionInLocalClass2.kt @@ -1,5 +1,5 @@ // DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE -// DO_NOT_CHECK_SYMBOL_RESTORE +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 package test class SomeClass diff --git a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/Implement_java_util_Collection.kt b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/Implement_java_util_Collection.kt index 61a3c3141d9..c364a2876a9 100644 --- a/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/Implement_java_util_Collection.kt +++ b/analysis/analysis-api/testData/scopes/substitutionOverridesUnwrapping/Implement_java_util_Collection.kt @@ -1,4 +1,5 @@ // DO_NOT_CHECK_SYMBOL_RESTORE_K2 +// KT-55095 package test diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt new file mode 100644 index 00000000000..9d19e6baf79 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.kt @@ -0,0 +1,16 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 + +class A +class B + +context(A) +fun tooo() = Unit + +context(B) +fun tooo() = Unit + +context(A, B) +fun tooo() = Unit + +context(B, A) +fun tooo() = Unit \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt new file mode 100644 index 00000000000..284829da84f --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt @@ -0,0 +1,11 @@ +fun tooo() + +fun tooo() + +fun tooo() + +fun tooo() + +class A + +class B \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.txt new file mode 100644 index 00000000000..0daad02316d --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.txt @@ -0,0 +1,159 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: A + classKind: CLASS + companionObject: null + contextReceivers: [] + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: A + origin: SOURCE + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: B + classKind: CLASS + companionObject: null + contextReceivers: [] + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: B + origin: SOURCE + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /tooo + contextReceivers: [ + ContextReceiver(A) + ] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: tooo + origin: SOURCE + receiverParameter: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /tooo + contextReceivers: [ + ContextReceiver(B) + ] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: tooo + origin: SOURCE + receiverParameter: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /tooo + contextReceivers: [ + ContextReceiver(A) + ContextReceiver(B) + ] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: tooo + origin: SOURCE + receiverParameter: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /tooo + contextReceivers: [ + ContextReceiver(B) + ContextReceiver(A) + ] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: tooo + origin: SOURCE + receiverParameter: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt new file mode 100644 index 00000000000..a37cc660f12 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.kt @@ -0,0 +1,6 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 + +open class A + +fun foo(j: J): J = j +fun foo(j: T): T = j \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.pretty.txt new file mode 100644 index 00000000000..dc882a8be69 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.pretty.txt @@ -0,0 +1,5 @@ +fun foo(j: J): J + +fun foo(j: T): T + +open class A \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.txt new file mode 100644 index 00000000000..b79113dba68 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/similarGenericSignature.txt @@ -0,0 +1,142 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: A + classKind: CLASS + companionObject: null + contextReceivers: [] + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: OPEN + name: A + origin: SOURCE + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: J + origin: SOURCE + typeParameters: [] + upperBounds: [ + A + ] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverParameter: null + returnType: J + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(J) + ] + valueParameters: [ + KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: j + origin: SOURCE + receiverParameter: null + returnType: J + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverParameter: null + returnType: T + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [ + KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: j + origin: SOURCE + receiverParameter: null + returnType: T + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt index 67f13eb1832..a013a9cbf5f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt @@ -18,7 +18,6 @@ interface Fir2IrSignatureComposer { declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag? = null, forceTopLevelPrivate: Boolean = false, - allowLocalClasses: Boolean = false, ): IdSignature? fun composeAccessorSignature( diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 8c312f47bdc..26b8384edc9 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -85,13 +85,12 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?, forceTopLevelPrivate: Boolean, - allowLocalClasses: Boolean, ): IdSignature? { if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirCallableDeclaration) { if (declaration.visibility == Visibilities.Local) return null - if (!allowLocalClasses && (declaration.dispatchReceiverClassLookupTagOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true)) return null + if (declaration.dispatchReceiverClassLookupTagOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null } val declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt index 65cbf70458e..a443aec3034 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirAnnotationRenderer.kt @@ -39,11 +39,12 @@ open class FirAnnotationRenderer { annotation.annotationTypeRef.accept(visitor) when (annotation) { is FirAnnotationCall -> if (annotation.calleeReference.let { it is FirResolvedNamedReference || it is FirErrorNamedReference }) { - callArgumentsRenderer.renderArgumentMapping(annotation.argumentMapping) + callArgumentsRenderer?.renderArgumentMapping(annotation.argumentMapping) } else { visitor.visitCall(annotation) } - else -> callArgumentsRenderer.renderArgumentMapping(annotation.argumentMapping) + + else -> callArgumentsRenderer?.renderArgumentMapping(annotation.argumentMapping) } if (annotation.useSiteTarget == AnnotationUseSiteTarget.FILE) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt index 35cfb8c39a1..b7e3f721cb5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt @@ -31,18 +31,18 @@ class FirRenderer( builder: StringBuilder = StringBuilder(), override val annotationRenderer: FirAnnotationRenderer? = FirAnnotationRenderer(), override val bodyRenderer: FirBodyRenderer? = FirBodyRenderer(), - override val callArgumentsRenderer: FirCallArgumentsRenderer = FirCallArgumentsRenderer(), - override val classMemberRenderer: FirClassMemberRenderer = FirClassMemberRenderer(), + override val callArgumentsRenderer: FirCallArgumentsRenderer? = FirCallArgumentsRenderer(), + override val classMemberRenderer: FirClassMemberRenderer? = FirClassMemberRenderer(), override val contractRenderer: ConeContractRenderer? = ConeContractRenderer(), - override val declarationRenderer: FirDeclarationRenderer = FirDeclarationRenderer(), + override val declarationRenderer: FirDeclarationRenderer? = FirDeclarationRenderer(), override val idRenderer: ConeIdRenderer = ConeIdRendererForDebugging(), - override val modifierRenderer: FirModifierRenderer = FirAllModifierRenderer(), + override val modifierRenderer: FirModifierRenderer? = FirAllModifierRenderer(), override val packageDirectiveRenderer: FirPackageDirectiveRenderer? = null, override val propertyAccessorRenderer: FirPropertyAccessorRenderer? = FirPropertyAccessorRenderer(), override val resolvePhaseRenderer: FirResolvePhaseRenderer? = null, override val typeRenderer: ConeTypeRenderer = ConeTypeRendererForDebugging(), - override val valueParameterRenderer: FirValueParameterRenderer = FirValueParameterRenderer(), - override val errorExpressionRenderer: FirErrorExpressionRenderer = FirErrorExpressionOnlyErrorRenderer(), + override val valueParameterRenderer: FirValueParameterRenderer? = FirValueParameterRenderer(), + override val errorExpressionRenderer: FirErrorExpressionRenderer? = FirErrorExpressionOnlyErrorRenderer(), ) : FirRendererComponents { override val visitor = Visitor() @@ -65,19 +65,19 @@ class FirRenderer( init { annotationRenderer?.components = this bodyRenderer?.components = this - callArgumentsRenderer.components = this - classMemberRenderer.components = this + callArgumentsRenderer?.components = this + classMemberRenderer?.components = this contractRenderer?.components = this - declarationRenderer.components = this + declarationRenderer?.components = this idRenderer.builder = builder - modifierRenderer.components = this + modifierRenderer?.components = this packageDirectiveRenderer?.components = this propertyAccessorRenderer?.components = this resolvePhaseRenderer?.components = this typeRenderer.builder = builder typeRenderer.idRenderer = idRenderer - valueParameterRenderer.components = this - errorExpressionRenderer.components = this + valueParameterRenderer?.components = this + errorExpressionRenderer?.components = this } fun renderElementAsString(element: FirElement): String { @@ -200,7 +200,7 @@ class FirRenderer( } if (callableDeclaration is FirFunction) { - valueParameterRenderer.renderParameters(callableDeclaration.valueParameters) + valueParameterRenderer?.renderParameters(callableDeclaration.valueParameters) } print(": ") callableDeclaration.returnTypeRef.accept(this) @@ -220,8 +220,8 @@ class FirRenderer( } override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) { - modifierRenderer.renderModifiers(memberDeclaration) - declarationRenderer.render(memberDeclaration) + modifierRenderer?.renderModifiers(memberDeclaration) + declarationRenderer?.render(memberDeclaration) when (memberDeclaration) { is FirClassLikeDeclaration -> { if (memberDeclaration is FirRegularClass) { @@ -247,7 +247,7 @@ class FirRenderer( annotationRenderer?.render(regularClass) visitMemberDeclaration(regularClass) renderSupertypes(regularClass) - classMemberRenderer.render(regularClass) + classMemberRenderer?.render(regularClass) } override fun visitEnumEntry(enumEntry: FirEnumEntry) { @@ -266,7 +266,7 @@ class FirRenderer( annotationRenderer?.render(anonymousObject) print("object : ") renderSeparated(anonymousObject.superTypeRefs, visitor) - classMemberRenderer.render(anonymousObject.declarations) + classMemberRenderer?.render(anonymousObject.declarations) } override fun visitVariable(variable: FirVariable) { @@ -293,7 +293,7 @@ class FirRenderer( } override fun visitBackingField(backingField: FirBackingField) { - modifierRenderer.renderModifiers(backingField) + modifierRenderer?.renderModifiers(backingField) print(": ") backingField.returnTypeRef.accept(this) @@ -319,11 +319,11 @@ class FirRenderer( override fun visitConstructor(constructor: FirConstructor) { annotationRenderer?.render(constructor) - modifierRenderer.renderModifiers(constructor) - declarationRenderer.render(constructor) + modifierRenderer?.renderModifiers(constructor) + declarationRenderer?.render(constructor) constructor.typeParameters.renderTypeParameters() - valueParameterRenderer.renderParameters(constructor.valueParameters) + valueParameterRenderer?.renderParameters(constructor.valueParameters) print(": ") constructor.returnTypeRef.accept(this) val body = constructor.body @@ -336,9 +336,9 @@ class FirRenderer( override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) { annotationRenderer?.render(propertyAccessor) - modifierRenderer.renderModifiers(propertyAccessor) - declarationRenderer.render(propertyAccessor) - valueParameterRenderer.renderParameters(propertyAccessor.valueParameters) + modifierRenderer?.renderModifiers(propertyAccessor) + declarationRenderer?.render(propertyAccessor) + valueParameterRenderer?.renderParameters(propertyAccessor.valueParameters) print(": ") propertyAccessor.returnTypeRef.accept(this) contractRenderer?.render(propertyAccessor) @@ -351,7 +351,7 @@ class FirRenderer( override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) { annotationRenderer?.render(anonymousFunction) - declarationRenderer.render(anonymousFunction) + declarationRenderer?.render(anonymousFunction) print(" ") val receiverParameter = anonymousFunction.receiverParameter if (receiverParameter != null) { @@ -365,7 +365,7 @@ class FirRenderer( ) { print("()") } - valueParameterRenderer.renderParameters(anonymousFunction.valueParameters) + valueParameterRenderer?.renderParameters(anonymousFunction.valueParameters) print(": ") anonymousFunction.returnTypeRef.accept(this) print("