From 5c8e4958dbd7982d95610ad8442ddd90a869bd05 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Mon, 4 Jun 2018 13:01:59 +0300 Subject: [PATCH] Uast: exposing enum constants literal values (#KT-23456) --- .../uast/kotlin/KotlinAbstractUElement.kt | 4 ++++ .../uast/kotlin/KotlinAbstractUElement.kt.172 | 4 ++++ .../uast/kotlin/declarations/KotlinUVariable.kt | 12 +++++++----- .../kotlin/declarations/KotlinUVariable.kt.172 | 16 +++++++--------- .../kotlin/declarations/KotlinUVariable.kt.173 | 10 ++++++---- .../testData/EnumValueMembers.log.txt | 1 + .../testData/EnumValueMembers.log.txt.172 | 1 + .../testData/EnumValueMembers.render.txt | 2 +- .../testData/EnumValueMembers.render.txt.172 | 6 ++++-- 9 files changed, 35 insertions(+), 21 deletions(-) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt index 204b32fed2e..392872e9ce3 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt @@ -163,6 +163,10 @@ fun doConvertParent(element: UElement, parent: PsiElement?): UElement? { return result.initializingClass } + if (result is UCallExpression && result.uastParent is UEnumConstant) { + return result.uastParent + } + if (result is USwitchClauseExpressionWithBody && !isInConditionBranch(element, result)) { return result.body } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt.172 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt.172 index 07ea8c94168..3a251d0b00d 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt.172 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt.172 @@ -133,6 +133,10 @@ fun doConvertParent(element: UElement, parent: PsiElement?): UElement? { return result.initializingClass } + if (result is UCallExpression && result.uastParent is UEnumConstant) { + return result.uastParent + } + if (result is USwitchClauseExpressionWithBody && !isInConditionBranch(element, result)) { return result.body } 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 a3131087db0..fae24c8c8d2 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 @@ -430,11 +430,13 @@ class KotlinUEnumConstant( override val valueArgumentCount: Int get() = psi.argumentList?.expressions?.size ?: 0 - override val valueArguments by lz { - psi.argumentList?.expressions?.map { - getLanguagePlugin().convertElement(it, this) as? UExpression ?: UastEmptyExpression - } ?: emptyList() - } + override val valueArguments by lz(fun(): List { + val ktEnumEntry = sourcePsi as? KtEnumEntry ?: return emptyList() + val ktSuperTypeCallEntry = ktEnumEntry.initializerList?.initializers?.firstOrNull() as? KtSuperTypeCallEntry ?: return emptyList() + return ktSuperTypeCallEntry.valueArguments.map { + it.getArgumentExpression()?.let { getLanguagePlugin().convertElement(it, this) } as? UExpression ?: UastEmptyExpression(this) + } + }) override val returnType: PsiType? get() = uastParent?.getAsJavaPsiElement(PsiClass::class.java)?.let { PsiTypesUtil.getClassType(it) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.172 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.172 index 74f39e9ba9d..196eb2a12ea 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.172 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.172 @@ -19,17 +19,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.* import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.elements.KtLightElement -import org.jetbrains.kotlin.psi.KtNamedDeclaration -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.KtVariableDeclaration +import org.jetbrains.kotlin.psi.* import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.java.JavaAbstractUExpression import org.jetbrains.uast.java.JavaUAnnotation import org.jetbrains.uast.java.annotations import org.jetbrains.uast.kotlin.declarations.UastLightIdentifier -import org.jetbrains.uast.kotlin.internal.KotlinUElementWithComments import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable import org.jetbrains.uast.visitor.UastVisitor @@ -256,11 +252,13 @@ open class KotlinUEnumConstant( override val valueArgumentCount: Int get() = psi.argumentList?.expressions?.size ?: 0 - override val valueArguments by lz { - psi.argumentList?.expressions?.map { - getLanguagePlugin().convertElement(it, this) as? UExpression ?: UastEmptyExpression - } ?: emptyList() + override val valueArguments by lz(fun(): List { + val ktEnumEntry = (psi as? KtLightElement<*, *>)?.kotlinOrigin as? KtEnumEntry ?: return emptyList() + val ktSuperTypeCallEntry = ktEnumEntry.initializerList?.initializers?.firstOrNull() as? KtSuperTypeCallEntry ?: return emptyList() + return ktSuperTypeCallEntry.valueArguments.map { + it.getArgumentExpression()?.let { getLanguagePlugin().convertElement(it, this) } as? UExpression ?: UastEmptyExpression } + }) override val returnType: PsiType? get() = psi.type diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.173 b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.173 index cecd4033cae..27e55774249 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.173 +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt.173 @@ -411,11 +411,13 @@ class KotlinUEnumConstant( override val valueArgumentCount: Int get() = psi.argumentList?.expressions?.size ?: 0 - override val valueArguments by lz { - psi.argumentList?.expressions?.map { - getLanguagePlugin().convertElement(it, this) as? UExpression ?: UastEmptyExpression - } ?: emptyList() + override val valueArguments by lz(fun(): List { + val ktEnumEntry = sourcePsi as? KtEnumEntry ?: return emptyList() + val ktSuperTypeCallEntry = ktEnumEntry.initializerList?.initializers?.firstOrNull() as? KtSuperTypeCallEntry ?: return emptyList() + return ktSuperTypeCallEntry.valueArguments.map { + it.getArgumentExpression()?.let { getLanguagePlugin().convertElement(it, this) } as? UExpression ?: UastEmptyExpression } + }) override val returnType: PsiType? get() = uastParent?.getAsJavaPsiElement(PsiClass::class.java)?.let { PsiTypesUtil.getClassType(it) } diff --git a/plugins/uast-kotlin/testData/EnumValueMembers.log.txt b/plugins/uast-kotlin/testData/EnumValueMembers.log.txt index 3111002c584..ed0ac92f324 100644 --- a/plugins/uast-kotlin/testData/EnumValueMembers.log.txt +++ b/plugins/uast-kotlin/testData/EnumValueMembers.log.txt @@ -3,6 +3,7 @@ UFile (package = ) UEnumConstant (name = SHEET) UAnnotation (fqName = null) USimpleNameReferenceExpression (identifier = Style) + ULiteralExpression (value = "foo") UClass (name = null) UAnnotationMethod (name = getExitAnimation) UBlockExpression diff --git a/plugins/uast-kotlin/testData/EnumValueMembers.log.txt.172 b/plugins/uast-kotlin/testData/EnumValueMembers.log.txt.172 index 4a55c203622..abd6fbd0e58 100644 --- a/plugins/uast-kotlin/testData/EnumValueMembers.log.txt.172 +++ b/plugins/uast-kotlin/testData/EnumValueMembers.log.txt.172 @@ -2,6 +2,7 @@ UFile (package = ) UClass (name = Style) UEnumConstant (name = SHEET) USimpleNameReferenceExpression (identifier = Style) + ULiteralExpression (value = "foo") UClass (name = null) UAnnotationMethod (name = getExitAnimation) UBlockExpression diff --git a/plugins/uast-kotlin/testData/EnumValueMembers.render.txt b/plugins/uast-kotlin/testData/EnumValueMembers.render.txt index 9c034b5632a..372d180d62f 100644 --- a/plugins/uast-kotlin/testData/EnumValueMembers.render.txt +++ b/plugins/uast-kotlin/testData/EnumValueMembers.render.txt @@ -1,5 +1,5 @@ public enum Style { - @null SHEET { + @null SHEET("foo") { public fun getExitAnimation() : java.lang.String { return "bar" } diff --git a/plugins/uast-kotlin/testData/EnumValueMembers.render.txt.172 b/plugins/uast-kotlin/testData/EnumValueMembers.render.txt.172 index a4325db460b..2bcf8c64976 100644 --- a/plugins/uast-kotlin/testData/EnumValueMembers.render.txt.172 +++ b/plugins/uast-kotlin/testData/EnumValueMembers.render.txt.172 @@ -1,6 +1,8 @@ public enum Style { - SHEET { - public fun getExitAnimation() : java.lang.String = "bar" + SHEET("foo") { + public fun getExitAnimation() : java.lang.String { + return "bar" + } fun SHEET() = UastEmptyExpression } private final var value: java.lang.String -- GitLab