diff --git a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt index bc2bd0eb326..9774eac20e7 100644 --- a/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/BaseKotlinConverter.kt @@ -11,6 +11,11 @@ import org.jetbrains.uast.* interface BaseKotlinConverter { + fun convertAnnotation( + annotationEntry: KtAnnotationEntry, + givenParent: UElement? + ): UAnnotation + fun convertDeclaration( element: PsiElement, givenParent: UElement?, diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt index ccf9b7479e7..42e49c55b1c 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt @@ -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?, diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt index 3408655b717..b661f378e2b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinConverter.kt @@ -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 { KotlinUFile(original.navigationElement, kotlinUastPlugin) } - is KtAnnotationEntry -> el(build(::KotlinUAnnotation)) + is KtAnnotationEntry -> el(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() 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) } } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt index a96d83779e4..12d609b0a41 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt @@ -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 by lz { - (sourcePsi as? KtModifierListOwner)?.annotationEntries.orEmpty().map { KotlinUAnnotation(it, this) } + override val uAnnotations: List by lz { + (sourcePsi as? KtModifierListOwner)?.annotationEntries.orEmpty().map { + baseResolveProviderService.baseKotlinConverter.convertAnnotation(it, this) + } } override fun equals(other: Any?) = other is AbstractKotlinUClass && psi == other.psi diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt index 30181778810..936b52a8b7a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt @@ -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 by lz { + override val uAnnotations: List 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 - get() = original.annotationEntries.mapNotNull { it.toUElementOfType() } + override val uAnnotations: List + get() = original.annotationEntries.mapNotNull { it.toUElementOfType() } override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index 942df284924..fe52313cc6d 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -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(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 by lz { + override val uAnnotations: List 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 ) : KotlinULocalVariable(psi, sourcePsi, uastParent) { - override val annotations: List by lz { computeAnnotations(this) } + override val uAnnotations: List by lz { computeAnnotations(this) } } class KotlinUEnumConstant(