KJS: fix refering to native nested class
This commit is contained in:
@@ -3419,6 +3419,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("formNestedNativeClass.kt")
|
||||||
|
public void testFormNestedNativeClass() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inheritance/formNestedNativeClass.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("fromFakeClasses.kt")
|
@TestMetadata("fromFakeClasses.kt")
|
||||||
public void testFromFakeClasses() throws Exception {
|
public void testFromFakeClasses() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inheritance/fromFakeClasses.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inheritance/fromFakeClasses.kt");
|
||||||
|
|||||||
@@ -436,10 +436,6 @@ public final class StaticContext {
|
|||||||
if (descriptor instanceof LocalVariableDescriptor || descriptor instanceof ParameterDescriptor) {
|
if (descriptor instanceof LocalVariableDescriptor || descriptor instanceof ParameterDescriptor) {
|
||||||
return getNameForDescriptor(descriptor);
|
return getNameForDescriptor(descriptor);
|
||||||
}
|
}
|
||||||
if (isNativeObject(descriptor)) {
|
|
||||||
String name = getNameForAnnotatedObject(descriptor);
|
|
||||||
if (name != null) return rootFunction.getScope().declareName(name);
|
|
||||||
}
|
|
||||||
if (descriptor instanceof ConstructorDescriptor) {
|
if (descriptor instanceof ConstructorDescriptor) {
|
||||||
if (((ConstructorDescriptor) descriptor).isPrimary()) {
|
if (((ConstructorDescriptor) descriptor).isPrimary()) {
|
||||||
return getInnerNameForDescriptor(((ConstructorDescriptor) descriptor).getConstructedClass());
|
return getInnerNameForDescriptor(((ConstructorDescriptor) descriptor).getConstructedClass());
|
||||||
@@ -694,7 +690,15 @@ public final class StaticContext {
|
|||||||
|
|
||||||
List<JsStatement> statements = rootFunction.getBody().getStatements();
|
List<JsStatement> statements = rootFunction.getBody().getStatements();
|
||||||
|
|
||||||
JsExpression superPrototype = JsAstUtils.prototypeOf(new JsNameRef(getInnerNameForDescriptor(superclass)));
|
JsNameRef superclassRef;
|
||||||
|
if (isNativeObject(superclass) || isLibraryObject(superclass)) {
|
||||||
|
superclassRef = getQualifiedReference(superclass);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
superclassRef = getInnerNameForDescriptor(superclass).makeRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
JsExpression superPrototype = JsAstUtils.prototypeOf(superclassRef);
|
||||||
JsExpression superPrototypeInstance = new JsInvocation(new JsNameRef("create", "Object"), superPrototype);
|
JsExpression superPrototypeInstance = new JsInvocation(new JsNameRef("create", "Object"), superPrototype);
|
||||||
JsExpression classRef = new JsNameRef(getInnerNameForDescriptor(cls));
|
JsExpression classRef = new JsNameRef(getInnerNameForDescriptor(cls));
|
||||||
JsExpression prototype = JsAstUtils.prototypeOf(classRef);
|
JsExpression prototype = JsAstUtils.prototypeOf(classRef);
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ import java.util.*;
|
|||||||
|
|
||||||
import static org.jetbrains.kotlin.js.descriptorUtils.DescriptorUtilsKt.isCoroutineLambda;
|
import static org.jetbrains.kotlin.js.descriptorUtils.DescriptorUtilsKt.isCoroutineLambda;
|
||||||
import static org.jetbrains.kotlin.js.translate.context.UsageTrackerKt.getNameForCapturedDescriptor;
|
import static org.jetbrains.kotlin.js.translate.context.UsageTrackerKt.getNameForCapturedDescriptor;
|
||||||
|
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isLibraryObject;
|
||||||
|
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject;
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getDescriptorForElement;
|
import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getDescriptorForElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -232,6 +234,10 @@ public class TranslationContext {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JsNameRef getInnerReference(@NotNull DeclarationDescriptor descriptor) {
|
public JsNameRef getInnerReference(@NotNull DeclarationDescriptor descriptor) {
|
||||||
|
if (isNativeObject(descriptor) || isLibraryObject(descriptor)) {
|
||||||
|
return getQualifiedReference(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
return JsAstUtils.pureFqn(getInnerNameForDescriptor(descriptor), null);
|
return JsAstUtils.pureFqn(getInnerNameForDescriptor(descriptor), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
// FILE: foo.kt
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
@native
|
||||||
|
class A {
|
||||||
|
open class B {
|
||||||
|
fun foo(): String
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class C : A.B()
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return C().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: bar.js
|
||||||
|
|
||||||
|
function A() {
|
||||||
|
}
|
||||||
|
|
||||||
|
A.B = function() {
|
||||||
|
};
|
||||||
|
|
||||||
|
A.B.prototype.foo = function() {
|
||||||
|
return "OK"
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user