JS: fix translation of references to external nested classes in files marked with @JsModule. See KT-15797

This commit is contained in:
Alexey Andreev
2017-01-19 15:53:25 +03:00
parent 5fc8208504
commit 245f23e7c2
12 changed files with 64 additions and 7 deletions
@@ -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
}
}
}
@@ -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<!>
@@ -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) {
+8 -1
View File
@@ -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))