JS: companion object dispatch receiver translation fixed (KT-16160); imported function inlining fixed.
This commit is contained in:
@@ -4571,6 +4571,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("lambda.kt")
|
||||||
public void testLambda() throws Exception {
|
public void testLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/lambda.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/lambda.kt");
|
||||||
|
|||||||
+3
-8
@@ -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.backend.ast.metadata.MetadataProperties;
|
||||||
import org.jetbrains.kotlin.js.config.JsConfig;
|
import org.jetbrains.kotlin.js.config.JsConfig;
|
||||||
import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics;
|
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.JsAstUtils;
|
||||||
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
|
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
@@ -422,8 +423,7 @@ public class TranslationContext {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ClassDescriptor objectDescriptor = (ClassDescriptor) descriptor.getContainingDeclaration();
|
ClassDescriptor objectDescriptor = (ClassDescriptor) descriptor.getContainingDeclaration();
|
||||||
JsExpression instanceFunctionRef = JsAstUtils.pureFqn(getNameForObjectInstance(objectDescriptor), null);
|
return ReferenceTranslator.translateAsValueReference(objectDescriptor, this);
|
||||||
return new JsInvocation(instanceFunctionRef);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,12 +446,7 @@ public class TranslationContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isConstructorOrDirectScope(DeclarationDescriptor descriptor) {
|
private boolean isConstructorOrDirectScope(DeclarationDescriptor descriptor) {
|
||||||
if (declarationDescriptor instanceof ClassDescriptor) {
|
return descriptor == DescriptorUtils.getParentOfType(declarationDescriptor, ClassDescriptor.class, false);
|
||||||
return descriptor == declarationDescriptor;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return declarationDescriptor != null && descriptor == DescriptorUtils.getContainingClass(declarationDescriptor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+1
-1
@@ -452,7 +452,7 @@ class ClassTranslator private constructor(
|
|||||||
instanceFun.body.statements += instanceCreatedGuard
|
instanceFun.body.statements += instanceCreatedGuard
|
||||||
|
|
||||||
val objectRef = context().getInnerReference(descriptor)
|
val objectRef = context().getInnerReference(descriptor)
|
||||||
instanceCreationBlock.statements += JsAstUtils.assignment(cachedInstanceName.makeRef(), JsNew(objectRef)).makeStmt()
|
instanceCreationBlock.statements += JsNew(objectRef).makeStmt()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
instanceFun.body.statements += JsInvocation(pureFqn(enumInitializerName, null)).makeStmt()
|
instanceFun.body.statements += JsInvocation(pureFqn(enumInitializerName, null)).makeStmt()
|
||||||
|
|||||||
+5
-1
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.name.Name;
|
|||||||
import org.jetbrains.kotlin.psi.KtCallExpression;
|
import org.jetbrains.kotlin.psi.KtCallExpression;
|
||||||
import org.jetbrains.kotlin.psi.KtExpression;
|
import org.jetbrains.kotlin.psi.KtExpression;
|
||||||
import org.jetbrains.kotlin.psi.ValueArgument;
|
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.callUtil.CallUtilKt;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
|
||||||
@@ -69,7 +70,10 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shouldBeInlined(@NotNull CallableDescriptor descriptor) {
|
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);
|
return InlineUtil.isInline(descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
Reference in New Issue
Block a user