Uast: explicitly expose implicit Lambda parameters

This commit is contained in:
Nicolay Mitropolsky
2020-05-13 22:44:15 +03:00
parent 5f64c6b9f1
commit 70237ecf31
7 changed files with 27 additions and 5 deletions
@@ -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 {
+1
View File
@@ -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 = >)
+2 -1
View File
@@ -24,7 +24,8 @@ public final class LambdaReturnKt {
var lam5: kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends java.lang.String> = 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
+1
View File
@@ -13,6 +13,7 @@ UFile (package = )
UIdentifier (Identifier (filter))
USimpleNameReferenceExpression (identifier = filter, resolvesTo = null)
ULambdaExpression
UParameter (name = it)
UBlockExpression
UReturnExpression
UQualifiedReferenceExpression
+2 -1
View File
@@ -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()
})
}
+1
View File
@@ -50,6 +50,7 @@ UFile (package = )
UIdentifier (Identifier (map))
USimpleNameReferenceExpression (identifier = map, resolvesTo = null)
ULambdaExpression
UParameter (name = it)
UBlockExpression
UReturnExpression
UQualifiedReferenceExpression
+2 -1
View File
@@ -12,7 +12,8 @@ public final class TypeReferencesKt {
if (var708e23eb != null) var708e23eb else return
}
var tl: java.util.List<? extends T> = listOf(at)
var tsl: java.util.List<? extends java.lang.String> = tl.map({
var tsl: java.util.List<? extends java.lang.String> = tl.map({ var it: T ->
return it.toString()
})
var lls: java.util.List<? extends java.util.List<? extends java.lang.String>>