From fe4a4e712aa65105a932784c27ba52c3a2f73644 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 8 Aug 2014 18:12:09 +0400 Subject: [PATCH] JS backend: native trait exists only at compile time. --- .../test/semantics/NativeInteropTest.java | 14 ++++++- .../translate/utils/JsDescriptorUtils.java | 5 ++- .../cases/inheritanceFromNativeTrait.kt | 42 +++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 js/js.translator/testData/native/cases/inheritanceFromNativeTrait.kt 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 17593eb3b82..e6a5f93c0d7 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 @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.test.SingleFileTranslationTest; +import java.io.File; import java.util.List; public final class NativeInteropTest extends SingleFileTranslationTest { @@ -36,8 +37,13 @@ public final class NativeInteropTest extends SingleFileTranslationTest { @Override protected List additionalJSFiles(@NotNull EcmaVersion ecmaVersion) { List result = Lists.newArrayList(super.additionalJSFiles(ecmaVersion)); - result.add(pathToTestFiles() + NATIVE + "/" + getTestName(true) + ".js"); - //result.addAll(JsTestUtils.getAllFilesInDir(pathToTestFiles() + NATIVE)); + + String jsFilePath = pathToTestFiles() + NATIVE + "/" + getTestName(true) + ".js"; + File jsFile = new File(jsFilePath); + if (jsFile.exists() && jsFile.isFile()) { + result.add(jsFilePath); + } + return result; } @@ -49,6 +55,10 @@ public final class NativeInteropTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } + public void testInheritanceFromNativeTrait() throws Exception { + checkFooBoxIsOk(); + } + public void testClass() 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 8d953205f2b..6f76cdd06a6 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 @@ -37,6 +37,7 @@ import java.util.List; import java.util.Set; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; +import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.isNativeObject; public final class JsDescriptorUtils { // TODO: maybe we should use external annotations or something else. @@ -82,7 +83,9 @@ public final class JsDescriptorUtils { @Override public boolean value(JetType type) { ClassDescriptor classDescriptor = getClassDescriptorForType(type); - return !FAKE_CLASSES.contains(getFqNameSafe(classDescriptor).asString()); + + return !FAKE_CLASSES.contains(getFqNameSafe(classDescriptor).asString()) && + !(classDescriptor.getKind() == ClassKind.TRAIT && isNativeObject(classDescriptor)); } }); } diff --git a/js/js.translator/testData/native/cases/inheritanceFromNativeTrait.kt b/js/js.translator/testData/native/cases/inheritanceFromNativeTrait.kt new file mode 100644 index 00000000000..df4a5e66e0a --- /dev/null +++ b/js/js.translator/testData/native/cases/inheritanceFromNativeTrait.kt @@ -0,0 +1,42 @@ +package foo + +native +trait NativeTrait { + val foo: String + fun bar(a: Int): Any + + native("boo") + fun baz(): String +} + +trait Trait : NativeTrait + +class Class : NativeTrait { + override val foo: String = "Class().foo" + override fun bar(a: Int): Any = "Class().bar($a)" + override fun baz(): String = "Class().boo()" +} + +class AnotherClass : Trait { + override val foo: String = "AnotherClass().foo" + override fun bar(a: Int): Any = "AnotherClass().bar($a)" + override fun baz(): String = "AnotherClass().boo()" +} + +fun test(c: T, className: String) { + assertEquals("$className().foo", c.foo) + assertEquals("$className().bar(3)", c.bar(3)) + assertEquals("$className().boo()", c.baz()) + + val t: NativeTrait = c + assertEquals("$className().foo", t.foo) + assertEquals("$className().bar(3)", t.bar(3)) + assertEquals("$className().boo()", t.baz()) +} + +fun box(): String { + test(Class(), "Class") + test(AnotherClass(), "AnotherClass") + + return "OK" +}