[Analysis API FE1.0] fix "descriptor not found" exception on getting dispatch receiver type
This commit is contained in:
+4
-9
@@ -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.components.base.Fe10KtAnalysisSessionComponent
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
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.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.KtFe10DescSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
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.getSymbolDescriptor
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.isInterfaceLike
|
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.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.KtFe10PsiSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||||
@@ -124,15 +126,8 @@ internal class KtFe10TypeProvider(
|
|||||||
|
|
||||||
override fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType? {
|
override fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType? {
|
||||||
require(symbol is KtFe10Symbol)
|
require(symbol is KtFe10Symbol)
|
||||||
|
val descriptor = symbol.getDescriptor() as? CallableDescriptor ?: return null
|
||||||
val descriptor = when (symbol) {
|
return descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun areTypesCompatible(a: KotlinType, b: KotlinType): Boolean {
|
private fun areTypesCompatible(a: KotlinType, b: KotlinType): Boolean {
|
||||||
|
|||||||
+8
@@ -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.Fe10AnalysisContext
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
|
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.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.symbols.psiBased.base.KtFe10PsiSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.*
|
import org.jetbrains.kotlin.analysis.api.descriptors.types.*
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10Renderer
|
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10Renderer
|
||||||
@@ -127,6 +130,11 @@ internal fun KtSymbol.getDescriptor(): DeclarationDescriptor? {
|
|||||||
return when (this) {
|
return when (this) {
|
||||||
is KtFe10PsiSymbol<*, *> -> descriptor
|
is KtFe10PsiSymbol<*, *> -> descriptor
|
||||||
is KtFe10DescSymbol<*> -> descriptor
|
is KtFe10DescSymbol<*> -> descriptor
|
||||||
|
is KtFe10DescSyntheticFieldSymbol -> descriptor
|
||||||
|
is KtFe10PsiDefaultPropertyGetterSymbol -> descriptor
|
||||||
|
is KtFe10PsiDefaultSetterParameterSymbol -> descriptor
|
||||||
|
is KtFe10PsiDefaultPropertySetterSymbol -> null
|
||||||
|
is KtFe10DescDefaultPropertySetterSymbol -> null
|
||||||
else -> unexpectedElementError("KtSymbol", this)
|
else -> unexpectedElementError("KtSymbol", this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -34,11 +34,11 @@ import org.jetbrains.kotlin.psi.KtProperty
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
|
||||||
class KtFe10PsiDefaultPropertyGetterSymbol(
|
internal class KtFe10PsiDefaultPropertyGetterSymbol(
|
||||||
private val propertyPsi: KtProperty,
|
private val propertyPsi: KtProperty,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtPropertyGetterSymbol(), KtFe10Symbol {
|
) : KtPropertyGetterSymbol(), KtFe10Symbol {
|
||||||
private val descriptor: PropertyGetterDescriptor? by cached {
|
val descriptor: PropertyGetterDescriptor? by cached {
|
||||||
val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
|
val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
|
||||||
(bindingContext[BindingContext.VARIABLE, propertyPsi] as? PropertyDescriptor)?.getter
|
(bindingContext[BindingContext.VARIABLE, propertyPsi] as? PropertyDescriptor)?.getter
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -35,11 +35,11 @@ import org.jetbrains.kotlin.psi.KtProperty
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
|
||||||
class KtFe10PsiDefaultPropertySetterSymbol(
|
internal class KtFe10PsiDefaultPropertySetterSymbol(
|
||||||
private val propertyPsi: KtProperty,
|
private val propertyPsi: KtProperty,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtPropertySetterSymbol(), KtFe10Symbol {
|
) : KtPropertySetterSymbol(), KtFe10Symbol {
|
||||||
private val descriptor: PropertySetterDescriptor? by cached {
|
val descriptor: PropertySetterDescriptor? by cached {
|
||||||
val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
|
val bindingContext = analysisContext.analyze(propertyPsi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
|
||||||
(bindingContext[BindingContext.VARIABLE, propertyPsi] as? PropertyDescriptor)?.setter
|
(bindingContext[BindingContext.VARIABLE, propertyPsi] as? PropertyDescriptor)?.setter
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ internal class KtFe10PsiDefaultSetterParameterSymbol(
|
|||||||
private val accessorPsi: KtPropertyAccessor,
|
private val accessorPsi: KtPropertyAccessor,
|
||||||
override val analysisContext: Fe10AnalysisContext
|
override val analysisContext: Fe10AnalysisContext
|
||||||
) : KtValueParameterSymbol(), KtFe10Symbol {
|
) : KtValueParameterSymbol(), KtFe10Symbol {
|
||||||
private val descriptor: VariableDescriptor? by cached {
|
val descriptor: VariableDescriptor? by cached {
|
||||||
val bindingContext = analysisContext.analyze(accessorPsi, AnalysisMode.PARTIAL)
|
val bindingContext = analysisContext.analyze(accessorPsi, AnalysisMode.PARTIAL)
|
||||||
bindingContext[BindingContext.PROPERTY_ACCESSOR, accessorPsi]?.valueParameters?.single()
|
bindingContext[BindingContext.PROPERTY_ACCESSOR, accessorPsi]?.valueParameters?.single()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user