JS/Inlining: in expression like f(g()), where *f* is inline, don't treat g() as a lambda constructor

This commit is contained in:
Alexey Andreev
2016-05-05 17:05:20 +03:00
parent 65876c36eb
commit ee6483b7ec
3 changed files with 18 additions and 4 deletions
@@ -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.metadata.descriptor
import org.jetbrains.kotlin.js.inline.FunctionReader
import org.jetbrains.kotlin.js.inline.util.getSimpleName
import org.jetbrains.kotlin.js.inline.util.isCallInvocation
import org.jetbrains.kotlin.js.inline.util.transitiveStaticRef
import org.jetbrains.kotlin.js.inline.util.*
abstract class FunctionContext(
private val function: JsFunction,
@@ -86,7 +84,7 @@ abstract class FunctionContext(
/** process cases 2, 3 */
val qualifier = callQualifier.transitiveStaticRef
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 JsFunction -> qualifier
else -> null
@@ -89,6 +89,12 @@ public class InlineJsTestGenerated extends AbstractInlineJsTest {
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")
public void testExpressionBodyWithLambdaCall() throws Exception {
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"
}