[Analysis API FE1.0] fix "descriptor not found" exception on getting dispatch receiver type

This commit is contained in:
Ilya Kirillov
2022-10-24 22:34:26 +02:00
committed by teamcity
parent 4bb32f4634
commit 59beeb36be
5 changed files with 17 additions and 14 deletions
@@ -13,11 +13,13 @@ import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.Analysis
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescSyntheticFieldSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.isInterfaceLike
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.KtFe10PsiDefaultPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
@@ -124,15 +126,8 @@ internal class KtFe10TypeProvider(
override fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType? {
require(symbol is KtFe10Symbol)
val descriptor = when (symbol) {
is KtFe10DescSymbol<*> -> symbol.descriptor as? CallableDescriptor
is KtFe10PsiSymbol<*, *> -> symbol.descriptor as? CallableDescriptor
is KtFe10DescSyntheticFieldSymbol -> symbol.descriptor
else -> error("No callable descriptor on $symbol")
}
return descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisContext)
val descriptor = symbol.getDescriptor() as? CallableDescriptor ?: return null
return descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext)
}
private fun areTypesCompatible(a: KotlinType, b: KotlinType): Boolean {
@@ -15,6 +15,9 @@ import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.KtFe10PsiDefaultPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.KtFe10PsiDefaultPropertySetterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.KtFe10PsiDefaultSetterParameterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.types.*
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10Renderer
@@ -127,6 +130,11 @@ internal fun KtSymbol.getDescriptor(): DeclarationDescriptor? {
return when (this) {
is KtFe10PsiSymbol<*, *> -> descriptor
is KtFe10DescSymbol<*> -> descriptor
is KtFe10DescSyntheticFieldSymbol -> descriptor
is KtFe10PsiDefaultPropertyGetterSymbol -> descriptor
is KtFe10PsiDefaultSetterParameterSymbol -> descriptor
is KtFe10PsiDefaultPropertySetterSymbol -> null
is KtFe10DescDefaultPropertySetterSymbol -> null
else -> unexpectedElementError("KtSymbol", this)
}
}
@@ -34,11 +34,11 @@ import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
import org.jetbrains.kotlin.resolve.BindingContext
class KtFe10PsiDefaultPropertyGetterSymbol(
internal class KtFe10PsiDefaultPropertyGetterSymbol(
private val propertyPsi: KtProperty,
override val analysisContext: Fe10AnalysisContext
) : KtPropertyGetterSymbol(), KtFe10Symbol {
private val descriptor: PropertyGetterDescriptor? by cached {
val descriptor: PropertyGetterDescriptor? by cached {
val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
(bindingContext[BindingContext.VARIABLE, propertyPsi] as? PropertyDescriptor)?.getter
}
@@ -35,11 +35,11 @@ import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
import org.jetbrains.kotlin.resolve.BindingContext
class KtFe10PsiDefaultPropertySetterSymbol(
internal class KtFe10PsiDefaultPropertySetterSymbol(
private val propertyPsi: KtProperty,
override val analysisContext: Fe10AnalysisContext
) : KtPropertySetterSymbol(), KtFe10Symbol {
private val descriptor: PropertySetterDescriptor? by cached {
val descriptor: PropertySetterDescriptor? by cached {
val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
(bindingContext[BindingContext.VARIABLE, propertyPsi] as? PropertyDescriptor)?.setter
}
@@ -29,7 +29,7 @@ internal class KtFe10PsiDefaultSetterParameterSymbol(
private val accessorPsi: KtPropertyAccessor,
override val analysisContext: Fe10AnalysisContext
) : KtValueParameterSymbol(), KtFe10Symbol {
private val descriptor: VariableDescriptor? by cached {
val descriptor: VariableDescriptor? by cached {
val bindingContext = analysisContext.analyze(accessorPsi, AnalysisMode.PARTIAL)
bindingContext[BindingContext.PROPERTY_ACCESSOR, accessorPsi]?.valueParameters?.single()
}