Skip to content

Commit a74fffe

Browse files
committed
JS: companion object dispatch receiver translation fixed (KT-16160); imported function inlining fixed.
1 parent a2431f0 commit a74fffe

File tree

5 files changed

+73
-10
lines changed

5 files changed

+73
-10
lines changed

js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4571,6 +4571,12 @@ public void testKt16144() throws Exception {
45714571
doTest(fileName);
45724572
}
45734573

4574+
@TestMetadata("kt16160.kt")
4575+
public void testKt16160() throws Exception {
4576+
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/kt16160.kt");
4577+
doTest(fileName);
4578+
}
4579+
45744580
@TestMetadata("lambda.kt")
45754581
public void testLambda() throws Exception {
45764582
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/lambda.kt");

js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
3030
import org.jetbrains.kotlin.js.config.JsConfig;
3131
import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics;
32+
import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator;
3233
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
3334
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
3435
import org.jetbrains.kotlin.name.Name;
@@ -422,8 +423,7 @@ public JsExpression getDispatchReceiver(@NotNull ReceiverParameterDescriptor des
422423
}
423424
else {
424425
ClassDescriptor objectDescriptor = (ClassDescriptor) descriptor.getContainingDeclaration();
425-
JsExpression instanceFunctionRef = JsAstUtils.pureFqn(getNameForObjectInstance(objectDescriptor), null);
426-
return new JsInvocation(instanceFunctionRef);
426+
return ReferenceTranslator.translateAsValueReference(objectDescriptor, this);
427427
}
428428
}
429429

@@ -446,12 +446,7 @@ public JsExpression getDispatchReceiver(@NotNull ReceiverParameterDescriptor des
446446
}
447447

448448
private boolean isConstructorOrDirectScope(DeclarationDescriptor descriptor) {
449-
if (declarationDescriptor instanceof ClassDescriptor) {
450-
return descriptor == declarationDescriptor;
451-
}
452-
else {
453-
return declarationDescriptor != null && descriptor == DescriptorUtils.getContainingClass(declarationDescriptor);
454-
}
449+
return descriptor == DescriptorUtils.getParentOfType(declarationDescriptor, ClassDescriptor.class, false);
455450
}
456451

457452
@NotNull

js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ class ClassTranslator private constructor(
452452
instanceFun.body.statements += instanceCreatedGuard
453453

454454
val objectRef = context().getInnerReference(descriptor)
455-
instanceCreationBlock.statements += JsAstUtils.assignment(cachedInstanceName.makeRef(), JsNew(objectRef)).makeStmt()
455+
instanceCreationBlock.statements += JsNew(objectRef).makeStmt()
456456
}
457457
else {
458458
instanceFun.body.statements += JsInvocation(pureFqn(enumInitializerName, null)).makeStmt()

js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.jetbrains.kotlin.psi.KtCallExpression;
3535
import org.jetbrains.kotlin.psi.KtExpression;
3636
import org.jetbrains.kotlin.psi.ValueArgument;
37+
import org.jetbrains.kotlin.resolve.FunctionImportedFromObject;
3738
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt;
3839
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
3940
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
@@ -69,7 +70,10 @@ public static boolean shouldBeInlined(@NotNull CallableDescriptor descriptor, @N
6970
}
7071

7172
public static boolean shouldBeInlined(@NotNull CallableDescriptor descriptor) {
72-
if (descriptor instanceof SimpleFunctionDescriptor || descriptor instanceof PropertyAccessorDescriptor) {
73+
if (descriptor instanceof SimpleFunctionDescriptor ||
74+
descriptor instanceof PropertyAccessorDescriptor ||
75+
descriptor instanceof FunctionImportedFromObject
76+
) {
7377
return InlineUtil.isInline(descriptor);
7478
}
7579

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// MODULE: main(module2)
2+
// FILE: main.kt
3+
4+
// CHECK_CONTAINS_NO_CALLS: box except=foo;bar;toString
5+
6+
import A.test
7+
8+
fun box(): String {
9+
if (A.test() != 3) return "A.test()" + A.test()
10+
if (B.test() != 6) return "B.test()" + B.test()
11+
if (B().foo() != 4) return "B().foo()" + B().foo()
12+
if (test() != 3) return "[A.]test()" + test()
13+
if (test2() != 3) return "test2()" + test2()
14+
if (A.test2() != 3) return "A.test2()" + A.test2()
15+
if (B.test2() != 2) return "B.test2()" + B.test2()
16+
if (B.C.test() != 4) return "B.C.test()" + B.C.test()
17+
if (D().foo2() != 4) return "D().foo2()" + D().foo2()
18+
if (D.test() != 4) return "D.test()" + D.test()
19+
return "OK"
20+
}
21+
22+
// MODULE: module2
23+
// FILE: module2.kt
24+
25+
import A.foo
26+
import B.Companion.bar
27+
28+
object A {
29+
fun foo() = 1
30+
inline fun test() = foo() + this.foo() + A.foo()
31+
}
32+
33+
open class B {
34+
companion object {
35+
fun bar() = 2
36+
inline fun test() = bar() + this.bar() + B.bar()
37+
}
38+
39+
class C {
40+
companion object {
41+
inline fun test() = bar() + B.bar()
42+
}
43+
}
44+
45+
inline fun foo() = bar() + B.bar()
46+
}
47+
48+
class D: B() {
49+
inline fun foo2() = bar() + B.bar()
50+
51+
companion object {
52+
inline fun test() = bar() + B.bar()
53+
}
54+
}
55+
56+
inline fun test2() = foo() + bar()
57+
inline fun A.test2() = foo() + B.bar()
58+
inline fun B.Companion.test2() = bar()

0 commit comments

Comments
 (0)