Uast: create KotlinULambdaExpression for in-place lambdas (KT-25297)
and provide appropriate functionalInterface
This commit is contained in:
committed by
xiexed
parent
668bd209f2
commit
38e2d474b7
@@ -184,7 +184,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
|
|||||||
is KtFunction ->
|
is KtFunction ->
|
||||||
if (original.isLocal) {
|
if (original.isLocal) {
|
||||||
el<ULambdaExpression> {
|
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)
|
createLocalFunctionLambdaExpression(original, givenParent)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -179,7 +179,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
|
|||||||
is KtFunction ->
|
is KtFunction ->
|
||||||
if (original.isLocal) {
|
if (original.isLocal) {
|
||||||
el<ULambdaExpression> {
|
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)
|
createLocalFunctionLambdaExpression(original, givenParent)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -183,7 +183,10 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin {
|
|||||||
is KtFunction ->
|
is KtFunction ->
|
||||||
if (original.isLocal) {
|
if (original.isLocal) {
|
||||||
el<ULambdaExpression> {
|
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)
|
createLocalFunctionLambdaExpression(original, givenParent)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
+5
@@ -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.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
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.addToStdlib.cast
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
import org.jetbrains.uast.*
|
import org.jetbrains.uast.*
|
||||||
@@ -360,6 +361,20 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
barMethod.assertResolveCall("contains(2 as Int)", "longRangeContains")
|
barMethod.assertResolveCall("contains(2 as Int)", "longRangeContains")
|
||||||
barMethod.assertResolveCall("IntRange(1, 2)")
|
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 =
|
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.getParentOfType
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
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.addToStdlib.cast
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
import org.jetbrains.uast.*
|
import org.jetbrains.uast.*
|
||||||
@@ -214,4 +215,16 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
barMethod.assertResolveCall("joinToString()")
|
barMethod.assertResolveCall("joinToString()")
|
||||||
barMethod.assertResolveCall("last()")
|
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.getParentOfType
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
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.addToStdlib.cast
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
import org.jetbrains.uast.*
|
import org.jetbrains.uast.*
|
||||||
@@ -324,6 +325,20 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
|||||||
barMethod.assertResolveCall("joinToString()")
|
barMethod.assertResolveCall("joinToString()")
|
||||||
barMethod.assertResolveCall("last()")
|
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() }}")
|
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() }}")
|
||||||
|
|||||||
Reference in New Issue
Block a user