JS: fix inlining of functions derived from other modules

See KT-16408
This commit is contained in:
Alexey Andreev
2017-09-05 15:13:50 +03:00
parent 361d6dfca0
commit 5bf4540458
4 changed files with 24 additions and 5 deletions
@@ -4754,6 +4754,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest(fileName);
}
@TestMetadata("fakeFunctionInAnotherModule.kt")
public void testFakeFunctionInAnotherModule() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/fakeFunctionInAnotherModule.kt");
doTest(fileName);
}
@TestMetadata("importObjectInstance.kt")
public void testImportObjectInstance() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/importObjectInstance.kt");
@@ -40,10 +40,7 @@ import org.jetbrains.kotlin.js.translate.context.generator.Generator;
import org.jetbrains.kotlin.js.translate.context.generator.Rule;
import org.jetbrains.kotlin.js.translate.declaration.ClassModelGenerator;
import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics;
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils;
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
import org.jetbrains.kotlin.js.translate.utils.SignatureUtilsKt;
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
import org.jetbrains.kotlin.js.translate.utils.*;
import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.resolve.BindingContext;
@@ -805,6 +802,7 @@ public final class StaticContext {
}
public void addInlineCall(@NotNull CallableDescriptor descriptor) {
descriptor = (CallableDescriptor) JsDescriptorUtils.findRealInlineDeclaration(descriptor);
String tag = Namer.getFunctionTag(descriptor, config);
JsExpression moduleExpression = exportModuleForInline(DescriptorUtils.getContainingModule(descriptor));
if (moduleExpression == null) {
@@ -169,7 +169,7 @@ public final class JsDescriptorUtils {
}
@Nullable
private static FunctionDescriptor findRealDeclaration(FunctionDescriptor descriptor) {
private static FunctionDescriptor findRealDeclaration(@NotNull FunctionDescriptor descriptor) {
if (descriptor.getModality() == Modality.ABSTRACT) return null;
if (descriptor.getKind().isReal()) return descriptor;
@@ -0,0 +1,15 @@
// EXPECTED_REACHABLE_NODES: 996
// MODULE: lib
// FILE: lib1.kt
open class Parent {
inline fun b() = c()
}
// FILE: lib2.kt
fun c() = "OK"
// MODULE: main(lib)
// FILE: main.kt
class Child : Parent()
fun box() = Child().b()