From 70237ecf31e12f0a060f13b8bf862e2bbf45e7b0 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 13 May 2020 22:44:15 +0300 Subject: [PATCH] Uast: explicitly expose implicit Lambda parameters --- .../expressions/KotlinULambdaExpression.kt | 20 +++++++++++++++++-- .../uast-kotlin/testData/LambdaReturn.log.txt | 1 + .../testData/LambdaReturn.render.txt | 3 ++- plugins/uast-kotlin/testData/Lambdas.log.txt | 1 + .../uast-kotlin/testData/Lambdas.render.txt | 3 ++- .../testData/TypeReferences.log.txt | 1 + .../testData/TypeReferences.render.txt | 3 ++- 7 files changed, 27 insertions(+), 5 deletions(-) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt index f8ce03c3be2..42771c16e9a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt @@ -18,11 +18,13 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiType import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtLambdaExpression +import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsResultOfLambda +import org.jetbrains.kotlin.resolve.calls.components.isVararg import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter +import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameterBase class KotlinULambdaExpression( override val sourcePsi: KtLambdaExpression, @@ -58,9 +60,23 @@ class KotlinULambdaExpression( } override val valueParameters by lz { - sourcePsi.valueParameters.mapIndexed { i, p -> + + val explicitParameters = sourcePsi.valueParameters.mapIndexed { i, p -> KotlinUParameter(UastKotlinPsiParameter.create(p, sourcePsi, this, i), p, this) } + if (explicitParameters.isNotEmpty()) return@lz explicitParameters + + val functionDescriptor = sourcePsi.analyze()[FUNCTION, sourcePsi.functionLiteral] ?: return@lz emptyList() + functionDescriptor.valueParameters.mapIndexed { i, p -> + KotlinUParameter( + UastKotlinPsiParameterBase( + p.name.asString(), + p.type.toPsiType(this, sourcePsi, false), + sourcePsi, sourcePsi, sourcePsi.language, p.isVararg, null + ), + null, this + ) + } } override fun asRenderString(): String { diff --git a/plugins/uast-kotlin/testData/LambdaReturn.log.txt b/plugins/uast-kotlin/testData/LambdaReturn.log.txt index 39d0e1e7366..41227bdcfe3 100644 --- a/plugins/uast-kotlin/testData/LambdaReturn.log.txt +++ b/plugins/uast-kotlin/testData/LambdaReturn.log.txt @@ -83,6 +83,7 @@ UFile (package = org.jetbrains.uast.kotlin) UIdentifier (Identifier (bar)) USimpleNameReferenceExpression (identifier = bar, resolvesTo = null) ULambdaExpression + UParameter (name = it) UBlockExpression UIfExpression UBinaryExpression (operator = >) diff --git a/plugins/uast-kotlin/testData/LambdaReturn.render.txt b/plugins/uast-kotlin/testData/LambdaReturn.render.txt index b624dba84bd..7bab5caf59b 100644 --- a/plugins/uast-kotlin/testData/LambdaReturn.render.txt +++ b/plugins/uast-kotlin/testData/LambdaReturn.render.txt @@ -24,7 +24,8 @@ public final class LambdaReturnKt { var lam5: kotlin.jvm.functions.Function1 = fun (@org.jetbrains.annotations.NotNull var a: int) { return "a" + a } - bar({ + bar({ var it: int -> + if (it > 5) return var b: int = 1 return it + b diff --git a/plugins/uast-kotlin/testData/Lambdas.log.txt b/plugins/uast-kotlin/testData/Lambdas.log.txt index a1c08d596ad..aec871539f3 100644 --- a/plugins/uast-kotlin/testData/Lambdas.log.txt +++ b/plugins/uast-kotlin/testData/Lambdas.log.txt @@ -13,6 +13,7 @@ UFile (package = ) UIdentifier (Identifier (filter)) USimpleNameReferenceExpression (identifier = filter, resolvesTo = null) ULambdaExpression + UParameter (name = it) UBlockExpression UReturnExpression UQualifiedReferenceExpression diff --git a/plugins/uast-kotlin/testData/Lambdas.render.txt b/plugins/uast-kotlin/testData/Lambdas.render.txt index 319d124f5db..1f4107388cf 100644 --- a/plugins/uast-kotlin/testData/Lambdas.render.txt +++ b/plugins/uast-kotlin/testData/Lambdas.render.txt @@ -2,7 +2,8 @@ import java.util.stream.Stream public final class LambdasKt { public static final fun foo() : void { - Stream.empty().filter({ + Stream.empty().filter({ var it: java.lang.String -> + return it.isEmpty() }) } diff --git a/plugins/uast-kotlin/testData/TypeReferences.log.txt b/plugins/uast-kotlin/testData/TypeReferences.log.txt index aab40335748..13eabf769b3 100644 --- a/plugins/uast-kotlin/testData/TypeReferences.log.txt +++ b/plugins/uast-kotlin/testData/TypeReferences.log.txt @@ -50,6 +50,7 @@ UFile (package = ) UIdentifier (Identifier (map)) USimpleNameReferenceExpression (identifier = map, resolvesTo = null) ULambdaExpression + UParameter (name = it) UBlockExpression UReturnExpression UQualifiedReferenceExpression diff --git a/plugins/uast-kotlin/testData/TypeReferences.render.txt b/plugins/uast-kotlin/testData/TypeReferences.render.txt index a248e77f998..47e646574de 100644 --- a/plugins/uast-kotlin/testData/TypeReferences.render.txt +++ b/plugins/uast-kotlin/testData/TypeReferences.render.txt @@ -12,7 +12,8 @@ public final class TypeReferencesKt { if (var708e23eb != null) var708e23eb else return } var tl: java.util.List = listOf(at) - var tsl: java.util.List = tl.map({ + var tsl: java.util.List = tl.map({ var it: T -> + return it.toString() }) var lls: java.util.List>