diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 7061dc06426..e41dc05339d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -4571,6 +4571,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("kt16160.kt") + public void testKt16160() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/kt16160.kt"); + doTest(fileName); + } + @TestMetadata("lambda.kt") public void testLambda() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/lambda.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index a6a7638981d..3446b0603fa 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.config.JsConfig; import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics; +import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.TranslationUtils; import org.jetbrains.kotlin.name.Name; @@ -422,8 +423,7 @@ public class TranslationContext { } else { ClassDescriptor objectDescriptor = (ClassDescriptor) descriptor.getContainingDeclaration(); - JsExpression instanceFunctionRef = JsAstUtils.pureFqn(getNameForObjectInstance(objectDescriptor), null); - return new JsInvocation(instanceFunctionRef); + return ReferenceTranslator.translateAsValueReference(objectDescriptor, this); } } @@ -446,12 +446,7 @@ public class TranslationContext { } private boolean isConstructorOrDirectScope(DeclarationDescriptor descriptor) { - if (declarationDescriptor instanceof ClassDescriptor) { - return descriptor == declarationDescriptor; - } - else { - return declarationDescriptor != null && descriptor == DescriptorUtils.getContainingClass(declarationDescriptor); - } + return descriptor == DescriptorUtils.getParentOfType(declarationDescriptor, ClassDescriptor.class, false); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index b73305c4f16..6f85f1648d9 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -452,7 +452,7 @@ class ClassTranslator private constructor( instanceFun.body.statements += instanceCreatedGuard val objectRef = context().getInnerReference(descriptor) - instanceCreationBlock.statements += JsAstUtils.assignment(cachedInstanceName.makeRef(), JsNew(objectRef)).makeStmt() + instanceCreationBlock.statements += JsNew(objectRef).makeStmt() } else { instanceFun.body.statements += JsInvocation(pureFqn(enumInitializerName, null)).makeStmt() diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java index 76bc992b4f9..acb49f8d91a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtCallExpression; import org.jetbrains.kotlin.psi.KtExpression; import org.jetbrains.kotlin.psi.ValueArgument; +import org.jetbrains.kotlin.resolve.FunctionImportedFromObject; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.inline.InlineUtil; @@ -69,7 +70,10 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl } public static boolean shouldBeInlined(@NotNull CallableDescriptor descriptor) { - if (descriptor instanceof SimpleFunctionDescriptor || descriptor instanceof PropertyAccessorDescriptor) { + if (descriptor instanceof SimpleFunctionDescriptor || + descriptor instanceof PropertyAccessorDescriptor || + descriptor instanceof FunctionImportedFromObject + ) { return InlineUtil.isInline(descriptor); } diff --git a/js/js.translator/testData/box/inlineMultiModule/kt16160.kt b/js/js.translator/testData/box/inlineMultiModule/kt16160.kt new file mode 100644 index 00000000000..810fe72b1fb --- /dev/null +++ b/js/js.translator/testData/box/inlineMultiModule/kt16160.kt @@ -0,0 +1,58 @@ +// MODULE: main(module2) +// FILE: main.kt + +// CHECK_CONTAINS_NO_CALLS: box except=foo;bar;toString + +import A.test + +fun box(): String { + if (A.test() != 3) return "A.test()" + A.test() + if (B.test() != 6) return "B.test()" + B.test() + if (B().foo() != 4) return "B().foo()" + B().foo() + if (test() != 3) return "[A.]test()" + test() + if (test2() != 3) return "test2()" + test2() + if (A.test2() != 3) return "A.test2()" + A.test2() + if (B.test2() != 2) return "B.test2()" + B.test2() + if (B.C.test() != 4) return "B.C.test()" + B.C.test() + if (D().foo2() != 4) return "D().foo2()" + D().foo2() + if (D.test() != 4) return "D.test()" + D.test() + return "OK" +} + +// MODULE: module2 +// FILE: module2.kt + +import A.foo +import B.Companion.bar + +object A { + fun foo() = 1 + inline fun test() = foo() + this.foo() + A.foo() +} + +open class B { + companion object { + fun bar() = 2 + inline fun test() = bar() + this.bar() + B.bar() + } + + class C { + companion object { + inline fun test() = bar() + B.bar() + } + } + + inline fun foo() = bar() + B.bar() +} + +class D: B() { + inline fun foo2() = bar() + B.bar() + + companion object { + inline fun test() = bar() + B.bar() + } +} + +inline fun test2() = foo() + bar() +inline fun A.test2() = foo() + B.bar() +inline fun B.Companion.test2() = bar() \ No newline at end of file