From c04ba009e6c6d3b4e4e094eb20588b50cda2080c Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 8 Jan 2020 12:51:33 +0300 Subject: [PATCH] Uast: properly handling annotations on destructured variables (KT-35673, EA-220128) --- .../uast/kotlin/KotlinAbstractUElement.kt | 7 ++++- .../testData/DestructuringDeclaration.kt | 5 ++- .../testData/DestructuringDeclaration.log.txt | 31 +++++++++++++++++-- .../DestructuringDeclaration.render.txt | 11 ++++--- 4 files changed, 45 insertions(+), 9 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 02e71c48319..e60fb51dcc9 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt @@ -194,7 +194,12 @@ fun doConvertParent(element: UElement, parent: PsiElement?): UElement? { } if (result is KotlinUDestructuringDeclarationExpression && - element.psi == (parent as KtDestructuringDeclaration).initializer) { + when (parent) { + is KtDestructuringDeclaration -> parent.initializer?.let { it == element.psi } == true + is KtDeclarationModifierList -> parent == element.sourcePsi?.parent + else -> false + } + ) { return result.tempVarAssignment } diff --git a/plugins/uast-kotlin/testData/DestructuringDeclaration.kt b/plugins/uast-kotlin/testData/DestructuringDeclaration.kt index 7d7e604ed29..299c4bcb4e1 100644 --- a/plugins/uast-kotlin/testData/DestructuringDeclaration.kt +++ b/plugins/uast-kotlin/testData/DestructuringDeclaration.kt @@ -1,3 +1,6 @@ -fun foo() { +fun foo(data: Any) { val (a, b) = "foo" to 1 + + @Suppress("UNCHECKED_CAST") + val (k, v) = data as Pair } diff --git a/plugins/uast-kotlin/testData/DestructuringDeclaration.log.txt b/plugins/uast-kotlin/testData/DestructuringDeclaration.log.txt index e53cc1fcef7..288d88dd8e1 100644 --- a/plugins/uast-kotlin/testData/DestructuringDeclaration.log.txt +++ b/plugins/uast-kotlin/testData/DestructuringDeclaration.log.txt @@ -1,9 +1,11 @@ UFile (package = ) UClass (name = DestructuringDeclarationKt) UMethod (name = foo) + UParameter (name = data) + UAnnotation (fqName = org.jetbrains.annotations.NotNull) UBlockExpression UDeclarationsExpression - ULocalVariable (name = var268d4034) + ULocalVariable (name = var268d41a5) UAnnotation (fqName = null) UBinaryExpression (operator = ) ULiteralExpression (value = "foo") @@ -11,14 +13,37 @@ UFile (package = ) ULocalVariable (name = a) UAnnotation (fqName = null) UQualifiedReferenceExpression - USimpleNameReferenceExpression (identifier = var268d4034) + USimpleNameReferenceExpression (identifier = var268d41a5) UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) UIdentifier (Identifier (component1)) USimpleNameReferenceExpression (identifier = , resolvesTo = null) ULocalVariable (name = b) UAnnotation (fqName = null) UQualifiedReferenceExpression - USimpleNameReferenceExpression (identifier = var268d4034) + USimpleNameReferenceExpression (identifier = var268d41a5) + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) + UIdentifier (Identifier (component2)) + USimpleNameReferenceExpression (identifier = , resolvesTo = null) + UDeclarationsExpression + ULocalVariable (name = var465978a0) + UAnnotation (fqName = null) + UAnnotation (fqName = kotlin.Suppress) + UNamedExpression (name = names) + ULiteralExpression (value = "UNCHECKED_CAST") + UBinaryExpressionWithType + USimpleNameReferenceExpression (identifier = data) + UTypeReferenceExpression (name = kotlin.Pair) + ULocalVariable (name = k) + UAnnotation (fqName = null) + UQualifiedReferenceExpression + USimpleNameReferenceExpression (identifier = var465978a0) + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) + UIdentifier (Identifier (component1)) + USimpleNameReferenceExpression (identifier = , resolvesTo = null) + ULocalVariable (name = v) + UAnnotation (fqName = null) + UQualifiedReferenceExpression + USimpleNameReferenceExpression (identifier = var465978a0) UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) UIdentifier (Identifier (component2)) USimpleNameReferenceExpression (identifier = , resolvesTo = null) diff --git a/plugins/uast-kotlin/testData/DestructuringDeclaration.render.txt b/plugins/uast-kotlin/testData/DestructuringDeclaration.render.txt index 991072a9502..eee3c14de71 100644 --- a/plugins/uast-kotlin/testData/DestructuringDeclaration.render.txt +++ b/plugins/uast-kotlin/testData/DestructuringDeclaration.render.txt @@ -1,7 +1,10 @@ public final class DestructuringDeclarationKt { - public static final fun foo() : void { - @null var var268d4034: = "foo" 1 - @null var a: java.lang.String = var268d4034.() - @null var b: int = var268d4034.() + public static final fun foo(@org.jetbrains.annotations.NotNull data: java.lang.Object) : void { + @null var var268d41a5: = "foo" 1 + @null var a: java.lang.String = var268d41a5.() + @null var b: int = var268d41a5.() + @null @kotlin.Suppress(names = "UNCHECKED_CAST") var var465978a0: = data as kotlin.Pair + @null var k: java.lang.String = var465978a0.() + @null var v: java.lang.String = var465978a0.() } }