From c1a2eaf47abf4e2ee1fbea6cedebf2f69e4dc9cf Mon Sep 17 00:00:00 2001 From: pTalanov Date: Fri, 15 Jun 2012 14:36:55 +0400 Subject: [PATCH] Support class objects for native classes --- .../test/semantics/NativeInteropTest.java | 4 ++++ .../translate/utils/JsDescriptorUtils.java | 3 ++- .../testFiles/native/cases/classObject.kt | 20 ++++++++++++++++++ .../testFiles/native/native/classObject.js | 21 +++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testFiles/native/cases/classObject.kt create mode 100644 js/js.translator/testFiles/native/native/classObject.js diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java index 2a118a0b8a5..f70249c7fa0 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java @@ -63,4 +63,8 @@ public final class NativeInteropTest extends SingleFileTranslationTest { public void testKt1519() throws Exception { fooBoxTest(); } + + public void testClassObject() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java index c910cec62b5..f47dfd15b85 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java @@ -32,6 +32,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject; import static org.jetbrains.k2js.translate.utils.BindingUtils.isNotAny; /** @@ -183,7 +184,7 @@ public final class JsDescriptorUtils { public static ClassDescriptor getContainingClass(@NotNull DeclarationDescriptor descriptor) { DeclarationDescriptor containing = descriptor.getContainingDeclaration(); while (containing != null) { - if (containing instanceof ClassDescriptor) { + if (containing instanceof ClassDescriptor && !isClassObject(containing)) { return (ClassDescriptor)containing; } containing = containing.getContainingDeclaration(); diff --git a/js/js.translator/testFiles/native/cases/classObject.kt b/js/js.translator/testFiles/native/cases/classObject.kt new file mode 100644 index 00000000000..d2f2566cfce --- /dev/null +++ b/js/js.translator/testFiles/native/cases/classObject.kt @@ -0,0 +1,20 @@ +package foo + +import js.* + +native +class A(val c: Int) { + native + class object { + val g: Int = js.noImpl + val c: String = js.noImpl + } +} + +fun box(): Boolean { + if (A.g != 3) return false + if (A.c != "hoooray") return false + if (A(2).c != 2) return false + + return true +} \ No newline at end of file diff --git a/js/js.translator/testFiles/native/native/classObject.js b/js/js.translator/testFiles/native/native/classObject.js new file mode 100644 index 00000000000..6ce8cacc91d --- /dev/null +++ b/js/js.translator/testFiles/native/native/classObject.js @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function A(c) { + this.c = c; +} + +A.g = 3; +A.c = "hoooray";