JS: fix translation of references to external nested classes in files marked with @JsModule. See KT-15797
This commit is contained in:
@@ -2,7 +2,9 @@
|
||||
package foo
|
||||
|
||||
@JsModule("A")
|
||||
external class <!NESTED_JS_MODULE_PROHIBITED!>A<!>
|
||||
external class <!NESTED_JS_MODULE_PROHIBITED!>A<!> {
|
||||
class Nested
|
||||
}
|
||||
|
||||
@JsModule("B")
|
||||
external <!NESTED_JS_MODULE_PROHIBITED!>object B<!>
|
||||
|
||||
@@ -10,6 +10,13 @@ package foo {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public final class Nested {
|
||||
public constructor Nested()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
@kotlin.js.JsModule(import = "B") public external object B {
|
||||
|
||||
@@ -14,6 +14,8 @@ external object A {
|
||||
@JsModule("B")
|
||||
external open class B {
|
||||
fun foo(): Int
|
||||
|
||||
class Nested
|
||||
}
|
||||
|
||||
@JsModule("bar")
|
||||
@@ -37,6 +39,8 @@ fun box() {
|
||||
<!CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM!>B<!>()
|
||||
<!CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM!>bar<!>()
|
||||
<!CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM!>baz<!>()
|
||||
|
||||
B.<!CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM!>Nested<!>()
|
||||
}
|
||||
|
||||
external class DerivedB : <!CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM!>B<!>
|
||||
@@ -19,6 +19,13 @@ package foo {
|
||||
public final fun foo(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public final class Nested {
|
||||
public constructor Nested()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -14,6 +14,8 @@ external object A {
|
||||
@JsNonModule
|
||||
external open class B {
|
||||
fun foo(): Int
|
||||
|
||||
class Nested
|
||||
}
|
||||
|
||||
@JsNonModule
|
||||
@@ -31,6 +33,7 @@ fun box() {
|
||||
A.<!CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM!>f<!>()+A.<!CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM!>g<!>
|
||||
<!CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM!>B<!>()
|
||||
<!CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM!>bar<!>()
|
||||
B.<!CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM!>Nested<!>()
|
||||
}
|
||||
|
||||
external class DerivedB : <!CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM!>B<!>
|
||||
+7
@@ -30,5 +30,12 @@ package foo {
|
||||
public final fun foo(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public final class Nested {
|
||||
public constructor Nested()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
||||
|
||||
@@ -45,10 +46,12 @@ object JsModuleChecker : SimpleDeclarationChecker {
|
||||
diagnosticHolder.report(ErrorsJs.JS_MODULE_PROHIBITED_ON_NON_NATIVE.on(declaration))
|
||||
}
|
||||
|
||||
val isFileModuleOrNonModule = AnnotationsUtils.getFileModuleName(bindingContext, descriptor) != null ||
|
||||
AnnotationsUtils.isFromNonModuleFile(bindingContext, descriptor)
|
||||
if (isFileModuleOrNonModule) {
|
||||
diagnosticHolder.report(ErrorsJs.NESTED_JS_MODULE_PROHIBITED.on(declaration))
|
||||
if (DescriptorUtils.isTopLevelDeclaration(descriptor)) {
|
||||
val isFileModuleOrNonModule = AnnotationsUtils.getFileModuleName(bindingContext, descriptor) != null ||
|
||||
AnnotationsUtils.isFromNonModuleFile(bindingContext, descriptor)
|
||||
if (isFileModuleOrNonModule) {
|
||||
diagnosticHolder.report(ErrorsJs.NESTED_JS_MODULE_PROHIBITED.on(declaration))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -279,7 +279,7 @@ public final class StaticContext {
|
||||
expression = getQualifiedExpression(suggested.getScope());
|
||||
}
|
||||
|
||||
if (isNativeObject(suggested.getDescriptor())) {
|
||||
if (isNativeObject(suggested.getDescriptor()) && DescriptorUtils.isTopLevelDeclaration(suggested.getDescriptor())) {
|
||||
String fileModuleName = AnnotationsUtils.getFileModuleName(getBindingContext(), suggested.getDescriptor());
|
||||
if (fileModuleName != null) {
|
||||
JsName moduleJsName = getImportedModule(fileModuleName, null).internalName;
|
||||
|
||||
@@ -6,6 +6,11 @@ define("lib", [], function() {
|
||||
return this.x + y;
|
||||
};
|
||||
|
||||
function Nested() {
|
||||
this.y = 55;
|
||||
}
|
||||
A.Nested = Nested;
|
||||
|
||||
B = {
|
||||
x: 123,
|
||||
foo: function(y) {
|
||||
|
||||
@@ -2,10 +2,14 @@
|
||||
@file:JsModule("lib")
|
||||
package foo
|
||||
|
||||
external class A(@native x: Int = noImpl) {
|
||||
external class A(x: Int) {
|
||||
val x: Int
|
||||
|
||||
fun foo(y: Int): Int = noImpl
|
||||
|
||||
class Nested {
|
||||
val y: Int
|
||||
}
|
||||
}
|
||||
|
||||
external object B {
|
||||
@@ -25,6 +29,9 @@ fun box(): String {
|
||||
assertEquals(23, a.x)
|
||||
assertEquals(65, a.foo(42))
|
||||
|
||||
val nested = A.Nested()
|
||||
assertEquals(55, nested.y)
|
||||
|
||||
assertEquals(123, B.x)
|
||||
assertEquals(265, B.foo(142))
|
||||
|
||||
|
||||
@@ -6,6 +6,11 @@ var lib = function() {
|
||||
return this.x + y;
|
||||
};
|
||||
|
||||
function Nested() {
|
||||
this.y = 55;
|
||||
}
|
||||
A.Nested = Nested;
|
||||
|
||||
B = {
|
||||
x: 123,
|
||||
foo: function(y) {
|
||||
|
||||
@@ -6,6 +6,10 @@ external class A(x: Int = noImpl) {
|
||||
val x: Int
|
||||
|
||||
fun foo(y: Int): Int = noImpl
|
||||
|
||||
class Nested {
|
||||
val y: Int
|
||||
}
|
||||
}
|
||||
|
||||
external object B {
|
||||
@@ -25,6 +29,9 @@ fun box(): String {
|
||||
assertEquals(23, a.x)
|
||||
assertEquals(65, a.foo(42))
|
||||
|
||||
val nested = A.Nested()
|
||||
assertEquals(55, nested.y)
|
||||
|
||||
assertEquals(123, B.x)
|
||||
assertEquals(265, B.foo(142))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user