JS/Inlining: in expression like f(g()), where *f* is inline, don't treat g() as a lambda constructor
This commit is contained in:
@@ -19,9 +19,7 @@ package org.jetbrains.kotlin.js.inline.context
|
|||||||
import com.google.dart.compiler.backend.js.ast.*
|
import com.google.dart.compiler.backend.js.ast.*
|
||||||
import com.google.dart.compiler.backend.js.ast.metadata.descriptor
|
import com.google.dart.compiler.backend.js.ast.metadata.descriptor
|
||||||
import org.jetbrains.kotlin.js.inline.FunctionReader
|
import org.jetbrains.kotlin.js.inline.FunctionReader
|
||||||
import org.jetbrains.kotlin.js.inline.util.getSimpleName
|
import org.jetbrains.kotlin.js.inline.util.*
|
||||||
import org.jetbrains.kotlin.js.inline.util.isCallInvocation
|
|
||||||
import org.jetbrains.kotlin.js.inline.util.transitiveStaticRef
|
|
||||||
|
|
||||||
abstract class FunctionContext(
|
abstract class FunctionContext(
|
||||||
private val function: JsFunction,
|
private val function: JsFunction,
|
||||||
@@ -86,7 +84,7 @@ abstract class FunctionContext(
|
|||||||
/** process cases 2, 3 */
|
/** process cases 2, 3 */
|
||||||
val qualifier = callQualifier.transitiveStaticRef
|
val qualifier = callQualifier.transitiveStaticRef
|
||||||
return when (qualifier) {
|
return when (qualifier) {
|
||||||
is JsInvocation -> lookUpStaticFunction(getSimpleName(qualifier)!!)
|
is JsInvocation -> lookUpStaticFunction(getSimpleName(qualifier)!!)?.let { if (isFunctionCreator(it)) it else null }
|
||||||
is JsNameRef -> lookUpStaticFunction(qualifier.name)
|
is JsNameRef -> lookUpStaticFunction(qualifier.name)
|
||||||
is JsFunction -> qualifier
|
is JsFunction -> qualifier
|
||||||
else -> null
|
else -> null
|
||||||
|
|||||||
@@ -89,6 +89,12 @@ public class InlineJsTestGenerated extends AbstractInlineJsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("dontInlineFunctionCall.kt")
|
||||||
|
public void testDontInlineFunctionCall() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/inline/cases/dontInlineFunctionCall.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("expressionBodyWithLambdaCall.kt")
|
@TestMetadata("expressionBodyWithLambdaCall.kt")
|
||||||
public void testExpressionBodyWithLambdaCall() throws Exception {
|
public void testExpressionBodyWithLambdaCall() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/inline/cases/expressionBodyWithLambdaCall.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/inline/cases/expressionBodyWithLambdaCall.kt");
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
inline fun block(p: () -> Int) = p()
|
||||||
|
|
||||||
|
fun createFunction(x: Int): () -> Int = { x }
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
assertEquals(23, block(createFunction(23)))
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user