FIR/UAST: enforce the existence of BaseKotlinUastResolveProviderService

This commit is contained in:
Jinseong Jeon
2021-05-18 16:09:48 -07:00
committed by Ilya Kirillov
parent 240f86b109
commit f16f9a13fd
11 changed files with 27 additions and 17 deletions
@@ -12,15 +12,18 @@ import org.jetbrains.uast.UastLanguagePlugin
import org.jetbrains.uast.kotlin.internal.KotlinUElementWithComments
abstract class KotlinAbstractUElement(
givenParent: UElement?
givenParent: UElement?,
baseResolveProviderServiceSupplier: BaseResolveProviderServiceSupplier? = null,
) : KotlinUElementWithComments {
protected val languagePlugin: UastLanguagePlugin? by lz {
psi?.let { UastFacade.findPlugin(it) }
}
protected val baseResolveProviderService: BaseKotlinUastResolveProviderService? by lz {
psi?.project?.let { ServiceManager.getService(it, BaseKotlinUastResolveProviderService::class.java) }
protected val baseResolveProviderService: BaseKotlinUastResolveProviderService by lz {
baseResolveProviderServiceSupplier?.get()
?: psi?.project?.let { ServiceManager.getService(it, BaseKotlinUastResolveProviderService::class.java) }
?: error("${BaseKotlinUastResolveProviderService::class.java.name} is not available")
}
final override val uastParent: UElement? by lz {
@@ -28,7 +31,7 @@ abstract class KotlinAbstractUElement(
}
protected open fun convertParent(): UElement? {
return baseResolveProviderService?.convertParent(this)
return baseResolveProviderService.convertParent(this)
}
override fun equals(other: Any?): Boolean {
@@ -13,8 +13,9 @@ import org.jetbrains.uast.UExpression
import org.jetbrains.uast.convertOpt
abstract class KotlinAbstractUExpression(
givenParent: UElement?
) : KotlinAbstractUElement(givenParent), UExpression {
givenParent: UElement?,
baseResolveProviderServiceSupplier: BaseResolveProviderServiceSupplier? = null,
) : KotlinAbstractUElement(givenParent, baseResolveProviderServiceSupplier), UExpression {
override val javaPsi: PsiElement? = null
@@ -50,7 +50,7 @@ class KotlinUImportStatement(
override fun resolve(): PsiElement? {
val reference = sourcePsi.getQualifiedElementSelector() as? KtReferenceExpression ?: return null
return baseResolveProviderService?.resolveToDeclaration(reference)
return baseResolveProviderService.resolveToDeclaration(reference)
}
}
}
@@ -13,6 +13,9 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMember
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.uast.UDeclaration
import org.jetbrains.uast.UElement
import java.util.function.Supplier
typealias BaseResolveProviderServiceSupplier = Supplier<BaseKotlinUastResolveProviderService>
fun <T> lz(initializer: () -> T) =
lazy(LazyThreadSafetyMode.SYNCHRONIZED, initializer)
@@ -211,7 +211,8 @@ internal object KotlinConverter {
return with (expectedTypes) { when (element) {
is KtParameterList -> el<UDeclarationsExpression> {
val declarationsExpression = KotlinUDeclarationsExpression(givenParent)
val resolveProviderService = ServiceManager.getService(element.project, KotlinUastResolveProviderService::class.java)
val declarationsExpression = KotlinUDeclarationsExpression(null, givenParent, null) { resolveProviderService }
declarationsExpression.apply {
declarations = element.parameters.mapIndexed { i, p ->
KotlinUParameter(UastKotlinPsiParameter.create(p, element, declarationsExpression, i), p, this)
@@ -46,7 +46,7 @@ class KotlinUCallableReferenceExpression(
override val resolvedName: String?
get() = (resolve() as? PsiNamedElement)?.name
override fun resolve(): PsiElement? = baseResolveProviderService?.resolveToDeclaration(sourcePsi.callableReference)
override fun resolve(): PsiElement? = baseResolveProviderService.resolveToDeclaration(sourcePsi.callableReference)
override fun multiResolve(): Iterable<ResolveResult> = getResolveResultVariants(sourcePsi.callableReference)
@@ -16,14 +16,16 @@
package org.jetbrains.uast
import com.intellij.psi.PsiElement
import org.jetbrains.uast.kotlin.BaseResolveProviderServiceSupplier
import org.jetbrains.uast.kotlin.KotlinAbstractUExpression
import org.jetbrains.uast.kotlin.doConvertParent
open class KotlinUDeclarationsExpression(
override val psi: PsiElement?,
givenParent: UElement?,
val psiAnchor: PsiElement? = null
) : KotlinAbstractUExpression(givenParent), UDeclarationsExpression {
override val psi: PsiElement?,
givenParent: UElement?,
val psiAnchor: PsiElement? = null,
baseResolveProviderServiceSupplier: BaseResolveProviderServiceSupplier? = null,
) : KotlinAbstractUExpression(givenParent, baseResolveProviderServiceSupplier), UDeclarationsExpression {
override val sourcePsi: PsiElement?
get() = psiAnchor
@@ -145,7 +145,7 @@ class KotlinUFunctionCallExpression(
val ktNameReferenceExpression = sourcePsi.calleeExpression as? KtNameReferenceExpression ?: return null
val localCallableDeclaration =
baseResolveProviderService?.resolveToDeclaration(ktNameReferenceExpression) as? PsiVariable ?: return null
baseResolveProviderService.resolveToDeclaration(ktNameReferenceExpression) as? PsiVariable ?: return null
if (localCallableDeclaration !is PsiLocalVariable && localCallableDeclaration !is PsiParameter) return null
// an implicit receiver for variables calls (KT-25524)
@@ -34,7 +34,7 @@ class KotlinUQualifiedReferenceExpression(
override val selector by lz { KotlinConverter.convertOrEmpty(sourcePsi.selectorExpression, this) }
override val accessType = UastQualifiedExpressionAccessType.SIMPLE
override fun resolve(): PsiElement? = sourcePsi.selectorExpression?.let { baseResolveProviderService?.resolveToDeclaration(it) }
override fun resolve(): PsiElement? = sourcePsi.selectorExpression?.let { baseResolveProviderService.resolveToDeclaration(it) }
override val resolvedName: String?
get() = (resolve() as? PsiNamedElement)?.name
@@ -37,6 +37,6 @@ class KotlinUSafeQualifiedExpression(
override val resolvedName: String?
get() = (resolve() as? PsiNamedElement)?.name
override fun resolve(): PsiElement? = sourcePsi.selectorExpression?.let { baseResolveProviderService?.resolveToDeclaration(it) }
override fun resolve(): PsiElement? = sourcePsi.selectorExpression?.let { baseResolveProviderService.resolveToDeclaration(it) }
override fun multiResolve(): Iterable<ResolveResult> = getResolveResultVariants(sourcePsi.selectorExpression)
}
@@ -38,7 +38,7 @@ open class KotlinUSimpleReferenceExpression(
override val sourcePsi: KtSimpleNameExpression,
givenParent: UElement?
) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement {
private val resolvedDeclaration: PsiElement? by lz { baseResolveProviderService?.resolveToDeclaration(sourcePsi) }
private val resolvedDeclaration: PsiElement? by lz { baseResolveProviderService.resolveToDeclaration(sourcePsi) }
override val identifier get() = sourcePsi.getReferencedName()