diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java index dd0c11aaa88..7c5f4a50ee1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java @@ -43,4 +43,8 @@ public final class ClassObjectTest extends SingleFileTranslationTest { public void testAccessing() throws Exception { checkFooBoxIsOk(); } + + public void testNamedClassObject() throws Exception { + checkFooBoxIsOk(); + } } 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 df5f3054f03..cce1f41ae5f 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 @@ -22,10 +22,12 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; +import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils; import org.jetbrains.kotlin.js.translate.utils.BindingUtils; import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetQualifiedExpression; import org.jetbrains.kotlin.psi.JetSimpleNameExpression; +import org.jetbrains.kotlin.resolve.DescriptorUtils; import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.setQualifier; @@ -51,8 +53,12 @@ public final class ReferenceTranslator { ) { JsExpression simpleName = translateSimpleName(expression, context); - // Ignore qualifier if expression is EnumEntry and use always use FQ name. + // Ignore qualifier if expression is EnumEntry or default object reference and use always use FQ name. DeclarationDescriptor descriptor = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression); + //TODO: should go away when objects inside classes are supported + if (DescriptorUtils.isClassObject(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) { + return simpleName; + } if (descriptor instanceof ClassDescriptor) { ClassDescriptor entryClass = (ClassDescriptor) descriptor; if (entryClass.getKind() == ClassKind.ENUM_ENTRY) { diff --git a/js/js.translator/testData/classObject/cases/namedClassObject.kt b/js/js.translator/testData/classObject/cases/namedClassObject.kt new file mode 100644 index 00000000000..e0d4f75bcdf --- /dev/null +++ b/js/js.translator/testData/classObject/cases/namedClassObject.kt @@ -0,0 +1,33 @@ +package foo + +trait Named { + class object Bar { + val g = "a"; + } +} + +class Foo { + class object { + val g = "b"; + } +} + +fun box(): String { + assertEquals("a", Named.Bar.g, "Named.Bar.g") + assertEquals("a", Named.g, "Named.g") + + assertEquals("b", Foo.Default.g, "Foo.Default.g") + assertEquals("b", Foo.g, "Foo.g") + + assertEquals("b", foo(Foo), "foo(Foo)") + assertEquals("b", foo(Foo.Default), "foo(Foo.Default)") + + assertEquals("c", Named.ext(), "Named.ext()") + assertEquals("c", Named.Bar.ext(), "Named.Bar.ext()") + + return "OK" +} + +fun foo(f: Foo.Default) = f.g + +fun Named.Bar.ext() = "c" \ No newline at end of file