Uast: create KotlinULambdaExpression for in-place lambdas (KT-25297)

and provide appropriate functionalInterface
This commit is contained in:
Nicolay Mitropolsky
2018-07-05 21:52:50 +03:00
committed by xiexed
parent 668bd209f2
commit 38e2d474b7
7 changed files with 60 additions and 3 deletions
@@ -184,7 +184,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
is KtFunction ->
if (original.isLocal) {
el<ULambdaExpression> {
if (original.name.isNullOrEmpty() || original.parent is KtLambdaExpression) {
val parent = original.parent
if (parent is KtLambdaExpression) {
KotlinULambdaExpression(parent, givenParent) // your parent is the ULambdaExpression
} else if (original.name.isNullOrEmpty()) {
createLocalFunctionLambdaExpression(original, givenParent)
}
else {
@@ -179,7 +179,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
is KtFunction ->
if (original.isLocal) {
el<ULambdaExpression> {
if (original.name.isNullOrEmpty() || original.parent is KtLambdaExpression) {
val parent = original.parent
if (parent is KtLambdaExpression) {
KotlinULambdaExpression(parent, givenParent) // your parent is the ULambdaExpression
} else if (original.name.isNullOrEmpty()) {
createLocalFunctionLambdaExpression(original, givenParent)
}
else {
@@ -183,7 +183,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
is KtFunction ->
if (original.isLocal) {
el<ULambdaExpression> {
if (original.name.isNullOrEmpty() || original.parent is KtLambdaExpression) {
val parent = original.parent
if (parent is KtLambdaExpression) {
KotlinULambdaExpression(parent, givenParent) // your parent is the ULambdaExpression
} else if (original.name.isNullOrEmpty()) {
createLocalFunctionLambdaExpression(original, givenParent)
}
else {
+5
View File
@@ -0,0 +1,5 @@
import java.util.stream.Stream
fun foo() {
Stream.empty<String>().filter { it.isEmpty() }
}
@@ -7,6 +7,7 @@ import org.jetbrains.kotlin.asJava.toLightAnnotation
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.sure
import org.jetbrains.uast.*
@@ -360,6 +361,20 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
barMethod.assertResolveCall("contains(2 as Int)", "longRangeContains")
barMethod.assertResolveCall("IntRange(1, 2)")
}
@Test
fun testUtilsStreamLambda() {
doTest("Lambdas") { _, file ->
val lambda = file.findElementByTextFromPsi<ULambdaExpression>("{ it.isEmpty() }")
assertEquals(
"kotlin.jvm.functions.Function1<? super java.lang.String,? extends java.lang.Boolean>",
lambda.getExpressionType()?.canonicalText
)
val uCallExpression = lambda.uastParent.assertedCast<UCallExpression> { "UCallExpression expected" }
assertTrue(uCallExpression.valueArguments.contains(lambda))
}
}
}
fun <T, R> Iterable<T>.assertedFind(value: R, transform: (T) -> R): T =
@@ -7,6 +7,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.sure
import org.jetbrains.uast.*
@@ -214,4 +215,16 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
barMethod.assertResolveCall("joinToString()")
barMethod.assertResolveCall("last()")
}
@Test
fun testUtilsStreamLambda() {
doTest("Lambdas") { _, file ->
val lambda = file.findElementByTextFromPsi<ULambdaExpression>("{ it.isEmpty() }")
assertEquals(
"kotlin.jvm.functions.Function1<? super java.lang.String,? extends java.lang.Boolean>",
lambda.getExpressionType()?.canonicalText
)
val uCallExpression = lambda.uastParent.assertedCast<UCallExpression> { "UCallExpression expected" }
assertTrue(uCallExpression.valueArguments.contains(lambda))
}
}
@@ -8,6 +8,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.sure
import org.jetbrains.uast.*
@@ -324,6 +325,20 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
barMethod.assertResolveCall("joinToString()")
barMethod.assertResolveCall("last()")
}
@Test
fun testUtilsStreamLambda() {
doTest("Lambdas") { _, file ->
val lambda = file.findElementByTextFromPsi<ULambdaExpression>("{ it.isEmpty() }")
assertEquals(
"kotlin.jvm.functions.Function1<? super java.lang.String,? extends java.lang.Boolean>",
lambda.getExpressionType()?.canonicalText
)
val uCallExpression = lambda.uastParent.assertedCast<UCallExpression> { "UCallExpression expected" }
assertTrue(uCallExpression.valueArguments.contains(lambda))
}
}
}
fun <T, R> Iterable<T>.assertedFind(value: R, transform: (T) -> R): T = find { transform(it) == value } ?: throw AssertionError("'$value' not found, only ${this.joinToString { transform(it).toString() }}")