FIR/UAST: commonize UImportStatement
This commit is contained in:
committed by
Ilya Kirillov
parent
3c3b5aa4ac
commit
15a4649675
+2
@@ -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?
|
||||
}
|
||||
|
||||
+56
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
@@ -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) })
|
||||
}
|
||||
Reference in New Issue
Block a user