From 13917887e0a3ba432c61433609261deee0059ad7 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Mon, 19 Dec 2022 14:04:55 +0100 Subject: [PATCH] [AA] KtSymbolPointer: introduce `pointsToTheSameSymbolAs` method ^KT-55191 --- .../KtFe10DescEnumEntrySymbolPointer.kt | 10 +- .../KtFe10DescFunctionLikeSymbolPointer.kt | 10 +- ...tFe10DescNamedClassOrObjectSymbolSymbol.kt | 9 +- .../KtFe10DescSamConstructorSymbolPointer.kt | 9 +- .../KtFe10DescSyntheticFieldSymbolPointer.kt | 9 +- .../pointers/KtFe10PackageSymbolPointer.kt | 9 +- ...0PsiDefaultSetterParameterSymbolPointer.kt | 27 ++++++ .../KtFe10PsiDefaultSetterParameterSymbol.kt | 8 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 15 +-- .../api/fir/symbols/KtFirPackageSymbol.kt | 10 +- .../KtFirBackingFieldSymbolPointer.kt | 5 + .../pointers/KtFirClassLikeSymbolPointer.kt | 6 ++ .../pointers/KtFirConstructorSymbolPointer.kt | 7 ++ .../KtFirEnumEntryInitializerSymbolPointer.kt | 5 + .../pointers/KtFirEnumEntrySymbolPointer.kt | 9 +- .../pointers/KtFirJavaFieldSymbolPointer.kt | 6 ++ ...KtFirJavaSyntheticPropertySymbolPointer.kt | 7 ++ .../KtFirMemberFunctionSymbolPointer.kt | 7 ++ .../KtFirMemberPropertySymbolPointer.kt | 7 ++ .../pointers/KtFirMemberSymbolPointer.kt | 4 + .../pointers/KtFirPackageSymbolPointer.kt | 25 +++++ .../KtFirPsiBasedPropertySymbolPointer.kt | 30 ++++++ .../KtFirReceiverParameterSymbolPointer.kt | 5 + .../KtFirSamConstructorSymbolPointer.kt | 7 +- .../KtFirTopLevelCallableSymbolPointer.kt | 6 +- .../KtFirTopLevelFunctionSymbolPointer.kt | 9 +- .../KtFirTopLevelPropertySymbolPointer.kt | 7 ++ .../KtFirTypeParameterSymbolPointer.kt | 7 ++ .../KtFirValueParameterSymbolPointer.kt | 6 ++ .../KtPropertyAccessorSymbolPointer.kt | 6 ++ ...ParameterFromDefaultSetterSymbolPointer.kt | 4 + .../test/cases/symbols/AbstractSymbolTest.kt | 92 +++++++++++++++---- .../pointers/KtPsiBasedSymbolPointer.kt | 5 + .../api/symbols/pointers/KtSymbolPointer.kt | 7 +- 34 files changed, 337 insertions(+), 58 deletions(-) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PsiDefaultSetterParameterSymbolPointer.kt create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPackageSymbolPointer.kt create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPsiBasedPropertySymbolPointer.kt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescEnumEntrySymbolPointer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescEnumEntrySymbolPointer.kt index b1fd4d14761..faabfbb2fb5 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescEnumEntrySymbolPointer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescEnumEntrySymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind @@ -33,4 +34,9 @@ class KtFe10DescEnumEntrySymbolPointer(private val classId: ClassId, private val return null } -} \ No newline at end of file + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10DescEnumEntrySymbolPointer && + other.classId == classId && + other.entryName == entryName +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescFunctionLikeSymbolPointer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescFunctionLikeSymbolPointer.kt index 070b3e92d6c..06daad4bb53 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescFunctionLikeSymbolPointer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescFunctionLikeSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolPointerSignature import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies @@ -44,4 +45,9 @@ class KtFe10DescFunctionLikeSymbolPointer( .firstOrNull { it.getSymbolPointerSignature() == signature } ?.toKtCallableSymbol(analysisContext) as? T } -} \ No newline at end of file + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10DescFunctionLikeSymbolPointer && + other.callableId == callableId && + other.signature == signature +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescNamedClassOrObjectSymbolSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescNamedClassOrObjectSymbolSymbol.kt index 134bba943de..5ed31e4febf 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescNamedClassOrObjectSymbolSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescNamedClassOrObjectSymbolSymbol.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies import org.jetbrains.kotlin.name.ClassId @@ -22,4 +23,8 @@ class KtFe10DescNamedClassOrObjectSymbolSymbol(private val classId: ClassId) : K val descriptor = analysisContext.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: return null return KtFe10DescNamedClassOrObjectSymbol(descriptor, analysisContext) } -} \ No newline at end of file + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10DescNamedClassOrObjectSymbolSymbol && + other.classId == classId +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSamConstructorSymbolPointer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSamConstructorSymbolPointer.kt index 9b60dbbecdb..62149a516b2 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSamConstructorSymbolPointer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSamConstructorSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescSamConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies import org.jetbrains.kotlin.load.java.sam.JvmSamConversionOracle @@ -36,4 +37,8 @@ class KtFe10DescSamConstructorSymbolPointer(private val classId: ClassId) : KtSy return KtFe10DescSamConstructorSymbol(constructorDescriptor, analysisContext) } -} \ No newline at end of file + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10DescSamConstructorSymbolPointer && + other.classId == classId +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSyntheticFieldSymbolPointer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSyntheticFieldSymbolPointer.kt index fc9f23d1db6..35b43f5b1db 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSyntheticFieldSymbolPointer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10DescSyntheticFieldSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtF import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor @@ -31,4 +32,8 @@ class KtFe10DescSyntheticFieldSymbolPointer( val syntheticFieldDescriptor = SyntheticFieldDescriptor(accessorDescriptor, accessorDescriptor.correspondingProperty.source) return KtFe10DescSyntheticFieldSymbol(syntheticFieldDescriptor, analysisContext) } -} \ No newline at end of file + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10DescSyntheticFieldSymbolPointer && + other.psiPointer.pointsToTheSameSymbolAs(psiPointer) +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PackageSymbolPointer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PackageSymbolPointer.kt index bcfb4133fbe..e25341bf970 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PackageSymbolPointer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PackageSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.FqName @@ -18,4 +19,8 @@ internal class KtFe10PackageSymbolPointer(private val packageName: FqName) : KtS check(analysisSession is KtFe10AnalysisSession) return KtFe10PackageSymbol(packageName, analysisSession.analysisContext) } -} \ No newline at end of file + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10PackageSymbolPointer && + other.packageName == packageName +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PsiDefaultSetterParameterSymbolPointer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PsiDefaultSetterParameterSymbolPointer.kt new file mode 100644 index 00000000000..f1e0912d493 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/pointers/KtFe10PsiDefaultSetterParameterSymbolPointer.kt @@ -0,0 +1,27 @@ +/* + * 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.descriptors.symbols.pointers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer + +class KtFe10PsiDefaultSetterParameterSymbolPointer( + private val propertySymbolPointer: KtPsiBasedSymbolPointer, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtValueParameterSymbol? { + val property = with(analysisSession) { propertySymbolPointer.restoreSymbol() } + return property?.parameter + } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFe10PsiDefaultSetterParameterSymbolPointer && + other.propertySymbolPointer.pointsToTheSameSymbolAs(propertySymbolPointer) +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt index bcf95cb8269..fd3af8cda25 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.calculateHashCode import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.descriptors.symbols.isEqualTo import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10PsiDefaultSetterParameterSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorType import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList @@ -24,7 +25,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointerDelegator import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.name.Name @@ -72,9 +72,9 @@ internal class KtFe10PsiDefaultSetterParameterSymbol( context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { - KtPsiBasedSymbolPointer.createForSymbolFromPsi(accessorPsi)?.let { symbolPointer -> - symbolPointerDelegator(symbolPointer) { it.parameter } - } ?: KtFe10NeverRestoringSymbolPointer() + KtPsiBasedSymbolPointer.createForSymbolFromPsi(accessorPsi) + ?.let(::KtFe10PsiDefaultSetterParameterSymbolPointer) + ?: KtFe10NeverRestoringSymbolPointer() } override fun equals(other: Any?): Boolean = isEqualTo(other) 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 48b98f62ed7..68731692cdb 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 @@ -13,10 +13,7 @@ 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.requireOwnerPointer +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.* import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion @@ -25,7 +22,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind -import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointerDelegator import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.descriptors.Modality @@ -128,13 +124,7 @@ internal class KtFirKotlinPropertySymbol( context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { psiPointer -> - return symbolPointerDelegator(psiPointer) { - when (it) { - is KtKotlinPropertySymbol -> it - is KtValueParameterSymbol -> it.generatedPrimaryConstructorProperty - else -> null - } - } + return KtFirPsiBasedPropertySymbolPointer(psiPointer) } return when (val kind = symbolKind) { @@ -158,3 +148,4 @@ internal class KtFirKotlinPropertySymbol( override fun equals(other: Any?): Boolean = symbolEquals(other) override fun hashCode(): Int = symbolHashCode() } + diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt index 3740bd4f927..012078465c5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt @@ -12,7 +12,7 @@ import com.intellij.psi.PsiManager import com.intellij.psi.impl.file.PsiPackageImpl import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirPackageSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointer import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.name.FqName @@ -38,12 +37,7 @@ class KtFirPackageSymbol( get() = withValidityAssertion { KtSymbolOrigin.SOURCE } // TODO context(KtAnalysisSession) - override fun createPointer(): KtSymbolPointer = withValidityAssertion { - symbolPointer { session -> - check(session is KtFirAnalysisSession) - session.firSymbolBuilder.createPackageSymbolIfOneExists(fqName) - } - } + override fun createPointer(): KtSymbolPointer = KtFirPackageSymbolPointer(fqName) override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt index 646e4439b4c..f763b9d5cd8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer internal class KtFirBackingFieldSymbolPointer( @@ -25,4 +26,8 @@ internal class KtFirBackingFieldSymbolPointer( check(propertySymbol is KtFirKotlinPropertySymbol) return analysisSession.firSymbolBuilder.variableLikeBuilder.buildBackingFieldSymbolByProperty(propertySymbol.firSymbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirBackingFieldSymbolPointer && + other.propertySymbolPointer.pointsToTheSameSymbolAs(propertySymbolPointer) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt index 0b00ea9aa4a..d5ccaaaa75f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirClassLikeSymbolPointer.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.ClassId import kotlin.reflect.KClass @@ -25,4 +26,9 @@ internal class KtFirClassLikeSymbolPointer( @Suppress("UNCHECKED_CAST") return classLikeSymbol as T } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = other === this || + other is KtFirClassLikeSymbolPointer && + other.classId == classId && + other.expectedClass == expectedClass } 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 3025a4e1b4c..a2967102fa9 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession @@ -29,4 +30,10 @@ internal class KtFirConstructorSymbolPointer( if (firConstructor.isPrimary != isPrimary) return null return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor.symbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = other === this || + other is KtFirConstructorSymbolPointer && + other.signature == signature && + other.isPrimary == isPrimary && + hasTheSameOwner(other) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntryInitializerSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntryInitializerSymbolPointer.kt index d8d0ada76aa..64732ebfbfe 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntryInitializerSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntryInitializerSymbolPointer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression @@ -26,4 +27,8 @@ internal class KtFirEnumEntryInitializerSymbolPointer( val initializer = owner?.firSymbol?.fir?.initializer as? FirAnonymousObjectExpression ?: return null return analysisSession.firSymbolBuilder.classifierBuilder.buildAnonymousObjectSymbol(initializer.anonymousObject.symbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirEnumEntryInitializerSymbolPointer && + other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt index 53e1cfae621..fff02d07d44 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt @@ -1,5 +1,5 @@ /* - * 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. */ @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.declarations.FirEnumEntry @@ -37,5 +38,9 @@ internal class KtFirEnumEntrySymbolPointer( declarations.firstOrNull { member -> member is FirEnumEntry && member.name == name } as FirEnumEntry? -} + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = other === this || + other is KtFirEnumEntrySymbolPointer && + other.name == name && + other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt index 3fffd2d3b2f..e4d146f52dc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession @@ -27,4 +28,9 @@ internal class KtFirJavaFieldSymbolPointer( val javaField = candidates.getProperties(fieldName).mapNotNull { it.fir as? FirJavaField }.singleOrNull() ?: return null return firSymbolBuilder.variableLikeBuilder.buildFieldSymbol(javaField.symbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirJavaFieldSymbolPointer && + other.fieldName == fieldName && + hasTheSameOwner(other) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt index 2d2fce41dad..b715b84490b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSyntheticJavaPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -49,4 +50,10 @@ internal class KtFirJavaSyntheticPropertySymbolPointer( baseScope } } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirJavaSyntheticPropertySymbolPointer && + other.propertyName == propertyName && + other.isSynthetic == isSynthetic && + hasTheSameOwner(other) } 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 53dce67f06c..07f93ae0eed 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession @@ -29,4 +30,10 @@ internal class KtFirMemberFunctionSymbolPointer( } ?: return null return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirMemberFunctionSymbolPointer && + other.name == name && + other.signature == signature && + hasTheSameOwner(other) } 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 ca313fce839..188a6bcf716 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession @@ -30,4 +31,10 @@ internal class KtFirMemberPropertySymbolPointer( return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firProperty.symbol) as? KtKotlinPropertySymbol } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirMemberPropertySymbolPointer && + other.name == name && + other.signature == signature && + hasTheSameOwner(other) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt index 3168776e65b..2ef25d19b8d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt @@ -51,6 +51,10 @@ internal abstract class KtFirMemberSymbolPointer( ) } } + + abstract override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean + protected fun hasTheSameOwner(other: KtFirMemberSymbolPointer<*>): Boolean = + other.isStatic == isStatic && other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) } context(KtAnalysisSession) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPackageSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPackageSymbolPointer.kt new file mode 100644 index 00000000000..22f98aac969 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPackageSymbolPointer.kt @@ -0,0 +1,25 @@ +/* + * 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.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.name.FqName + +class KtFirPackageSymbolPointer(private val fqName: FqName) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtPackageSymbol? { + check(analysisSession is KtFirAnalysisSession) + return analysisSession.firSymbolBuilder.createPackageSymbolIfOneExists(fqName) + } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirPackageSymbolPointer && + other.fqName == fqName +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPsiBasedPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPsiBasedPropertySymbolPointer.kt new file mode 100644 index 00000000000..729ee0858bc --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPsiBasedPropertySymbolPointer.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.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer + +class KtFirPsiBasedPropertySymbolPointer( + private val variableSymbolPointer: KtPsiBasedSymbolPointer, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtKotlinPropertySymbol? = + when (val variable = with(analysisSession) { variableSymbolPointer.restoreSymbol() }) { + is KtKotlinPropertySymbol -> variable + is KtValueParameterSymbol -> variable.generatedPrimaryConstructorProperty + else -> null + } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirPsiBasedPropertySymbolPointer && + other.variableSymbolPointer.pointsToTheSameSymbolAs(variableSymbolPointer) +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt index 964aafb3278..7a07234b293 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer internal class KtFirReceiverParameterSymbolPointer( @@ -24,4 +25,8 @@ internal class KtFirReceiverParameterSymbolPointer( return analysisSession.firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(callableSymbol.firSymbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirReceiverParameterSymbolPointer && + other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt index e1afb1a9d90..e6ef98df7dc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.name.ClassId @@ -24,4 +25,8 @@ internal class KtFirSamConstructorSymbolPointer( return classSymbol.getSamConstructor() } } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirSamConstructorSymbolPointer && + other.ownerClassId == ownerClassId } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelCallableSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelCallableSymbolPointer.kt index 97e391d70a8..446ee14c0cc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelCallableSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelCallableSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 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. */ @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider @@ -30,6 +31,9 @@ internal abstract class KtTopLevelCallableSymbolPointer( candidates: Collection>, firSession: FirSession ): S? + + abstract override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean + protected fun hasTheSameOwner(other: KtTopLevelCallableSymbolPointer<*>): Boolean = other.callableId == callableId } private fun KtFirAnalysisSession.getCallableSymbols(callableId: CallableId) = 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 72c7e7a6f65..986b8ae29cc 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 @@ -1,5 +1,5 @@ /* - * 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. */ @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +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.symbols.impl.FirCallableSymbol @@ -23,4 +25,9 @@ internal class KtFirTopLevelFunctionSymbolPointer( val firFunction = candidates.findDeclarationWithSignatureBySymbols(signature) ?: return null return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirTopLevelFunctionSymbolPointer && + other.signature == signature && + hasTheSameOwner(other) } 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 9ca2e1876e9..795c43e5ab5 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 @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +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.symbols.impl.FirCallableSymbol @@ -21,4 +23,9 @@ internal class KtFirTopLevelPropertySymbolPointer(callableId: CallableId, privat val firProperty = candidates.findDeclarationWithSignatureBySymbols(signature) ?: return null return firSymbolBuilder.variableLikeBuilder.buildPropertySymbol(firProperty.symbol) as? KtKotlinPropertySymbol } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirTopLevelPropertySymbolPointer && + other.signature == signature && + hasTheSameOwner(other) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt index a101bd1730a..670798f8095 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -29,4 +30,10 @@ internal class KtFirTypeParameterSymbolPointer( val firTypeParameterSymbol = ownerSymbol.firSymbol.typeParameterSymbols?.getOrNull(index)?.takeIf { it.name == name } ?: return null return analysisSession.firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firTypeParameterSymbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirTypeParameterSymbolPointer && + other.index == index && + other.name == name && + other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt index e4294d593ca..1d381c4a796 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt @@ -29,4 +29,10 @@ internal class KtFirValueParameterSymbolPointer( val firValueParameterSymbol = function.valueParameters.getOrNull(index)?.symbol?.takeIf { it.name == name } ?: return null return analysisSession.firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(firValueParameterSymbol) } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirValueParameterSymbolPointer && + other.index == index && + other.name == name && + other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) } diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt index ecbae13d0a2..dc146fa2c61 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @KtAnalysisApiInternals @@ -24,4 +25,9 @@ class KtPropertyAccessorSymbolPointer( return if (isGetter) propertySymbol.getter else propertySymbol.setter } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtPropertyAccessorSymbolPointer && + other.isGetter == isGetter && + other.propertySymbolPointer.pointsToTheSameSymbolAs(propertySymbolPointer) } diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt index 5ff88d97df1..197e8f72ff7 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt @@ -22,4 +22,8 @@ class KtValueParameterFromDefaultSetterSymbolPointer( return ownerSymbol?.setter?.parameter } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtValueParameterFromDefaultSetterSymbolPointer && + other.ownerPointer.pointsToTheSameSymbolAs(ownerPointer) } diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt index 74de9c4d18e..700f159b02d 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt @@ -62,24 +62,27 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { fun KtAnalysisSession.safePointer(ktSymbol: KtSymbol): PointerWrapper? { val regularPointer = ktSymbol.runCatching { - KtPsiBasedSymbolPointer.withDisabledPsiBasedPointers(disable = false) { ktSymbol.createPointer() } + createPointerForTest(disablePsiBasedSymbols = false) }.let { if (directiveToIgnoreSymbolRestore == null) it.getOrThrow() else it.getOrNull() } ?: return null - val nonPsiPointer = kotlin.runCatching { - if (ktSymbol is KtFileSymbol) return@runCatching null - - KtPsiBasedSymbolPointer.withDisabledPsiBasedPointers(disable = true) { ktSymbol.createPointer() } + assertSymbolPointer(regularPointer, testServices) + val nonPsiPointer = ktSymbol.runCatching { + if (this is KtFileSymbol) return@runCatching null + createPointerForTest(disablePsiBasedSymbols = true) } - return PointerWrapper( - regularPointer = regularPointer, - pointerWithoutPsiAnchor = if (directiveToIgnoreSymbolRestore == null && directiveToIgnoreNonPsiSymbolRestore == null) - nonPsiPointer.getOrThrow() - else - nonPsiPointer.getOrNull(), - ) + val pointerWithoutPsiAnchor = if (directiveToIgnoreSymbolRestore == null && directiveToIgnoreNonPsiSymbolRestore == null) + nonPsiPointer.getOrThrow() + else + nonPsiPointer.getOrNull() + + if (pointerWithoutPsiAnchor != null) { + assertSymbolPointer(pointerWithoutPsiAnchor, testServices) + } + + return PointerWrapper(regularPointer = regularPointer, pointerWithoutPsiAnchor = pointerWithoutPsiAnchor) } val pointersWithRendered = executeOnPooledThreadInReadAction { @@ -130,7 +133,7 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { restoreSymbolsInOtherReadActionAndCompareResults( directiveToIgnore = directiveToIgnoreSymbolRestore, - pointerAccessor = PointerWrapper::regularPointer, + isRegularPointers = true, ktFile = ktFile, pointersWithRendered = pointersWithRendered.pointers, testServices = testServices, @@ -139,7 +142,7 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { if (directiveToIgnoreSymbolRestore == null) { restoreSymbolsInOtherReadActionAndCompareResults( directiveToIgnore = directiveToIgnoreNonPsiSymbolRestore, - pointerAccessor = PointerWrapper::pointerWithoutPsiAnchor, + isRegularPointers = false, ktFile = ktFile, pointersWithRendered = pointersWithRendered.pointers, testServices = testServices, @@ -147,6 +150,16 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { } } + context(KtAnalysisSession) + private fun KtSymbol.createPointerForTest(disablePsiBasedSymbols: Boolean): KtSymbolPointer<*> = + KtPsiBasedSymbolPointer.withDisabledPsiBasedPointers(disable = disablePsiBasedSymbols) { createPointer() } + + private fun assertSymbolPointer(pointer: KtSymbolPointer<*>, testServices: TestServices) { + testServices.assertions.assertTrue(value = pointer.pointsToTheSameSymbolAs(pointer)) { + "The symbol is not equal to itself: ${pointer::class}" + } + } + private fun RegisteredDirectives.doNotCheckSymbolRestoreDirective(): Directive? = findSpecificDirective( commonDirective = DO_NOT_CHECK_SYMBOL_RESTORE, k1Directive = DO_NOT_CHECK_SYMBOL_RESTORE_K1, @@ -187,17 +200,25 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { private fun restoreSymbolsInOtherReadActionAndCompareResults( directiveToIgnore: Directive?, - pointerAccessor: (PointerWrapper) -> KtSymbolPointer?, + isRegularPointers: Boolean, ktFile: KtFile, pointersWithRendered: List, testServices: TestServices, ) { var failed = false + val restoredPointers = mutableListOf>() try { val restored = analyseForTest(ktFile) { pointersWithRendered.mapNotNull { (pointerWrapper, expectedRender, shouldBeRendered) -> - val pointer = pointerWrapper?.let(pointerAccessor) ?: error("Symbol pointer for $expectedRender was not created") + val pointer = if (isRegularPointers) { + pointerWrapper?.regularPointer + } else { + pointerWrapper?.pointerWithoutPsiAnchor + } ?: error("Symbol pointer for $expectedRender was not created") + val restored = pointer.restoreSymbol() ?: error("Symbol $expectedRender was not restored") + restoredPointers += pointer + val actualRender = renderSymbolForComparison(restored) if (shouldBeRendered) { actualRender @@ -215,6 +236,10 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { failed = true } + if (!failed) { + compareRestoredSymbols(restoredPointers, testServices, ktFile, isRegularPointers) + } + if (failed || directiveToIgnore == null) return testServices.assertions.assertEqualsToTestDataFileSibling( @@ -225,6 +250,41 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { fail("Redundant // ${directiveToIgnore.name} directive") } + private fun compareRestoredSymbols( + restoredPointers: List>, + testServices: TestServices, + ktFile: KtFile, + isRegularPointers: Boolean, + ) { + if (restoredPointers.isEmpty()) return + + analyseForTest(ktFile) { + val symbolsToPointersMap = restoredPointers.groupByTo(mutableMapOf()) { + it.restoreSymbol() ?: error("Unexpectedly non-restored symbol pointer: ${it::class}") + } + + val pointersToCheck = symbolsToPointersMap.map { (key, value) -> + value += if (isRegularPointers) { + key.createPointerForTest(disablePsiBasedSymbols = false) + } else { + key.createPointerForTest(disablePsiBasedSymbols = true) + } + + value + } + + for (pointers in pointersToCheck) { + for (firstPointer in pointers) { + for (secondPointer in pointers) { + testServices.assertions.assertTrue(firstPointer.pointsToTheSameSymbolAs(secondPointer)) { + "${firstPointer::class} is not the same as ${secondPointer::class}" + } + } + } + } + } + } + protected open fun KtAnalysisSession.renderSymbolForComparison(symbol: KtSymbol): String { return with(DebugSymbolRenderer(renderExtra = true)) { render(symbol) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt index 2bc8c7fdf06..5270789af8d 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt @@ -37,6 +37,11 @@ public class KtPsiBasedSymbolPointer private constructor( return symbol as S } + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtPsiBasedSymbolPointer && + other.expectedClass == expectedClass && + other.psiPointer == psiPointer + public constructor(psi: KtElement, expectedClass: KClass) : this(psi.createSmartPointer(), expectedClass) public companion object { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt index 95b009d801e..fe94f3706e2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt @@ -1,5 +1,5 @@ /* - * 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. */ @@ -31,6 +31,11 @@ public abstract class KtSymbolPointer { */ @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") public abstract fun restoreSymbol(analysisSession: KtAnalysisSession): S? + + /** + * @return **true** if [other] pointer should be restored to the same symbol + */ + public open fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other } public inline fun symbolPointer(crossinline getSymbol: (KtAnalysisSession) -> S?): KtSymbolPointer =