From b4da714510be450abf4476dae141dc21f0daf020 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 1 Nov 2021 20:06:13 +0900 Subject: [PATCH] [FIR IDE] Fix KtSymbolKind for local symbols in AAPI/FE10 In Analysis API a callable declaration is local only if it is an immediate child of a callable declaration. Declarations inside anonymous objects are 'KtSymbolKind.CLASS_MEMBER'. --- .../descriptorBased/base/Kt1DescUtils.kt | 14 +++++++++---- .../psiBased/base/KtFe10PsiSymbolUtils.kt | 20 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index e920f34db48..08b68f4d8bf 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -46,10 +46,16 @@ import org.jetbrains.kotlin.types.checker.NewCapturedType import org.jetbrains.kotlin.types.checker.NewTypeVariableConstructor internal val MemberDescriptor.ktSymbolKind: KtSymbolKind - get() = when { - containingDeclaration is PackageFragmentDescriptor -> KtSymbolKind.TOP_LEVEL - DescriptorUtils.isLocal(this) -> KtSymbolKind.LOCAL - else -> KtSymbolKind.CLASS_MEMBER + get() { + return when (this) { + is PropertyAccessorDescriptor -> KtSymbolKind.ACCESSOR + is SamConstructorDescriptor -> KtSymbolKind.SAM_CONSTRUCTOR + else -> when (containingDeclaration) { + is PackageFragmentDescriptor -> KtSymbolKind.TOP_LEVEL + is ClassDescriptor -> KtSymbolKind.CLASS_MEMBER + else -> KtSymbolKind.LOCAL + } + } } internal val CallableMemberDescriptor.isExplicitOverride: Boolean diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt index 5ef1fed7b72..93df3cdcc6a 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/base/KtFe10PsiSymbolUtils.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.hasBody import org.jetbrains.kotlin.psi.psiUtil.isTopLevelInFileOrScript import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf @@ -62,11 +63,20 @@ internal val KtDeclaration.ktModality: Modality? } internal val KtElement.ktSymbolKind: KtSymbolKind - get() = when { - this is KtPropertyAccessor -> KtSymbolKind.ACCESSOR - isTopLevelInFileOrScript(this) -> KtSymbolKind.TOP_LEVEL - this is KtDeclaration && !KtPsiUtil.isLocal(this) -> KtSymbolKind.CLASS_MEMBER - else -> KtSymbolKind.LOCAL + get() { + if (this is KtPropertyAccessor) { + return KtSymbolKind.ACCESSOR + } + + if (this is KtDeclaration) { + return when (this.getParentOfType(strict = true)) { + null -> KtSymbolKind.TOP_LEVEL + is KtCallableDeclaration, is KtPropertyAccessor -> KtSymbolKind.LOCAL + else -> KtSymbolKind.CLASS_MEMBER + } + } + + return KtSymbolKind.LOCAL } internal val KtDeclaration.callableIdIfNonLocal: CallableId?