Uast: properly handling annotations on destructured variables (KT-35673, EA-220128)

This commit is contained in:
Nicolay Mitropolsky
2020-01-08 12:51:33 +03:00
parent 9da536c202
commit c04ba009e6
4 changed files with 45 additions and 9 deletions
@@ -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
}
+4 -1
View File
@@ -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<String, String>
}
@@ -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 = <other>)
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 = <anonymous class>, 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 = <anonymous class>, 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<? extends java.lang.String,? extends java.lang.String>)
ULocalVariable (name = k)
UAnnotation (fqName = null)
UQualifiedReferenceExpression
USimpleNameReferenceExpression (identifier = var465978a0)
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))
UIdentifier (Identifier (component1))
USimpleNameReferenceExpression (identifier = <anonymous class>, 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 = <anonymous class>, resolvesTo = null)
@@ -1,7 +1,10 @@
public final class DestructuringDeclarationKt {
public static final fun foo() : void {
@null var var268d4034: <ErrorType> = "foo" <other> 1
@null var a: java.lang.String = var268d4034.<anonymous class>()
@null var b: int = var268d4034.<anonymous class>()
public static final fun foo(@org.jetbrains.annotations.NotNull data: java.lang.Object) : void {
@null var var268d41a5: <ErrorType> = "foo" <other> 1
@null var a: java.lang.String = var268d41a5.<anonymous class>()
@null var b: int = var268d41a5.<anonymous class>()
@null @kotlin.Suppress(names = "UNCHECKED_CAST") var var465978a0: <ErrorType> = data as kotlin.Pair<? extends java.lang.String,? extends java.lang.String>
@null var k: java.lang.String = var465978a0.<anonymous class>()
@null var v: java.lang.String = var465978a0.<anonymous class>()
}
}