From a3710bed6a7247722d7b13dcc44f27623ac0a9ed Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 1 Jun 2021 08:56:08 -0700 Subject: [PATCH] FIR/UAST: commonize type reference expression --- .../uast/kotlin/BaseKotlinConverter.kt | 11 ++++++---- .../BaseKotlinUastResolveProviderService.kt | 3 +++ .../KotlinUTypeReferenceExpression.kt} | 20 +++++++------------ .../uast/kotlin/FirKotlinConverter.kt | 5 +++++ .../FirKotlinUastResolveProviderService.kt | 6 ++++++ .../kotlin/declarations/FirKotlinUClass.kt | 2 +- .../kotlin/declarations/FirKotlinUMethod.kt | 2 +- .../kotlin/declarations/FirKotlinUVariable.kt | 2 +- .../jetbrains/uast/kotlin/KotlinConverter.kt | 6 ------ .../KotlinUastResolveProviderService.kt | 5 +++++ .../kotlin/declarations/KotlinUVariable.kt | 1 - .../KotlinUTypeReferenceExpression.kt | 16 --------------- 12 files changed, 36 insertions(+), 43 deletions(-) rename plugins/{uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUTypeReferenceExpression.kt => uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt} (58%) delete mode 100644 plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt index 32438011794..ca6e859f294 100644 --- a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt @@ -5,14 +5,17 @@ package org.jetbrains.uast.kotlin -import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtStringTemplateEntry -import org.jetbrains.kotlin.psi.KtStringTemplateEntryWithExpression +import org.jetbrains.kotlin.psi.* import org.jetbrains.uast.* interface BaseKotlinConverter { + fun convertReceiverParameter(receiver: KtTypeReference): UParameter? { + val call = (receiver.parent as? KtCallableDeclaration) ?: return null + if (call.receiverTypeReference != receiver) return null + return call.toUElementOfType()?.uastParameters?.firstOrNull() + } + fun convertExpression( expression: KtExpression, givenParent: UElement?, diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt index 4176ebdba7a..7503743aa24 100644 --- a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinUastResolveProviderService.kt @@ -8,6 +8,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement import com.intellij.psi.PsiType import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression @@ -20,6 +21,8 @@ interface BaseKotlinUastResolveProviderService { fun resolveToDeclaration(ktExpression: KtExpression): PsiElement? + fun resolveToType(ktTypeReference: KtTypeReference, source: UElement): PsiType? + fun getExpressionType(uExpression: UExpression): PsiType? fun evaluate(uExpression: UExpression): Any? diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUTypeReferenceExpression.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt similarity index 58% rename from plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUTypeReferenceExpression.kt rename to plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt index 803a24d96e2..17081f94f99 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/expressions/FirKotlinUTypeReferenceExpression.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt @@ -11,20 +11,14 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UTypeReferenceExpression import org.jetbrains.uast.UastErrorType -class FirKotlinUTypeReferenceExpression( - override val sourcePsi: KtTypeReference, +class KotlinUTypeReferenceExpression( + override val sourcePsi: KtTypeReference?, givenParent: UElement?, - private val typeSupplier: (() -> PsiType)? = null, -) : KotlinAbstractUExpression(givenParent), UTypeReferenceExpression { + private val typeSupplier: (() -> PsiType)? = null +) : KotlinAbstractUExpression(givenParent), UTypeReferenceExpression, KotlinUElementWithType { override val type: PsiType by lz { - typeSupplier?.invoke() ?: sourcePsi.toPsiType(uastParent ?: this) + typeSupplier?.invoke() + ?: sourcePsi?.let { baseResolveProviderService.resolveToType(it, uastParent ?: this) } + ?: UastErrorType } } - -private fun KtTypeReference?.toPsiType( - source: UElement, -): PsiType { - if (this == null) return UastErrorType - // TODO: use type conversions in firLightUtils.kt - return PsiType.NULL -} diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt index 1ed247ccec8..9a43b948b94 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt @@ -200,6 +200,11 @@ internal object FirKotlinConverter : BaseKotlinConverter { element.expression?.let { convertExpression(it, givenParent, requiredTypes) } ?: expr { UastEmptyExpression(givenParent) } } + is KtTypeReference -> + requiredTypes.accommodate( + alternative { KotlinUTypeReferenceExpression(element, givenParent) }, + alternative { convertReceiverParameter(element) } + ).firstOrNull() is KtImportDirective -> { el(build(::KotlinUImportStatement)) } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinUastResolveProviderService.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinUastResolveProviderService.kt index 9d255b5cb8c..11972002e10 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinUastResolveProviderService.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinUastResolveProviderService.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtReferenceExpression +import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression @@ -36,6 +37,11 @@ interface FirKotlinUastResolveProviderService : BaseKotlinUastResolveProviderSer } } + override fun resolveToType(ktTypeReference: KtTypeReference, source: UElement): PsiType? { + // TODO: use type conversions in firLightUtils.kt + return PsiType.NULL + } + override fun getExpressionType(uExpression: UExpression): PsiType? { val ktExpression = uExpression.sourcePsi as? KtExpression ?: return null analyseWithCustomToken(ktExpression, AlwaysAccessibleValidityTokenFactory) { diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt index 3e3ab109de1..894f1d3c0ab 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUClass.kt @@ -38,7 +38,7 @@ sealed class AbstractFirKotlinUClass( override val uastSuperTypes: List get() = ktClass?.superTypeListEntries.orEmpty().mapNotNull { it.typeReference }.map { - FirKotlinUTypeReferenceExpression(it, this) + KotlinUTypeReferenceExpression(it, this) } // TODO: delegateExpressions diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt index bc663f32e42..d4eb44298b6 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUMethod.kt @@ -84,7 +84,7 @@ open class FirKotlinUMethod( override val returnTypeReference: UTypeReferenceExpression? by lz { (sourcePsi as? KtCallableDeclaration)?.typeReference?.let { - FirKotlinUTypeReferenceExpression(it, this) { javaPsi.returnType ?: UastErrorType } + KotlinUTypeReferenceExpression(it, this) { javaPsi.returnType ?: UastErrorType } } } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUVariable.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUVariable.kt index 6c7fb64b8e1..c6465785485 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUVariable.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUVariable.kt @@ -46,7 +46,7 @@ sealed class AbstractFirKotlinUVariable( override val typeReference: UTypeReferenceExpression? by lz { (sourcePsi as? KtCallableDeclaration)?.typeReference?.let { - FirKotlinUTypeReferenceExpression(it, this) { type } + KotlinUTypeReferenceExpression(it, this) { type } } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt index a037ae66e12..b553aa9560e 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt @@ -133,12 +133,6 @@ internal object KotlinConverter : BaseKotlinConverter { }} } - internal fun convertReceiverParameter(receiver: KtTypeReference): UParameter? { - val call = (receiver.parent as? KtCallableDeclaration) ?: return null - if (call.receiverTypeReference != receiver) return null - return call.toUElementOfType()?.uastParameters?.firstOrNull() - } - var forceUInjectionHost = Registry.`is`("kotlin.uast.force.uinjectionhost", false) @TestOnly set(value) { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastResolveProviderService.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastResolveProviderService.kt index 0771dbaf8ab..cc93c6046af 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastResolveProviderService.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastResolveProviderService.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.constants.UnsignedErrorValueTypeConstant import org.jetbrains.kotlin.types.TypeUtils @@ -35,6 +36,10 @@ interface KotlinUastResolveProviderService : BaseKotlinUastResolveProviderServic return resolveToDeclarationImpl(ktExpression) } + override fun resolveToType(ktTypeReference: KtTypeReference, source: UElement): PsiType? { + return ktTypeReference.toPsiType(source) + } + override fun getExpressionType(uExpression: UExpression): PsiType? { val ktElement = uExpression.sourcePsi as? KtExpression ?: return null val ktType = ktElement.analyze()[BindingContext.EXPRESSION_TYPE_INFO, ktElement]?.type ?: return null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index cb9dc5fbb62..942df284924 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -91,7 +91,6 @@ abstract class AbstractKotlinUVariable(givenParent: UElement?) : KotlinAbstractU annotations } - protected abstract fun acceptsAnnotationTarget(target: AnnotationUseSiteTarget?): Boolean override val typeReference: UTypeReferenceExpression? by lz { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt deleted file mode 100644 index 1352304aa63..00000000000 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.uast.kotlin - -import com.intellij.psi.PsiType -import org.jetbrains.kotlin.psi.KtTypeReference -import org.jetbrains.uast.UElement -import org.jetbrains.uast.UTypeReferenceExpression - -class KotlinUTypeReferenceExpression( - override val sourcePsi: KtTypeReference?, - givenParent: UElement?, - private val typeSupplier: (() -> PsiType)? = null -) : KotlinAbstractUExpression(givenParent), UTypeReferenceExpression, KotlinUElementWithType { - override val type: PsiType by lz { - typeSupplier?.invoke() ?: sourcePsi.toPsiType(uastParent ?: this) - } -}