From 222ceb7698745931d849cc54068f25c89859a8e8 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 29 Jan 2020 14:35:02 +0300 Subject: [PATCH] Uast: fix for Lambda in place call identifiers (KT-35432) --- .../KotlinUFunctionCallExpression.kt | 2 ++ .../testData/Lambdas.identifiers.txt | 19 ++++++++++++++++++ plugins/uast-kotlin/testData/Lambdas.kt | 6 ++++++ plugins/uast-kotlin/testData/Lambdas.log.txt | 7 +++++++ .../uast-kotlin/testData/Lambdas.refNames.txt | 20 +++++++++++++++++++ .../uast-kotlin/testData/Lambdas.render.txt | 4 ++++ .../tests/KotlinUastIdentifiersTest.kt | 3 +++ 7 files changed, 61 insertions(+) create mode 100644 plugins/uast-kotlin/testData/Lambdas.identifiers.txt create mode 100644 plugins/uast-kotlin/testData/Lambdas.refNames.txt diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt index be0fbaf3077..103e28816e4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt @@ -83,6 +83,8 @@ class KotlinUFunctionCallExpression( KotlinUIdentifier( calleeExpression.constructorReferenceExpression?.getReferencedNameElement() ?: calleeExpression, this ) + is KtLambdaExpression -> + KotlinUIdentifier(calleeExpression.functionLiteral.lBrace, this) else -> KotlinUIdentifier(calleeExpression, this) } } diff --git a/plugins/uast-kotlin/testData/Lambdas.identifiers.txt b/plugins/uast-kotlin/testData/Lambdas.identifiers.txt new file mode 100644 index 00000000000..49184986b8f --- /dev/null +++ b/plugins/uast-kotlin/testData/Lambdas.identifiers.txt @@ -0,0 +1,19 @@ +java -> USimpleNameReferenceExpression (identifier = java) +util -> USimpleNameReferenceExpression (identifier = util) +stream -> USimpleNameReferenceExpression (identifier = stream) +Stream -> USimpleNameReferenceExpression (identifier = Stream) +foo -> UMethod (name = foo) + Stream -> USimpleNameReferenceExpression (identifier = Stream) + empty -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) + String -> USimpleNameReferenceExpression (identifier = String) + filter -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) + it -> USimpleNameReferenceExpression (identifier = it) + isEmpty -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) +doSelectItem -> UMethod (name = doSelectItem) +selectItemFunction -> UParameter (name = selectItemFunction) +Unit -> USimpleNameReferenceExpression (identifier = Unit) + selectItemFunction -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) + baz -> ULocalVariable (name = baz) + Local -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) + baz -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) +lambdaInPlaceCall -> UMethod (name = lambdaInPlaceCall) diff --git a/plugins/uast-kotlin/testData/Lambdas.kt b/plugins/uast-kotlin/testData/Lambdas.kt index cac23a6536a..44663e2ce57 100644 --- a/plugins/uast-kotlin/testData/Lambdas.kt +++ b/plugins/uast-kotlin/testData/Lambdas.kt @@ -10,4 +10,10 @@ fun doSelectItem(selectItemFunction: () -> Unit) { Local() } baz() +} + +fun lambdaInPlaceCall() { + while ({ true }()) { + + } } \ No newline at end of file diff --git a/plugins/uast-kotlin/testData/Lambdas.log.txt b/plugins/uast-kotlin/testData/Lambdas.log.txt index 256e1d25f80..a1c08d596ad 100644 --- a/plugins/uast-kotlin/testData/Lambdas.log.txt +++ b/plugins/uast-kotlin/testData/Lambdas.log.txt @@ -37,3 +37,10 @@ UFile (package = ) UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) UIdentifier (Identifier (baz)) USimpleNameReferenceExpression (identifier = invoke, resolvesTo = null) + UMethod (name = lambdaInPlaceCall) + UBlockExpression + UWhileExpression + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) + UIdentifier (Identifier ({)) + USimpleNameReferenceExpression (identifier = invoke, resolvesTo = null) + UBlockExpression diff --git a/plugins/uast-kotlin/testData/Lambdas.refNames.txt b/plugins/uast-kotlin/testData/Lambdas.refNames.txt new file mode 100644 index 00000000000..351a2c5c322 --- /dev/null +++ b/plugins/uast-kotlin/testData/Lambdas.refNames.txt @@ -0,0 +1,20 @@ +Stream -> USimpleNameReferenceExpression (identifier = Stream) from KtDotQualifiedExpression +stream -> USimpleNameReferenceExpression (identifier = stream) from KtDotQualifiedExpression +util -> USimpleNameReferenceExpression (identifier = util) from KtDotQualifiedExpression +java -> USimpleNameReferenceExpression (identifier = java) from KtNameReferenceExpression +util -> USimpleNameReferenceExpression (identifier = util) from KtNameReferenceExpression +stream -> USimpleNameReferenceExpression (identifier = stream) from KtNameReferenceExpression +Stream -> USimpleNameReferenceExpression (identifier = Stream) from KtNameReferenceExpression +filter -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) from KtDotQualifiedExpression +empty -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtDotQualifiedExpression +Stream -> USimpleNameReferenceExpression (identifier = Stream) from KtNameReferenceExpression +empty -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtNameReferenceExpression +String -> USimpleNameReferenceExpression (identifier = String) from KtNameReferenceExpression +filter -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) from KtNameReferenceExpression +isEmpty -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtDotQualifiedExpression +it -> USimpleNameReferenceExpression (identifier = it) from KtNameReferenceExpression +isEmpty -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtNameReferenceExpression +Unit -> USimpleNameReferenceExpression (identifier = Unit) from KtNameReferenceExpression +selectItemFunction -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtNameReferenceExpression +Local -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtNameReferenceExpression +baz -> UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) from KtNameReferenceExpression diff --git a/plugins/uast-kotlin/testData/Lambdas.render.txt b/plugins/uast-kotlin/testData/Lambdas.render.txt index 7112bc0d0ba..319d124f5db 100644 --- a/plugins/uast-kotlin/testData/Lambdas.render.txt +++ b/plugins/uast-kotlin/testData/Lambdas.render.txt @@ -13,4 +13,8 @@ public final class LambdasKt { } invoke() } + public static final fun lambdaInPlaceCall() : void { + while (invoke()) { + } + } } diff --git a/plugins/uast-kotlin/tests/KotlinUastIdentifiersTest.kt b/plugins/uast-kotlin/tests/KotlinUastIdentifiersTest.kt index c54289adc05..798061028e5 100644 --- a/plugins/uast-kotlin/tests/KotlinUastIdentifiersTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastIdentifiersTest.kt @@ -24,6 +24,9 @@ class KotlinUastIdentifiersTest : AbstractKotlinIdentifiersTest() { @Test fun testAnonymous() = doTest("Anonymous") + @Test + fun testLambdas() = doTest("Lambdas") + @Test fun testSuperCalls() = doTest("SuperCalls")