JS: Fix capturing class construction function for lambdas inside inline functions with reified type parameters (KT-13522).

This commit is contained in:
Anton Bannykh
2016-12-01 19:22:48 +03:00
parent 729a3a34b8
commit 6301e3ec30
5 changed files with 54 additions and 0 deletions
@@ -6464,6 +6464,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest(fileName);
}
@TestMetadata("jsClassOnReifiedTypeInLambda.kt")
public void testJsClassOnReifiedTypeInLambda() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/reflection/jsClassOnReifiedTypeInLambda.kt");
doTest(fileName);
}
@TestMetadata("jsClassSimpleName.kt")
public void testJsClassSimpleName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/reflection/jsClassSimpleName.kt");
@@ -6488,6 +6494,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest(fileName);
}
@TestMetadata("kClassOnReifiedTypeInLambda.kt")
public void testKClassOnReifiedTypeInLambda() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/reflection/kClassOnReifiedTypeInLambda.kt");
doTest(fileName);
}
@TestMetadata("kClassSimpleName.kt")
public void testKClassSimpleName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/reflection/kClassSimpleName.kt");
@@ -141,6 +141,12 @@ fun JsFunction.withCapturedParameters(
var additionalArgs = listOf(capturedRef)
var additionalParams = listOf(JsParameter(name))
if (capturedDescriptor is TypeParameterDescriptor && capturedDescriptor.isReified) {
// Preserve the usual order
additionalArgs = listOf(invokingContext.getNameForDescriptor(capturedDescriptor).makeRef()) + additionalArgs
additionalParams = listOf(JsParameter(context.getNameForDescriptor(capturedDescriptor))) + additionalParams
}
if (capturedDescriptor is CallableDescriptor && isLocalInlineDeclaration(capturedDescriptor)) {
val aliasRef = capturedRef as? JsNameRef
val localFunAlias = aliasRef?.getStaticRef() as? JsExpression
@@ -89,6 +89,8 @@ fun getReferenceToJsClass(type: KotlinType, context: TranslationContext): JsExpr
is TypeParameterDescriptor -> {
assert(classifierDescriptor.isReified)
context.usageTracker()?.used(classifierDescriptor)
context.getNameForDescriptor(classifierDescriptor).makeRef()
}
else -> {
@@ -0,0 +1,15 @@
package foo
inline fun <reified T : Any> foo(): () -> JsClass<T> {
val T = 1
return { jsClass<T>() }
}
fun box(): String {
check(jsClass<A>(), foo<A>()())
check(jsClass<B>(), foo<B>()())
check(jsClass<O>(), foo<O>()())
check(jsClass<E>(), foo<E>()())
return "OK"
}
@@ -0,0 +1,19 @@
package foo
import kotlin.reflect.KClass
inline fun <reified T : Any> foo(b: Boolean = false): () -> KClass<T> {
if (b) {
val T = 1
}
return { T::class }
}
fun box(): String {
check(A::class, foo<A>()())
check(B::class, foo<B>()())
check(O::class, foo<O>()())
check(E::class, foo<E>()())
return "OK"
}