FIR/UAST: convert annotation via base converter
This commit is contained in:
committed by
Ilya Kirillov
parent
33ff90a6da
commit
beddf03f74
@@ -11,6 +11,11 @@ import org.jetbrains.uast.*
|
||||
|
||||
interface BaseKotlinConverter {
|
||||
|
||||
fun convertAnnotation(
|
||||
annotationEntry: KtAnnotationEntry,
|
||||
givenParent: UElement?
|
||||
): UAnnotation
|
||||
|
||||
fun convertDeclaration(
|
||||
element: PsiElement,
|
||||
givenParent: UElement?,
|
||||
|
||||
@@ -21,6 +21,10 @@ import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.expressions.UInjectionHost
|
||||
|
||||
internal object FirKotlinConverter : BaseKotlinConverter {
|
||||
override fun convertAnnotation(annotationEntry: KtAnnotationEntry, givenParent: UElement?): UAnnotation {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
internal fun convertDeclarationOrElement(
|
||||
element: PsiElement,
|
||||
givenParent: UElement?,
|
||||
|
||||
@@ -43,6 +43,10 @@ internal object KotlinConverter : BaseKotlinConverter {
|
||||
else -> element
|
||||
}
|
||||
|
||||
override fun convertAnnotation(annotationEntry: KtAnnotationEntry, givenParent: UElement?): UAnnotation {
|
||||
return KotlinUAnnotation(annotationEntry, givenParent)
|
||||
}
|
||||
|
||||
internal fun convertPsiElement(
|
||||
element: PsiElement?,
|
||||
givenParent: UElement?,
|
||||
@@ -404,7 +408,7 @@ internal object KotlinConverter : BaseKotlinConverter {
|
||||
|
||||
is KtFile -> convertKtFile(original, givenParent, this).firstOrNull()
|
||||
is FakeFileForLightClass -> el<UFile> { KotlinUFile(original.navigationElement, kotlinUastPlugin) }
|
||||
is KtAnnotationEntry -> el<UAnnotation>(build(::KotlinUAnnotation))
|
||||
is KtAnnotationEntry -> el<UAnnotation>(build(::convertAnnotation))
|
||||
is KtCallExpression ->
|
||||
if (requiredTypes.isAssignableFrom(KotlinUNestedAnnotation::class.java) &&
|
||||
!requiredTypes.isAssignableFrom(UCallExpression::class.java)
|
||||
@@ -549,10 +553,14 @@ internal object KotlinConverter : BaseKotlinConverter {
|
||||
?: psi.parent.toUElementOfType<UDeclarationsExpression>() as? KotlinUDeclarationsExpression
|
||||
?: KotlinUDeclarationsExpression(null, parent, psi)
|
||||
val parentPsiElement = parent?.javaPsi //TODO: looks weird. mb look for the first non-null `javaPsi` in `parents` ?
|
||||
val variable = KotlinUAnnotatedLocalVariable(
|
||||
UastKotlinPsiVariable.create(psi, parentPsiElement, declarationsExpression), psi, declarationsExpression) { annotationParent ->
|
||||
psi.annotationEntries.map { KotlinUAnnotation(it, annotationParent) }
|
||||
}
|
||||
val variable =
|
||||
KotlinUAnnotatedLocalVariable(
|
||||
UastKotlinPsiVariable.create(psi, parentPsiElement, declarationsExpression),
|
||||
psi,
|
||||
declarationsExpression
|
||||
) { annotationParent ->
|
||||
psi.annotationEntries.map { convertAnnotation(it, annotationParent) }
|
||||
}
|
||||
return declarationsExpression.apply { declarations = listOf(variable) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,13 +58,15 @@ abstract class AbstractKotlinUClass(givenParent: UElement?) : KotlinAbstractUEle
|
||||
override fun accept(visitor: UastVisitor) {
|
||||
if (visitor.visitClass(this)) return
|
||||
delegateExpressions.acceptList(visitor)
|
||||
annotations.acceptList(visitor)
|
||||
uAnnotations.acceptList(visitor)
|
||||
uastDeclarations.acceptList(visitor)
|
||||
visitor.afterVisitClass(this)
|
||||
}
|
||||
|
||||
override val annotations: List<UAnnotation> by lz {
|
||||
(sourcePsi as? KtModifierListOwner)?.annotationEntries.orEmpty().map { KotlinUAnnotation(it, this) }
|
||||
override val uAnnotations: List<UAnnotation> by lz {
|
||||
(sourcePsi as? KtModifierListOwner)?.annotationEntries.orEmpty().map {
|
||||
baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this)
|
||||
}
|
||||
}
|
||||
|
||||
override fun equals(other: Any?) = other is AbstractKotlinUClass && psi == other.psi
|
||||
|
||||
@@ -52,12 +52,12 @@ open class KotlinUMethod(
|
||||
return unwrapFakeFileForLightClass(psi.containingFile)
|
||||
}
|
||||
|
||||
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as? KtDeclaration)
|
||||
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin)
|
||||
|
||||
override val annotations: List<UAnnotation> by lz {
|
||||
override val uAnnotations: List<UAnnotation> by lz {
|
||||
psi.annotations
|
||||
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
||||
.map { KotlinUAnnotation(it, this) }
|
||||
.map { baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this) }
|
||||
}
|
||||
|
||||
private val receiver by lz {
|
||||
@@ -99,7 +99,6 @@ open class KotlinUMethod(
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
override val uastBody by lz {
|
||||
if (kotlinOrigin?.canAnalyze() != true) return@lz null // EA-137193
|
||||
val bodyExpression = when (kotlinOrigin) {
|
||||
@@ -116,7 +115,6 @@ open class KotlinUMethod(
|
||||
wrapExpressionBody(this, bodyExpression)
|
||||
}
|
||||
|
||||
|
||||
override val returnTypeReference: UTypeReferenceExpression? by lz {
|
||||
(sourcePsi as? KtCallableDeclaration)?.typeReference?.let {
|
||||
KotlinUTypeReferenceExpression(it, this) { javaPsi.returnType ?: UastErrorType }
|
||||
@@ -154,8 +152,6 @@ open class KotlinUAnnotationMethod(
|
||||
val defaultValue = annotationParameter.defaultValue ?: return@lz null
|
||||
getLanguagePlugin().convertElement(defaultValue, this) as? UExpression
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
class KotlinUMethodWithFakeLightDelegate internal constructor(
|
||||
@@ -167,8 +163,8 @@ class KotlinUMethodWithFakeLightDelegate internal constructor(
|
||||
constructor(original: KtFunction, containingLightClass: PsiClass, givenParent: UElement?)
|
||||
: this(original, UastFakeLightMethod(original, containingLightClass), givenParent)
|
||||
|
||||
override val annotations: List<UAnnotation>
|
||||
get() = original.annotationEntries.mapNotNull { it.toUElementOfType<UAnnotation>() }
|
||||
override val uAnnotations: List<UAnnotation>
|
||||
get() = original.annotationEntries.mapNotNull { it.toUElementOfType() }
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
|
||||
@@ -80,13 +80,13 @@ abstract class AbstractKotlinUVariable(givenParent: UElement?) : KotlinAbstractU
|
||||
|
||||
override fun getContainingFile(): PsiFile = unwrapFakeFileForLightClass(psi.containingFile)
|
||||
|
||||
override val annotations by lz {
|
||||
override val uAnnotations by lz {
|
||||
val sourcePsi = sourcePsi ?: return@lz psi.annotations.map { WrappedUAnnotation(it, this) }
|
||||
val annotations = SmartList<UAnnotation>(KotlinNullabilityUAnnotation(sourcePsi, this))
|
||||
if (sourcePsi is KtModifierListOwner) {
|
||||
sourcePsi.annotationEntries.
|
||||
filter { acceptsAnnotationTarget(it.useSiteTarget?.getAnnotationUseSiteTarget()) }.
|
||||
mapTo(annotations) { KotlinUAnnotation(it, this) }
|
||||
sourcePsi.annotationEntries
|
||||
.filter { acceptsAnnotationTarget(it.useSiteTarget?.getAnnotationUseSiteTarget()) }
|
||||
.mapTo(annotations) { baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this) }
|
||||
}
|
||||
annotations
|
||||
}
|
||||
@@ -233,11 +233,11 @@ class KotlinReceiverUParameter(
|
||||
givenParent: UElement?
|
||||
) : KotlinUParameter(psi, receiver, givenParent) {
|
||||
|
||||
override val annotations: List<UAnnotation> by lz {
|
||||
override val uAnnotations: List<UAnnotation> by lz {
|
||||
receiver.annotationEntries
|
||||
.filter { it.useSiteTarget?.getAnnotationUseSiteTarget() == AnnotationUseSiteTarget.RECEIVER }
|
||||
.map { KotlinUAnnotation(it, this) } +
|
||||
super.annotations
|
||||
.filter { it.useSiteTarget?.getAnnotationUseSiteTarget() == AnnotationUseSiteTarget.RECEIVER }
|
||||
.map { baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this) } +
|
||||
super.uAnnotations
|
||||
}
|
||||
|
||||
}
|
||||
@@ -331,7 +331,7 @@ open class KotlinUField(
|
||||
|
||||
override fun accept(visitor: UastVisitor) {
|
||||
if (visitor.visitField(this)) return
|
||||
annotations.acceptList(visitor)
|
||||
uAnnotations.acceptList(visitor)
|
||||
uastInitializer?.accept(visitor)
|
||||
delegateExpression?.accept(visitor)
|
||||
visitor.afterVisitField(this)
|
||||
@@ -368,7 +368,7 @@ open class KotlinULocalVariable(
|
||||
|
||||
override fun accept(visitor: UastVisitor) {
|
||||
if (visitor.visitLocalVariable(this)) return
|
||||
annotations.acceptList(visitor)
|
||||
uAnnotations.acceptList(visitor)
|
||||
uastInitializer?.accept(visitor)
|
||||
delegateExpression?.accept(visitor)
|
||||
visitor.afterVisitLocalVariable(this)
|
||||
@@ -382,7 +382,7 @@ open class KotlinUAnnotatedLocalVariable(
|
||||
computeAnnotations: (parent: UElement) -> List<UAnnotation>
|
||||
) : KotlinULocalVariable(psi, sourcePsi, uastParent) {
|
||||
|
||||
override val annotations: List<UAnnotation> by lz { computeAnnotations(this) }
|
||||
override val uAnnotations: List<UAnnotation> by lz { computeAnnotations(this) }
|
||||
}
|
||||
|
||||
class KotlinUEnumConstant(
|
||||
|
||||
Reference in New Issue
Block a user