Uast: fixes for Enum identifiers (KT-35432)
This commit is contained in:
+3
-1
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiNameIdentifierOwner
|
|||||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
|
import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
|
||||||
import org.jetbrains.uast.UElement
|
import org.jetbrains.uast.UElement
|
||||||
import org.jetbrains.uast.UIdentifier
|
import org.jetbrains.uast.UIdentifier
|
||||||
import org.jetbrains.uast.kotlin.unwrapFakeFileForLightClass
|
import org.jetbrains.uast.kotlin.unwrapFakeFileForLightClass
|
||||||
@@ -42,7 +43,8 @@ class KotlinUIdentifier private constructor(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
if (ApplicationManager.getApplication().isUnitTestMode && !acceptableSourcePsi(sourcePsi))
|
if (ApplicationManager.getApplication().isUnitTestMode && !acceptableSourcePsi(sourcePsi))
|
||||||
throw AssertionError("sourcePsi should be physical leaf element but got $sourcePsi of (${sourcePsi?.javaClass})")
|
throw KotlinExceptionWithAttachments("sourcePsi should be physical leaf element but got $sourcePsi of (${sourcePsi?.javaClass})")
|
||||||
|
.withAttachment("sourcePsi.text", sourcePsi?.text)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun acceptableSourcePsi(sourcePsi: PsiElement?): Boolean {
|
private fun acceptableSourcePsi(sourcePsi: PsiElement?): Boolean {
|
||||||
|
|||||||
+7
-2
@@ -67,8 +67,13 @@ class KotlinUFunctionCallExpression(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val methodIdentifier by lz {
|
override val methodIdentifier by lz {
|
||||||
val calleeExpression = sourcePsi.calleeExpression
|
if (sourcePsi is KtSuperTypeCallEntry) {
|
||||||
when (calleeExpression) {
|
((sourcePsi.parent as? KtInitializerList)?.parent as? KtEnumEntry)?.let { ktEnumEntry ->
|
||||||
|
return@lz KotlinUIdentifier(ktEnumEntry.nameIdentifier, this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
when (val calleeExpression = sourcePsi.calleeExpression) {
|
||||||
null -> null
|
null -> null
|
||||||
is KtNameReferenceExpression ->
|
is KtNameReferenceExpression ->
|
||||||
KotlinUIdentifier(calleeExpression.getReferencedNameElement(), this)
|
KotlinUIdentifier(calleeExpression.getReferencedNameElement(), this)
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Style -> UClass (name = Style)
|
||||||
|
value -> UParameter (name = value)
|
||||||
|
String -> USimpleNameReferenceExpression (identifier = String)
|
||||||
|
SYSTEM -> UEnumConstant (name = SYSTEM)
|
||||||
|
USER -> UEnumConstant (name = USER)
|
||||||
|
INTERNAL -> UEnumConstant (name = INTERNAL)
|
||||||
|
UNKNOWN -> UEnumConstant (name = UNKNOWN)
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
enum class Style(val value: String?) {
|
||||||
|
SYSTEM("system"),
|
||||||
|
USER("user"),
|
||||||
|
INTERNAL("internal"),
|
||||||
|
UNKNOWN(null);
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
UFile (package = )
|
||||||
|
UClass (name = Style)
|
||||||
|
UField (name = value)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.Nullable)
|
||||||
|
UEnumConstant (name = SYSTEM)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = "system")
|
||||||
|
UEnumConstant (name = USER)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = "user")
|
||||||
|
UEnumConstant (name = INTERNAL)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = "internal")
|
||||||
|
UEnumConstant (name = UNKNOWN)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = null)
|
||||||
|
UMethod (name = getValue)
|
||||||
|
UMethod (name = Style)
|
||||||
|
UParameter (name = value)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.Nullable)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
UFile (package = )
|
||||||
|
UClass (name = Style)
|
||||||
|
UEnumConstant (name = SYSTEM)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = "system")
|
||||||
|
UEnumConstant (name = USER)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = "user")
|
||||||
|
UEnumConstant (name = INTERNAL)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = "internal")
|
||||||
|
UEnumConstant (name = UNKNOWN)
|
||||||
|
UAnnotation (fqName = null)
|
||||||
|
USimpleNameReferenceExpression (identifier = Style)
|
||||||
|
ULiteralExpression (value = null)
|
||||||
|
UField (name = value)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.Nullable)
|
||||||
|
UMethod (name = getValue)
|
||||||
|
UMethod (name = Style)
|
||||||
|
UParameter (name = value)
|
||||||
|
UAnnotation (fqName = org.jetbrains.annotations.Nullable)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
String -> USimpleNameReferenceExpression (identifier = String) from KtNameReferenceExpression
|
||||||
|
Style -> UClass (name = Style) from KtEnumEntrySuperclassReferenceExpression
|
||||||
|
Style -> UClass (name = Style) from KtEnumEntrySuperclassReferenceExpression
|
||||||
|
Style -> UClass (name = Style) from KtEnumEntrySuperclassReferenceExpression
|
||||||
|
Style -> UClass (name = Style) from KtEnumEntrySuperclassReferenceExpression
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
public enum Style {
|
||||||
|
@org.jetbrains.annotations.Nullable private final var value: java.lang.String
|
||||||
|
@null SYSTEM("system")
|
||||||
|
@null USER("user")
|
||||||
|
@null INTERNAL("internal")
|
||||||
|
@null UNKNOWN(null)
|
||||||
|
public final fun getValue() : java.lang.String = UastEmptyExpression
|
||||||
|
private fun Style(@org.jetbrains.annotations.Nullable value: java.lang.String) = UastEmptyExpression
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
public enum Style {
|
||||||
|
@null SYSTEM("system")
|
||||||
|
@null USER("user")
|
||||||
|
@null INTERNAL("internal")
|
||||||
|
@null UNKNOWN(null)
|
||||||
|
@org.jetbrains.annotations.Nullable private final var value: java.lang.String
|
||||||
|
public final fun getValue() : java.lang.String = UastEmptyExpression
|
||||||
|
private fun Style(@org.jetbrains.annotations.Nullable value: java.lang.String) = UastEmptyExpression
|
||||||
|
}
|
||||||
@@ -51,6 +51,9 @@ class KotlinIDERenderLogTest : AbstractKotlinUastLightCodeInsightFixtureTest(),
|
|||||||
@Test
|
@Test
|
||||||
fun testEnumValueMembers() = doTest("EnumValueMembers")
|
fun testEnumValueMembers() = doTest("EnumValueMembers")
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testEnumValuesConstructors() = doTest("EnumValuesConstructors")
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testStringTemplate() = doTest("StringTemplate")
|
fun testStringTemplate() = doTest("StringTemplate")
|
||||||
|
|
||||||
|
|||||||
@@ -266,6 +266,34 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testEnumCallIdentifier() {
|
||||||
|
doTest("EnumValuesConstructors") { _, file ->
|
||||||
|
val enumEntry = file.findElementByTextFromPsi<UElement>("(\"system\")")
|
||||||
|
enumEntry.accept(object : AbstractUastVisitor() {
|
||||||
|
override fun visitCallExpression(node: UCallExpression): Boolean {
|
||||||
|
val methodIdentifier = node.methodIdentifier
|
||||||
|
assertEquals("SYSTEM", methodIdentifier?.name)
|
||||||
|
return super.visitCallExpression(node)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testEnumCallWithBodyIdentifier() {
|
||||||
|
doTest("EnumValueMembers") { _, file ->
|
||||||
|
val enumEntry = file.findElementByTextFromPsi<UElement>("(\"foo\")")
|
||||||
|
enumEntry.accept(object : AbstractUastVisitor() {
|
||||||
|
override fun visitCallExpression(node: UCallExpression): Boolean {
|
||||||
|
val methodIdentifier = node.methodIdentifier
|
||||||
|
assertEquals("SHEET", methodIdentifier?.name)
|
||||||
|
return super.visitCallExpression(node)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testSimpleAnnotated() {
|
fun testSimpleAnnotated() {
|
||||||
doTest("SimpleAnnotated") { _, file ->
|
doTest("SimpleAnnotated") { _, file ->
|
||||||
|
|||||||
@@ -27,4 +27,7 @@ class KotlinUastIdentifiersTest : AbstractKotlinIdentifiersTest() {
|
|||||||
@Test
|
@Test
|
||||||
fun testSuperCalls() = doTest("SuperCalls")
|
fun testSuperCalls() = doTest("SuperCalls")
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testEnumValuesConstructors() = doTest("EnumValuesConstructors")
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -23,30 +23,43 @@ class SimpleKotlinRenderLogTest : AbstractKotlinUastTest(), AbstractKotlinRender
|
|||||||
@Test
|
@Test
|
||||||
fun testBitwise() = doTest("Bitwise")
|
fun testBitwise() = doTest("Bitwise")
|
||||||
|
|
||||||
@Test fun testElvis() = doTest("Elvis")
|
@Test
|
||||||
|
fun testElvis() = doTest("Elvis")
|
||||||
|
|
||||||
@Test fun testPropertyAccessors() = doTest("PropertyAccessors")
|
@Test
|
||||||
|
fun testPropertyAccessors() = doTest("PropertyAccessors")
|
||||||
|
|
||||||
@Test fun testPropertyInitializer() = doTest("PropertyInitializer")
|
@Test
|
||||||
|
fun testPropertyInitializer() = doTest("PropertyInitializer")
|
||||||
|
|
||||||
@Test fun testPropertyInitializerWithoutSetter() = doTest("PropertyInitializerWithoutSetter")
|
@Test
|
||||||
|
fun testPropertyInitializerWithoutSetter() = doTest("PropertyInitializerWithoutSetter")
|
||||||
|
|
||||||
@Test fun testAnnotationParameters() = doTest("AnnotationParameters")
|
@Test
|
||||||
|
fun testAnnotationParameters() = doTest("AnnotationParameters")
|
||||||
|
|
||||||
@Test fun testEnumValueMembers() = doTest("EnumValueMembers")
|
@Test
|
||||||
|
fun testEnumValueMembers() = doTest("EnumValueMembers")
|
||||||
|
|
||||||
@Test fun testStringTemplate() = doTest("StringTemplate")
|
@Test
|
||||||
|
fun testEnumValuesConstructors() = doTest("EnumValuesConstructors")
|
||||||
|
|
||||||
@Test fun testStringTemplateComplex() = doTest("StringTemplateComplex")
|
@Test
|
||||||
|
fun testStringTemplate() = doTest("StringTemplate")
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testStringTemplateComplex() = doTest("StringTemplateComplex")
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testStringTemplateComplexForUInjectionHost() = withForceUInjectionHostValue {
|
fun testStringTemplateComplexForUInjectionHost() = withForceUInjectionHostValue {
|
||||||
doTest("StringTemplateComplexForUInjectionHost")
|
doTest("StringTemplateComplexForUInjectionHost")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun testQualifiedConstructorCall() = doTest("QualifiedConstructorCall")
|
@Test
|
||||||
|
fun testQualifiedConstructorCall() = doTest("QualifiedConstructorCall")
|
||||||
|
|
||||||
@Test fun testPropertyDelegate() = doTest("PropertyDelegate")
|
@Test
|
||||||
|
fun testPropertyDelegate() = doTest("PropertyDelegate")
|
||||||
|
|
||||||
@Test fun testLocalVariableWithAnnotation() = doTest("LocalVariableWithAnnotation")
|
@Test fun testLocalVariableWithAnnotation() = doTest("LocalVariableWithAnnotation")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user