FIR/UAST: commonize UImportStatement

This commit is contained in:
Jinseong Jeon
2021-05-13 15:20:37 -07:00
committed by Ilya Kirillov
parent 3c3b5aa4ac
commit 15a4649675
16 changed files with 81 additions and 113 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.uast.kotlin
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.uast.UElement
interface BaseKotlinUastResolveProviderService {
@@ -13,4 +14,5 @@ interface BaseKotlinUastResolveProviderService {
fun convertParent(uElement: UElement): UElement?
fun resolveToDeclaration(ktExpression: KtExpression): PsiElement?
}
@@ -0,0 +1,56 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.uast.kotlin
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.psi.KtReferenceExpression
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
import org.jetbrains.uast.UElement
import org.jetbrains.uast.UImportStatement
import org.jetbrains.uast.USimpleNameReferenceExpression
import org.jetbrains.uast.kotlin.internal.DelegatedMultiResolve
class KotlinUImportStatement(
override val psi: KtImportDirective,
givenParent: UElement?
) : KotlinAbstractUElement(givenParent), UImportStatement, DelegatedMultiResolve {
override val javaPsi: PsiElement? = null
override val sourcePsi: KtImportDirective = psi
override val isOnDemand: Boolean = sourcePsi.isAllUnder
private val importRef: ImportReference? by lz {
sourcePsi.importedReference?.let {
ImportReference(it, sourcePsi.name ?: sourcePsi.text, this, sourcePsi)
}
}
override val importReference: UElement? = importRef
override fun resolve(): PsiElement? = importRef?.resolve()
private class ImportReference(
override val psi: KtExpression,
override val identifier: String,
givenParent: UElement?,
private val importDirective: KtImportDirective
) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression {
override val sourcePsi: KtExpression = psi
override val resolvedName: String = identifier
override fun asRenderString(): String = importDirective.importedFqName?.asString() ?: sourcePsi.text
override fun resolve(): PsiElement? {
val reference = sourcePsi.getQualifiedElementSelector() as? KtReferenceExpression ?: return null
return baseResolveProviderService?.resolveToDeclaration(reference)
}
}
}
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.uast.kotlin.internal
import com.intellij.psi.PsiSubstitutor
import com.intellij.psi.ResolveResult
import com.intellij.psi.infos.CandidateInfo
import org.jetbrains.uast.UMultiResolvable
import org.jetbrains.uast.UResolvable
interface DelegatedMultiResolve : UMultiResolvable, UResolvable {
override fun multiResolve(): Iterable<ResolveResult> = listOfNotNull(resolve()?.let { CandidateInfo(it, PsiSubstitutor.EMPTY) })
}