Uast: keeping annotations from sources in non-light-methods backed UMethods (KT-27806)
This commit is contained in:
@@ -22,9 +22,6 @@ import com.intellij.openapi.util.Key
|
|||||||
import com.intellij.openapi.util.registry.Registry
|
import com.intellij.openapi.util.registry.Registry
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
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 com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
import org.jetbrains.kotlin.asJava.LightClassUtil
|
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.KotlinConverter.convertDeclarationOrElement
|
||||||
import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier
|
import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier
|
||||||
import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
|
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.expressions.*
|
||||||
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter
|
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter
|
||||||
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable
|
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable
|
||||||
@@ -519,14 +517,8 @@ internal object KotlinConverter {
|
|||||||
val lightMethod = LightClassUtil.getLightClassMethod(original)
|
val lightMethod = LightClassUtil.getLightClassMethod(original)
|
||||||
if (lightMethod != null)
|
if (lightMethod != null)
|
||||||
convertDeclaration(lightMethod, givenParent, expectedTypes)
|
convertDeclaration(lightMethod, givenParent, expectedTypes)
|
||||||
else {
|
else
|
||||||
val lightFake = LightMethodBuilder(
|
KotlinUMethodWithFakeLightDelegate(original, givenParent)
|
||||||
original.manager, original.language, original.name,
|
|
||||||
LightParameterListBuilder(original.manager, original.language),
|
|
||||||
LightModifierList(original.manager)
|
|
||||||
)
|
|
||||||
KotlinUMethod(lightFake, original, givenParent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,9 +21,6 @@ import com.intellij.openapi.components.ServiceManager
|
|||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
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 com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||||
import org.jetbrains.kotlin.asJava.LightClassUtil
|
import org.jetbrains.kotlin.asJava.LightClassUtil
|
||||||
import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
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.KotlinConverter.convertDeclarationOrElement
|
||||||
import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier
|
import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier
|
||||||
import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
|
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.expressions.*
|
||||||
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter
|
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter
|
||||||
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable
|
import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable
|
||||||
@@ -484,14 +482,8 @@ internal object KotlinConverter {
|
|||||||
val lightMethod = LightClassUtil.getLightClassMethod(original)
|
val lightMethod = LightClassUtil.getLightClassMethod(original)
|
||||||
if (lightMethod != null)
|
if (lightMethod != null)
|
||||||
convertDeclaration(lightMethod, givenParent, expectedTypes)
|
convertDeclaration(lightMethod, givenParent, expectedTypes)
|
||||||
else {
|
else
|
||||||
val lightFake = LightMethodBuilder(
|
KotlinUMethodWithFakeLightDelegate(original, givenParent)
|
||||||
original.manager, original.language, original.name,
|
|
||||||
LightParameterListBuilder(original.manager, original.language),
|
|
||||||
LightModifierList(original.manager)
|
|
||||||
)
|
|
||||||
KotlinUMethod(lightFake, original, givenParent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ package org.jetbrains.uast.kotlin.declarations
|
|||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiMethod
|
import com.intellij.psi.PsiMethod
|
||||||
import com.intellij.psi.PsiNameIdentifierOwner
|
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.KtLightElement
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
||||||
import org.jetbrains.kotlin.asJava.elements.isGetter
|
import org.jetbrains.kotlin.asJava.elements.isGetter
|
||||||
@@ -57,10 +60,10 @@ open class KotlinUMethod(
|
|||||||
|
|
||||||
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?)
|
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?)
|
||||||
|
|
||||||
override val annotations by lz {
|
override val annotations: List<UAnnotation> by lz {
|
||||||
psi.annotations
|
psi.annotations
|
||||||
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
||||||
.map { KotlinUAnnotation(it, this) }
|
.map { KotlinUAnnotation(it, this) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val receiver by lz { (sourcePsi as? KtCallableDeclaration)?.receiverTypeReference }
|
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<UAnnotation>
|
||||||
|
get() = original.annotationEntries.mapNotNull { it.toUElementOfType<UAnnotation>() }
|
||||||
|
}
|
||||||
|
|
||||||
internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) {
|
internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) {
|
||||||
!is KtBlockExpression -> {
|
!is KtBlockExpression -> {
|
||||||
KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block ->
|
KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block ->
|
||||||
|
|||||||
+16
-1
@@ -17,6 +17,9 @@
|
|||||||
package org.jetbrains.uast.kotlin.declarations
|
package org.jetbrains.uast.kotlin.declarations
|
||||||
|
|
||||||
import com.intellij.psi.*
|
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.KtLightElement
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
||||||
import org.jetbrains.kotlin.asJava.elements.isGetter
|
import org.jetbrains.kotlin.asJava.elements.isGetter
|
||||||
@@ -55,7 +58,7 @@ open class KotlinUMethod(
|
|||||||
|
|
||||||
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?)
|
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?)
|
||||||
|
|
||||||
override val annotations by lz {
|
override val annotations: List<UAnnotation> by lz {
|
||||||
psi.annotations
|
psi.annotations
|
||||||
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
||||||
.map { KotlinUAnnotation(it, this) }
|
.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<UAnnotation>
|
||||||
|
get() = original.annotationEntries.mapNotNull { it.toUElementOfType<UAnnotation>() }
|
||||||
|
}
|
||||||
|
|
||||||
internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) {
|
internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) {
|
||||||
!is KtBlockExpression -> {
|
!is KtBlockExpression -> {
|
||||||
KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block ->
|
KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block ->
|
||||||
|
|||||||
+16
-1
@@ -17,6 +17,9 @@
|
|||||||
package org.jetbrains.uast.kotlin.declarations
|
package org.jetbrains.uast.kotlin.declarations
|
||||||
|
|
||||||
import com.intellij.psi.*
|
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.KtLightElement
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
||||||
import org.jetbrains.kotlin.asJava.elements.isGetter
|
import org.jetbrains.kotlin.asJava.elements.isGetter
|
||||||
@@ -55,7 +58,7 @@ open class KotlinUMethod(
|
|||||||
|
|
||||||
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?)
|
override fun getNameIdentifier() = UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?)
|
||||||
|
|
||||||
override val annotations by lz {
|
override val annotations: List<UAnnotation> by lz {
|
||||||
psi.annotations
|
psi.annotations
|
||||||
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
.mapNotNull { (it as? KtLightElement<*, *>)?.kotlinOrigin as? KtAnnotationEntry }
|
||||||
.map { KotlinUAnnotation(it, this) }
|
.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<UAnnotation>
|
||||||
|
get() = original.annotationEntries.mapNotNull { it.toUElementOfType<UAnnotation>() }
|
||||||
|
}
|
||||||
|
|
||||||
internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) {
|
internal fun wrapExpressionBody(function: UElement, bodyExpression: KtExpression): UExpression? = when (bodyExpression) {
|
||||||
!is KtBlockExpression -> {
|
!is KtBlockExpression -> {
|
||||||
KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block ->
|
KotlinUBlockExpression.KotlinLazyUBlockExpression(function) { block ->
|
||||||
|
|||||||
@@ -4,4 +4,11 @@ UFile (package = test.pkg)
|
|||||||
UBlockExpression
|
UBlockExpression
|
||||||
UMethod (name = Test)
|
UMethod (name = Test)
|
||||||
UMethod (name = test2)
|
UMethod (name = test2)
|
||||||
|
UAnnotation (fqName = kotlin.Deprecated)
|
||||||
|
UNamedExpression (name = level)
|
||||||
|
UQualifiedReferenceExpression
|
||||||
|
USimpleNameReferenceExpression (identifier = DeprecationLevel)
|
||||||
|
USimpleNameReferenceExpression (identifier = HIDDEN)
|
||||||
|
UNamedExpression (name = message)
|
||||||
|
ULiteralExpression (value = "nothing")
|
||||||
UBlockExpression
|
UBlockExpression
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ public final class Test {
|
|||||||
public final fun test1() : void {
|
public final fun test1() : void {
|
||||||
}
|
}
|
||||||
public fun Test() = UastEmptyExpression
|
public fun Test() = UastEmptyExpression
|
||||||
|
@kotlin.Deprecated(level = DeprecationLevel.HIDDEN, message = "nothing")
|
||||||
fun test2() {
|
fun test2() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user