From f86c9be733c64ee0065f4e6c29311a82dff36908 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 20 Oct 2022 12:27:46 +0200 Subject: [PATCH] [AA K2] implement symbol pointer for top level properties ^KT-54311 --- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 11 ++++---- .../KtFirTopLevelPropertySymbolPointer.kt | 25 +++++++++++++++++++ .../propertyWithAnnotations.kt | 2 +- .../propertyWithAnnotationsAndAccessors.kt | 2 +- .../propertyWithDelegateAndAnnotations.kt | 2 +- .../symbols/symbolByPsi/backingField.kt | 2 +- .../contextReceiversOnProperty.kt | 2 +- .../symbolByPsi/explicitBackingField.kt | 2 +- .../testData/symbols/symbolByPsi/jvmField.kt | 2 +- .../symbolByReference/accessorField.kt | 2 +- 10 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelPropertySymbolPointer.kt 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 07ac3a22410..48de63c24cb 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,8 +13,11 @@ 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.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.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol @@ -23,10 +26,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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.WrongSymbolForSamConstructor -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility @@ -34,10 +35,10 @@ import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.* -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.isExtension +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name @@ -129,7 +130,7 @@ internal class KtFirKotlinPropertySymbol( KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } return when (val kind = symbolKind) { - KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level properties is not supported yet") + KtSymbolKind.TOP_LEVEL -> KtFirTopLevelPropertySymbolPointer(firSymbol.callableId, firSymbol.createSignature()) KtSymbolKind.CLASS_MEMBER -> KtFirMemberPropertySymbolPointer( firSymbol.containingClassLookupTag()?.classId ?: error("ClassId should not be null for member property"), 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 new file mode 100644 index 00000000000..18de9d5a424 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelPropertySymbolPointer.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.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.ir.util.IdSignature +import org.jetbrains.kotlin.name.CallableId + +internal class KtFirTopLevelPropertySymbolPointer(callableId: CallableId, private val signature: IdSignature) : + KtTopLevelCallableSymbolPointer(callableId) { + override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( + candidates: Collection>, + firSession: FirSession, + ): KtKotlinPropertySymbol? { + val firProperty = candidates.findDeclarationWithSignatureBySymbols(signature, firSession) ?: return null + return firSymbolBuilder.variableLikeBuilder.buildPropertySymbol(firProperty.symbol) as? KtKotlinPropertySymbol + } +} diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotations.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotations.kt index a39a4c03c2f..89a0616e6a7 100644 --- a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotations.kt +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotations.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 // WITH_STDLIB annotation class PropertyAnnotation diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotationsAndAccessors.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotationsAndAccessors.kt index 1891ce8dfae..7ca451c3abf 100644 --- a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotationsAndAccessors.kt +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithAnnotationsAndAccessors.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 // PRETTY_RENDERING_MODE: RENDER_SYMBOLS_NESTED annotation class PropertyAnnotation diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithDelegateAndAnnotations.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithDelegateAndAnnotations.kt index c63f13e17bb..889b0f04326 100644 --- a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithDelegateAndAnnotations.kt +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/propertyWithDelegateAndAnnotations.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 // WITH_STDLIB annotation class PropertyAnnotation diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.kt index 5dfe139284d..33ec58e4ff7 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 var p: Int get() = field set(value) { diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt index 100dc82310e..252635d1ecf 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt @@ -1,3 +1,3 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 context(Int, s@String) val y get() = 10 \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt index 249116cb59e..eb03c456fe0 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 var p: Int field = "test" get() = field.length diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmField.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmField.kt index aeb84449af8..b6d1cec9566 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmField.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmField.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 // WITH_STDLIB @JvmField diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.kt b/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.kt index 16ae0c8ba4a..bdf2ac967ee 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.kt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 annotation class PropertyAnnotation annotation class FieldAnnotation annotation class GetAnnotation