diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index 2e312df8c58..1bbe0ff0ff7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -22,9 +22,6 @@ import com.intellij.openapi.util.Key import com.intellij.openapi.util.registry.Registry import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile -import com.intellij.psi.impl.light.LightMethodBuilder -import com.intellij.psi.impl.light.LightModifierList -import com.intellij.psi.impl.light.LightParameterListBuilder import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.LightClassUtil @@ -50,6 +47,7 @@ import org.jetbrains.uast.kotlin.KotlinConverter.convertDeclaration import org.jetbrains.uast.kotlin.KotlinConverter.convertDeclarationOrElement import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier import org.jetbrains.uast.kotlin.declarations.KotlinUMethod +import org.jetbrains.uast.kotlin.declarations.KotlinUMethodWithFakeLightDelegate import org.jetbrains.uast.kotlin.expressions.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable @@ -519,14 +517,8 @@ internal object KotlinConverter { val lightMethod = LightClassUtil.getLightClassMethod(original) if (lightMethod != null) convertDeclaration(lightMethod, givenParent, expectedTypes) - else { - val lightFake = LightMethodBuilder( - original.manager, original.language, original.name, - LightParameterListBuilder(original.manager, original.language), - LightModifierList(original.manager) - ) - KotlinUMethod(lightFake, original, givenParent) - } + else + KotlinUMethodWithFakeLightDelegate(original, givenParent) } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.183 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.183 index 1d9d2724af1..0358a2d0e1e 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.183 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt.183 @@ -21,9 +21,6 @@ import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.util.Key import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile -import com.intellij.psi.impl.light.LightMethodBuilder -import com.intellij.psi.impl.light.LightModifierList -import com.intellij.psi.impl.light.LightParameterListBuilder import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.classes.KtLightClass @@ -46,6 +43,7 @@ import org.jetbrains.uast.kotlin.KotlinConverter.convertDeclaration import org.jetbrains.uast.kotlin.KotlinConverter.convertDeclarationOrElement import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier import org.jetbrains.uast.kotlin.declarations.KotlinUMethod +import org.jetbrains.uast.kotlin.declarations.KotlinUMethodWithFakeLightDelegate import org.jetbrains.uast.kotlin.expressions.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable @@ -484,14 +482,8 @@ internal object KotlinConverter { val lightMethod = LightClassUtil.getLightClassMethod(original) if (lightMethod != null) convertDeclaration(lightMethod, givenParent, expectedTypes) - else { - val lightFake = LightMethodBuilder( - original.manager, original.language, original.name, - LightParameterListBuilder(original.manager, original.language), - LightModifierList(original.manager) - ) - KotlinUMethod(lightFake, original, givenParent) - } + else + KotlinUMethodWithFakeLightDelegate(original, givenParent) } } 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 cfb99dd6da6..a2e872840c1 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 @@ -19,6 +19,9 @@ package org.jetbrains.uast.kotlin.declarations import com.intellij.psi.PsiFile import com.intellij.psi.PsiMethod import com.intellij.psi.PsiNameIdentifierOwner +import com.intellij.psi.impl.light.LightMethodBuilder +import com.intellij.psi.impl.light.LightModifierList +import com.intellij.psi.impl.light.LightParameterListBuilder import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.isGetter @@ -57,10 +60,10 @@ open class KotlinUMethod( override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?) - override val annotations by lz { + override val annotations: List by lz { psi.annotations - .mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry } - .map { KotlinUAnnotation(it, this) } + .mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry } + .map { KotlinUAnnotation(it, this) } } private val receiver by lz { (sourcePsi as? KtCallableDeclaration)?.receiverTypeReference } @@ -148,6 +151,18 @@ open class KotlinUAnnotationMethod( } +private fun buildLightMethodFake(original: KtFunction): PsiMethod = LightMethodBuilder( + original.manager, original.language, original.name, + LightParameterListBuilder(original.manager, original.language), + LightModifierList(original.manager) +) + +class KotlinUMethodWithFakeLightDelegate(val original: KtFunction, givenParent: UElement?) : + KotlinUMethod(buildLightMethodFake(original), original, givenParent) { + override val annotations: List + get() = original.annotationEntries.mapNotNull { it.toUElementOfType() } +} + internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) { !is KtBlockExpression -> { KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block -> diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.183 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.183 index 83607e14fc8..33f5ba6a51f 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.183 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.183 @@ -17,6 +17,9 @@ package org.jetbrains.uast.kotlin.declarations import com.intellij.psi.* +import com.intellij.psi.impl.light.LightMethodBuilder +import com.intellij.psi.impl.light.LightModifierList +import com.intellij.psi.impl.light.LightParameterListBuilder import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.isGetter @@ -55,7 +58,7 @@ open class KotlinUMethod( override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?) - override val annotations by lz { + override val annotations: List by lz { psi.annotations .mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry } .map { KotlinUAnnotation(it, this) } @@ -143,6 +146,18 @@ open class KotlinUAnnotationMethod( } +private fun buildLightMethodFake(original: KtFunction): PsiMethod = LightMethodBuilder( + original.manager, original.language, original.name, + LightParameterListBuilder(original.manager, original.language), + LightModifierList(original.manager) +) + +class KotlinUMethodWithFakeLightDelegate(val original: KtFunction, givenParent: UElement?) : + KotlinUMethod(buildLightMethodFake(original), original, givenParent) { + override val annotations: List + get() = original.annotationEntries.mapNotNull { it.toUElementOfType() } +} + internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) { !is KtBlockExpression -> { KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block -> diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 index 5044ed6da2c..2bcc81bf0c7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUMethod.kt.191 @@ -17,6 +17,9 @@ package org.jetbrains.uast.kotlin.declarations import com.intellij.psi.* +import com.intellij.psi.impl.light.LightMethodBuilder +import com.intellij.psi.impl.light.LightModifierList +import com.intellij.psi.impl.light.LightParameterListBuilder import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.isGetter @@ -55,7 +58,7 @@ open class KotlinUMethod( override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?) - override val annotations by lz { + override val annotations: List by lz { psi.annotations .mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry } .map { KotlinUAnnotation(it, this) } @@ -148,6 +151,18 @@ open class KotlinUAnnotationMethod( } +private fun buildLightMethodFake(original: KtFunction): PsiMethod = LightMethodBuilder( + original.manager, original.language, original.name, + LightParameterListBuilder(original.manager, original.language), + LightModifierList(original.manager) +) + +class KotlinUMethodWithFakeLightDelegate(val original: KtFunction, givenParent: UElement?) : + KotlinUMethod(buildLightMethodFake(original), original, givenParent) { + override val annotations: List + get() = original.annotationEntries.mapNotNull { it.toUElementOfType() } +} + internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) { !is KtBlockExpression -> { KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block -> diff --git a/plugins/uast-kotlin/testData/DeprecatedHidden.log.txt b/plugins/uast-kotlin/testData/DeprecatedHidden.log.txt index 7784271414a..201285b464b 100644 --- a/plugins/uast-kotlin/testData/DeprecatedHidden.log.txt +++ b/plugins/uast-kotlin/testData/DeprecatedHidden.log.txt @@ -4,4 +4,11 @@ UFile (package = test.pkg) UBlockExpression UMethod (name = Test) UMethod (name = test2) + UAnnotation (fqName = kotlin.Deprecated) + UNamedExpression (name = level) + UQualifiedReferenceExpression + USimpleNameReferenceExpression (identifier = DeprecationLevel) + USimpleNameReferenceExpression (identifier = HIDDEN) + UNamedExpression (name = message) + ULiteralExpression (value = "nothing") UBlockExpression diff --git a/plugins/uast-kotlin/testData/DeprecatedHidden.render.txt b/plugins/uast-kotlin/testData/DeprecatedHidden.render.txt index 80cc0488ed2..484136b1f79 100644 --- a/plugins/uast-kotlin/testData/DeprecatedHidden.render.txt +++ b/plugins/uast-kotlin/testData/DeprecatedHidden.render.txt @@ -4,6 +4,7 @@ public final class Test { public final fun test1() : void { } public fun Test() = UastEmptyExpression + @kotlin.Deprecated(level = DeprecationLevel.HIDDEN, message = "nothing") fun test2() { } }