[FIR IDE] Fix callableIdIfNonLocal in AAPI/FE10

Before, implementations of 'callableIdIfNonLocal' in Fe10KtSymbols
returned CallableIds even for local declarations. This commit fixes this
behavior.

This commit fixes KtFe10SymbolByPsiTestGenerated.testLocalDeclarations().
This commit is contained in:
Yan Zhulanow
2021-10-28 19:03:58 +09:00
parent f7b4fa64ea
commit e943ee1e33
16 changed files with 79 additions and 59 deletions
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtF
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertySetterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescValueParameterSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescValueParameterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.callableId import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.calculateCallableId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.callableIdIfNotLocal
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
import org.jetbrains.kotlin.analysis.api.diagnostics.KtNonBoundToPsiErrorDiagnostic import org.jetbrains.kotlin.analysis.api.diagnostics.KtNonBoundToPsiErrorDiagnostic
import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtCallResolver import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtCallResolver
@@ -141,7 +142,7 @@ internal class KtFe10CallResolver(
val variableSymbol = variableDescriptor.toKtCallableSymbol(analysisContext) as? KtVariableLikeSymbol ?: return null val variableSymbol = variableDescriptor.toKtCallableSymbol(analysisContext) as? KtVariableLikeSymbol ?: return null
val substitutor = KtSubstitutor.Empty(token) val substitutor = KtSubstitutor.Empty(token)
return if (resolvedCall.functionCall.resultingDescriptor.callableId in kotlinFunctionInvokeCallableIds) { return if (resolvedCall.functionCall.resultingDescriptor.callableIdIfNotLocal in kotlinFunctionInvokeCallableIds) {
KtFunctionalTypeVariableCall(variableSymbol, argumentMapping, getTarget(callableSymbol), substitutor, token) KtFunctionalTypeVariableCall(variableSymbol, argumentMapping, getTarget(callableSymbol), substitutor, token)
} else { } else {
KtVariableWithInvokeFunctionCall(variableSymbol, argumentMapping, getTarget(callableSymbol), substitutor, token) KtVariableWithInvokeFunctionCall(variableSymbol, argumentMapping, getTarget(callableSymbol), substitutor, token)
@@ -55,8 +55,8 @@ internal class KtFe10DescConstructorSymbol(
return pointerByPsi return pointerByPsi
} }
val callableId = descriptor.callableId val callableId = descriptor.callableIdIfNotLocal
if (callableId != null && !callableId.isLocal) { if (callableId != null) {
val signature = descriptor.getSymbolPointerSignature(analysisContext) val signature = descriptor.getSymbolPointerSignature(analysisContext)
return KtFe10DescFunctionLikeSymbolPointer(callableId, signature) return KtFe10DescFunctionLikeSymbolPointer(callableId, signature)
} }
@@ -64,7 +64,7 @@ internal class KtFe10DescFunctionSymbol(
get() = withValidityAssertion { descriptor.ktHasStableParameterNames } get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { descriptor.callableId } get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisContext) } get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisContext) }
@@ -87,8 +87,8 @@ internal class KtFe10DescFunctionSymbol(
return pointerByPsi return pointerByPsi
} }
val callableId = descriptor.callableId val callableId = descriptor.callableIdIfNotLocal
if (callableId != null && !callableId.isLocal) { if (callableId != null) {
val signature = descriptor.getSymbolPointerSignature(analysisContext) val signature = descriptor.getSymbolPointerSignature(analysisContext)
return KtFe10DescFunctionLikeSymbolPointer(callableId, signature) return KtFe10DescFunctionLikeSymbolPointer(callableId, signature)
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.callableId import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.callableIdIfNotLocal
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol
@@ -34,7 +34,7 @@ internal class KtFe10DescJavaFieldSymbol(
get() = withValidityAssertion { !descriptor.isVar } get() = withValidityAssertion { !descriptor.isVar }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { descriptor.callableId } get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor.returnType.toKtTypeAndAnnotations(analysisContext) } get() = withValidityAssertion { descriptor.returnType.toKtTypeAndAnnotations(analysisContext) }
@@ -64,7 +64,7 @@ internal class KtFe10DescKotlinPropertySymbol(
get() = withValidityAssertion { descriptor.setter != null } get() = withValidityAssertion { descriptor.setter != null }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { descriptor.callableId } get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
override val initializer: KtConstantValue? override val initializer: KtConstantValue?
get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() }
@@ -47,7 +47,7 @@ internal class KtFe10DescPropertyGetterSymbol(
get() = withValidityAssertion { get() = withValidityAssertion {
val propertyDescriptor = descriptor.correspondingProperty val propertyDescriptor = descriptor.correspondingProperty
return if (propertyDescriptor is SyntheticPropertyDescriptor) { return if (propertyDescriptor is SyntheticPropertyDescriptor) {
propertyDescriptor.getMethod.callableId propertyDescriptor.getMethod.callableIdIfNotLocal
} else { } else {
null null
} }
@@ -50,7 +50,7 @@ internal class KtFe10DescPropertySetterSymbol(
get() = withValidityAssertion { get() = withValidityAssertion {
val propertyDescriptor = descriptor.correspondingProperty val propertyDescriptor = descriptor.correspondingProperty
return if (propertyDescriptor is SyntheticPropertyDescriptor) { return if (propertyDescriptor is SyntheticPropertyDescriptor) {
propertyDescriptor.getMethod.callableId propertyDescriptor.getMethod.callableIdIfNotLocal
} else { } else {
null null
} }
@@ -36,7 +36,7 @@ internal class KtFe10DescSamConstructorSymbol(
get() = withValidityAssertion { descriptor.ktHasStableParameterNames } get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { descriptor.callableId } get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisContext) } get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisContext) }
@@ -78,7 +78,7 @@ internal class KtFe10DescSyntheticJavaPropertySymbol(
get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { descriptor.callableId } get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisContext) } get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisContext) }
@@ -78,7 +78,7 @@ internal class KtFe10DescSyntheticJavaPropertySymbolForOverride(
get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { descriptor.callableId } get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisContext) } get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisContext) }
@@ -235,8 +235,10 @@ internal fun ConstantValue<*>.toKtConstantValue(): KtConstantValue {
} }
} }
internal val CallableMemberDescriptor.callableId: CallableId? internal val CallableMemberDescriptor.callableIdIfNotLocal: CallableId?
get() { get() = calculateCallableId(allowLocal = false)
internal fun CallableMemberDescriptor.calculateCallableId(allowLocal: Boolean): CallableId? {
var current: DeclarationDescriptor = containingDeclaration var current: DeclarationDescriptor = containingDeclaration
val localName = mutableListOf<String>() val localName = mutableListOf<String>()
@@ -254,7 +256,13 @@ internal val CallableMemberDescriptor.callableId: CallableId?
} }
is ClassDescriptor -> className += current.name.asString() is ClassDescriptor -> className += current.name.asString()
is PropertyAccessorDescriptor -> {} // Filter out property accessors is PropertyAccessorDescriptor -> {} // Filter out property accessors
is CallableDescriptor -> localName += current.name.asString() is CallableDescriptor -> {
if (!allowLocal) {
return null
}
localName += current.name.asString()
}
} }
current = current.containingDeclaration ?: return null current = current.containingDeclaration ?: return null
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.callableId import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.callableIdIfNonLocal
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
@@ -44,7 +44,7 @@ internal class KtFe10PsiEnumEntrySymbol(
} }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { psi.callableId } get() = withValidityAssertion { psi.callableIdIfNonLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { get() = withValidityAssertion {
@@ -73,7 +73,7 @@ internal class KtFe10PsiFunctionSymbol(
get() = withValidityAssertion { true } get() = withValidityAssertion { true }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { psi.callableId } get() = withValidityAssertion { psi.callableIdIfNonLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor?.returnType?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() } get() = withValidityAssertion { descriptor?.returnType?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() }
@@ -96,7 +96,7 @@ internal class KtFe10PsiKotlinPropertySymbol(
get() = withValidityAssertion { !psi.isVar } get() = withValidityAssertion { !psi.isVar }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { psi.callableId } get() = withValidityAssertion { psi.callableIdIfNonLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() } get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() }
@@ -64,7 +64,7 @@ internal class KtFe10PsiPropertyGetterSymbol(
get() = withValidityAssertion { true } get() = withValidityAssertion { true }
override val callableIdIfNonLocal: CallableId? override val callableIdIfNonLocal: CallableId?
get() = withValidityAssertion { psi.property.callableId } get() = withValidityAssertion { psi.property.callableIdIfNonLocal }
override val annotatedType: KtTypeAndAnnotations override val annotatedType: KtTypeAndAnnotations
get() = withValidityAssertion { get() = withValidityAssertion {
@@ -68,8 +68,10 @@ internal val KtElement.ktSymbolKind: KtSymbolKind
else -> KtSymbolKind.LOCAL else -> KtSymbolKind.LOCAL
} }
internal val KtDeclaration.callableId: CallableId? internal val KtDeclaration.callableIdIfNonLocal: CallableId?
get() { get() = calculateCallableId(allowLocal = false)
internal fun KtDeclaration.calculateCallableId(allowLocal: Boolean): CallableId? {
val selfName = this.name ?: return null val selfName = this.name ?: return null
val containingFile = this.containingKtFile val containingFile = this.containingKtFile
@@ -80,9 +82,18 @@ internal val KtDeclaration.callableId: CallableId?
while (current != null) { while (current != null) {
when (current) { when (current) {
is KtClassOrObject -> className += current.name ?: return null is KtClassOrObject -> {
is KtPropertyAccessor -> {} // Filter out property accessors className += current.name ?: return null
is KtCallableDeclaration -> localName += current.name ?: return null }
is KtPropertyAccessor -> {
// Filter out property accessors
}
is KtCallableDeclaration -> {
if (!allowLocal) {
return null
}
localName += current.name ?: return null
}
} }
current = current.getElementParentDeclaration() current = current.getElementParentDeclaration()