FIR/UAST: enforce the existence of BaseKotlinUastResolveProviderService
This commit is contained in:
committed by
Ilya Kirillov
parent
240f86b109
commit
f16f9a13fd
@@ -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
|
||||
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -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)
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
|
||||
+6
-4
@@ -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
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user