diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.kt similarity index 61% rename from compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.kt rename to compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.kt index 921382c01c6..ea5a0eb8f5d 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.kt @@ -1,3 +1,7 @@ class A { @native inner class B } + +@native class C { + @native inner class D +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.txt new file mode 100644 index 00000000000..f24fb89626b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.txt @@ -0,0 +1,29 @@ +package + +public final class A { + public constructor A() + 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.native() public final inner class B { + public constructor B() + 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.native() public final class C { + public constructor C() + 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.native() public final inner class D { + public constructor D() + 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 + } +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.txt deleted file mode 100644 index 92a395f74b1..00000000000 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.txt +++ /dev/null @@ -1,15 +0,0 @@ -package - -public final class A { - public constructor A() - 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.native() public final inner class B { - public constructor B() - 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 - } -} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index 7c50d0cc262..310cc30c33d 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -498,9 +498,9 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/native/nested"), Pattern.compile("^(.+)\\.kt$"), true); } - @TestMetadata("nativeNestedClassProhibited.kt") - public void testNativeNestedClassProhibited() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeNestedClassProhibited.kt"); + @TestMetadata("nativeInnerClassProhibited.kt") + public void testNativeInnerClassProhibited() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/native/nested/nativeInnerClassProhibited.kt"); doTest(fileName); } } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index a31cf534dc9..de1ec4e90a6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -4117,6 +4117,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("dataLocalVariable.kt") + public void testDataLocalVariable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/dataLocalVariable.kt"); + doTest(fileName); + } + @TestMetadata("defaultargs.kt") public void testDefaultargs() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/functions/defaultargs.kt"); @@ -4642,12 +4648,6 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } - @TestMetadata("dataLocalVariable.kt") - public void testDataLocalVariable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/innerNested/dataLocalVariable.kt"); - doTest(fileName); - } - @TestMetadata("extensionFun.kt") public void testExtensionFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/innerNested/extensionFun.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InnerNestedTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InnerNestedTestGenerated.java index b1f4fe3b21e..b394789f1e6 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InnerNestedTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/InnerNestedTestGenerated.java @@ -31,12 +31,6 @@ import java.util.regex.Pattern; @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public class InnerNestedTestGenerated extends AbstractInnerNestedTest { - @TestMetadata("dataLocalVariable.kt") - public void ignoredDataLocalVariable() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/innerNested/dataLocalVariable.kt"); - doTest(fileName); - } - public void testAllFilesPresentInInnerNested() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/innerNested"), Pattern.compile("^(.+)\\.kt$"), true); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index 652c40e2fc6..72eab5767b0 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -387,7 +387,7 @@ public class TranslationContext { } ClassDescriptor parentDescriptor = parent.classDescriptor; if (classDescriptor != parentDescriptor) { - return new JsNameRef("$outer", parent.getDispatchReceiverPath(cls)); + return new JsNameRef(Namer.OUTER_FIELD_NAME, parent.getDispatchReceiverPath(cls)); } else { return parent.getDispatchReceiverPath(cls); @@ -445,9 +445,4 @@ public class TranslationContext { assert descriptor != null : "Missing declaration descriptor: " + PsiUtilsKt.getTextWithLocation(expression); return descriptor; } - - public boolean isLocal() { - DeclarationDescriptor descriptor = declarationDescriptor; - return descriptor != null && DescriptorUtils.isLocal(descriptor); - } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index 2d03ace8ec2..10e9975bc15 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -166,8 +166,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { assert superDescriptor != null : "This class is expected to have super class: " + PsiUtilsKt.getTextWithLocation(classDeclaration); if (superDescriptor.isInner() && descriptor.isInner()) { - arguments = new ArrayList(arguments); - arguments.add(0, new JsNameRef("$outer", JsLiteral.THIS)); + arguments.add(0, new JsNameRef(Namer.OUTER_FIELD_NAME, JsLiteral.THIS)); } addCallToSuperMethod(arguments, initializer); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java index ec3fd614de6..eee2f4a7e60 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java @@ -56,7 +56,7 @@ public final class ReferenceTranslator { // Ignore qualifier if expression is EnumEntry or companion object reference and always use FQ name. DeclarationDescriptor descriptor = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression); //TODO: should go away when objects inside classes are supported - if (DescriptorUtils.isCompanionObject(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) { + if (descriptor != null && DescriptorUtils.isCompanionObject(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) { return simpleName; } if (descriptor instanceof ClassDescriptor) { @@ -67,7 +67,7 @@ public final class ReferenceTranslator { qualifier = Namer.getCompanionObjectAccessor(translateAsFQReference(enumClass, context)); } } - else if (entryClass.getKind() == ClassKind.CLASS || entryClass.getKind() == ClassKind.ENUM_CLASS) { + else if (DescriptorUtils.isClassOrEnumClass(entryClass)) { qualifier = null; } } diff --git a/js/js.translator/testData/kotlin_lib_ecma5.js b/js/js.translator/testData/kotlin_lib_ecma5.js index dd5bc306fe3..2b8ad3aad47 100644 --- a/js/js.translator/testData/kotlin_lib_ecma5.js +++ b/js/js.translator/testData/kotlin_lib_ecma5.js @@ -151,11 +151,20 @@ var Kotlin = {}; return object; } - Kotlin.doCreateClass = function (metadata, constructor) { + /** + * @param {(Array|Object|null)=} bases + * @param {(function(new: T, ?, ?, ?, ?, ?, ?, ?): T)|null=} constructor + * @param {Object=} properties + * @param {Object=} staticProperties + * @returns {function(new: T): T} + * @template T + */ + Kotlin.createClassNow = function (bases, constructor, properties, staticProperties) { if (constructor == null) { constructor = emptyFunction(); } + var metadata = computeMetadata(bases, properties, staticProperties); metadata.type = Kotlin.TYPE.CLASS; copyProperties(constructor, metadata.staticMembers); @@ -169,7 +178,7 @@ var Kotlin = {}; Object.defineProperties(prototypeObj, metadata.properties); copyProperties(prototypeObj, metadata.functions); prototypeObj.constructor = constructor; - Kotlin.defineInnerTypes(constructor, metadata.types); + defineNestedTypes(constructor, metadata.types); if (metadata.baseClass != null) { constructor.baseInitializer = metadata.baseClass; @@ -181,20 +190,7 @@ var Kotlin = {}; return constructor; }; - /** - * @param {(Array|Object|null)=} bases - * @param {(function(new: T, ?, ?, ?, ?, ?, ?, ?): T)|null=} constructor - * @param {Object=} properties - * @param {Object=} staticProperties - * @returns {function(new: T): T} - * @template T - */ - Kotlin.createClassNow = function (bases, constructor, properties, staticProperties) { - var metadata = computeMetadata(bases, properties, staticProperties); - return Kotlin.doCreateClass(metadata, constructor); - }; - - Kotlin.defineInnerTypes = function(constructor, types) { + function defineNestedTypes(constructor, types) { for (var innerTypeName in types) { // since types object does not inherit from anything, it's just a map //noinspection JSUnfilteredForInLoop @@ -206,21 +202,13 @@ var Kotlin = {}; configurable: true }); } - }; + } Kotlin.createObjectNow = function (bases, constructor, functions, staticProperties) { - var metadata = computeMetadata(bases, functions, staticProperties); - var noNameClass = Kotlin.doCreateClass(metadata, constructor); + var noNameClass = Kotlin.createClassNow(bases, constructor, functions, staticProperties); var obj = new noNameClass(); noNameClass.$metadata$.type = Kotlin.TYPE.OBJECT; - for (var innerTypeName in metadata.types) { - // since types object does not inherit from anything, it's just a map - //noinspection JSUnfilteredForInLoop - Object.defineProperty(obj, innerTypeName, { - get : metadata.types[innerTypeName], - configurable: true - }); - } + defineNestedTypes(obj, noNameClass.$metadata$.types); return obj; }; @@ -236,7 +224,7 @@ var Kotlin = {}; copyProperties(obj.prototype, obj.$metadata$.functions); Object.defineProperty(obj, "object", {get: class_object, configurable: true}); - Kotlin.defineInnerTypes(constructor, obj.$metadata$.types); + defineNestedTypes(constructor, obj.$metadata$.types); return obj; }; @@ -258,8 +246,7 @@ var Kotlin = {}; */ Kotlin.createClass = function (basesFun, constructor, properties, staticProperties) { function $o() { - var metadata = computeMetadata(getBases(basesFun), properties, staticProperties); - var klass = Kotlin.doCreateClass(metadata, constructor); + var klass = Kotlin.createClassNow(getBases(basesFun), constructor, properties, staticProperties); Object.defineProperty(this, $o.className, {value: klass}); return klass; }