diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/RegressionMergeEcmaTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/RegressionMergeEcmaTest.java index 7b8c8962067..92117428b32 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/RegressionMergeEcmaTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/RegressionMergeEcmaTest.java @@ -72,6 +72,10 @@ public class RegressionMergeEcmaTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } + public void testLiteralFun() throws Exception { + checkFooBoxIsOk(); + } + public void testOverloadExtension() throws Exception { checkFooBoxIsOk(); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java index 496a5efdb83..51de8164615 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java @@ -16,7 +16,9 @@ package org.jetbrains.k2js.translate.declaration; -import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsFunction; +import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; @@ -29,14 +31,14 @@ import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslatorVisitor; import org.jetbrains.k2js.translate.initializer.ClassInitializerTranslator; import org.jetbrains.k2js.translate.utils.BindingUtils; -import org.jetbrains.k2js.translate.utils.JsAstUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.Collection; import java.util.List; import static org.jetbrains.k2js.translate.initializer.InitializerUtils.createPropertyInitializer; -import static org.jetbrains.k2js.translate.utils.BindingUtils.*; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor; public class DeclarationBodyVisitor extends TranslatorVisitor { protected final List result; @@ -120,10 +122,6 @@ public class DeclarationBodyVisitor extends TranslatorVisitor { } JsPropertyInitializer methodAsPropertyInitializer = Translation.functionTranslator(expression, context).translateAsMethod(); - if (context.isEcma5()) { - JsExpression methodBodyExpression = methodAsPropertyInitializer.getValueExpr(); - methodAsPropertyInitializer.setValueExpr(JsAstUtils.createPropertyDataDescriptor(descriptor, methodBodyExpression)); - } result.add(methodAsPropertyInitializer); return null; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java index 6f482c74974..e9992377398 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java @@ -37,7 +37,6 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.context.UsageTracker; import org.jetbrains.k2js.translate.declaration.ClassTranslator; import org.jetbrains.k2js.translate.general.AbstractTranslator; -import org.jetbrains.k2js.translate.initializer.InitializerUtils; import java.util.List; @@ -136,7 +135,7 @@ public class LiteralFunctionTranslator extends AbstractTranslator { private JsNameRef createReference(JsFunction fun) { Trinity, LabelGenerator, JsExpression> place = definitionPlace.getValue(); JsNameRef nameRef = new JsNameRef(place.second.generate(), place.third); - place.first.add(new JsPropertyInitializer(nameRef, InitializerUtils.toDataDescriptor(fun, context()))); + place.first.add(new JsPropertyInitializer(nameRef, fun)); return nameRef; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java index 7e815d1640e..017da9bd05c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java @@ -65,26 +65,11 @@ public final class InitializerUtils { ) { ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration); JsExpression value = ClassTranslator.generateObjectLiteral(declaration, descriptor, context); - initializers.add(create(descriptor, !(descriptor.getContainingDeclaration() instanceof NamespaceDescriptor), value, context)); - } - - private static JsStatement create(DeclarationDescriptor descriptor, boolean enumerable, JsExpression value, TranslationContext context) { - JsExpression expression; - if (context.isEcma5()) { - expression = JsAstUtils.defineProperty(descriptor.getName().asString(), JsAstUtils.createDataDescriptor(value, false, enumerable), context); - } - else { - expression = assignment(new JsNameRef(descriptor.getName().asString(), JsLiteral.THIS), value); - } - return expression.makeStmt(); - } - - - public static JsExpression toDataDescriptor(JsExpression value, TranslationContext context) { - return context.isEcma5() ? JsAstUtils.createDataDescriptor(value) : value; + JsExpression expression = assignment(new JsNameRef(descriptor.getName().asString(), JsLiteral.THIS), value); + initializers.add(expression.makeStmt()); } public static JsPropertyInitializer createPropertyInitializer(Named named, JsExpression value, TranslationContext context) { - return new JsPropertyInitializer(context.nameToLiteral(named), toDataDescriptor(value, context)); + return new JsPropertyInitializer(context.nameToLiteral(named), value); } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index e1845cd2177..083da5edc3a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -20,8 +20,6 @@ import com.google.dart.compiler.backend.js.ast.*; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -238,12 +236,6 @@ public final class JsAstUtils { } } - @NotNull - public static JsObjectLiteral createPropertyDataDescriptor(@NotNull FunctionDescriptor descriptor, - @NotNull JsExpression value) { - return createPropertyDataDescriptor(descriptor, descriptor.getModality().isOverridable(), value); - } - @NotNull public static JsObjectLiteral createDataDescriptor(@NotNull JsExpression value) { return createDataDescriptor(value, false, false); @@ -262,15 +254,6 @@ public final class JsAstUtils { return dataDescriptor; } - @NotNull - private static JsObjectLiteral createPropertyDataDescriptor( - @NotNull DeclarationDescriptor descriptor, - boolean writable, - @NotNull JsExpression value - ) { - return createDataDescriptor(value, writable, AnnotationsUtils.isEnumerable(descriptor)); - } - @NotNull public static JsFunction createPackage(@NotNull List to, @NotNull JsScope scope) { JsFunction packageBlockFunction = createFunctionWithEmptyBody(scope); diff --git a/js/js.translator/testFiles/kotlin_lib_ecma5.js b/js/js.translator/testFiles/kotlin_lib_ecma5.js index f54c3ba39c3..b65670c93ea 100644 --- a/js/js.translator/testFiles/kotlin_lib_ecma5.js +++ b/js/js.translator/testFiles/kotlin_lib_ecma5.js @@ -289,7 +289,23 @@ var Kotlin = Object.create(null); return KotlinNew.isType(object, type); }; + function propertyToOldDescriptorConverter(propertyDescriptor) { + if (propertyDescriptor === null || propertyDescriptor === undefined) { + return propertyDescriptor; + } + for (var p in propertyDescriptor) { + if (propertyDescriptor.hasOwnProperty(p)) { + if ((typeof propertyDescriptor[p]) === "function") { + propertyDescriptor[p] = {value: propertyDescriptor[p]}; + } + propertyDescriptor[p].enumerable = true; + } + } + return propertyDescriptor; + } + function propertyDescriptorConverter(propertyDescriptor) { + propertyDescriptor = propertyToOldDescriptorConverter(propertyDescriptor); var obj = {}; if (propertyDescriptor === null || propertyDescriptor === undefined) { return obj; @@ -318,11 +334,11 @@ var Kotlin = Object.create(null); }; Kotlin.definePackage = function (initializer, members) { - return KotlinNew.definePackage(initializer, members); + return KotlinNew.definePackage(initializer, propertyToOldDescriptorConverter(members)); }; Kotlin.defineRootPackage = function (initializer, members) { - return KotlinNew.defineRootPackage(initializer, members); + return KotlinNew.defineRootPackage(initializer, propertyToOldDescriptorConverter(members)); }; Kotlin.defineModule = function (id, module) { diff --git a/js/js.translator/testFiles/mergeEcma/cases/literalFun.kt b/js/js.translator/testFiles/mergeEcma/cases/literalFun.kt new file mode 100644 index 00000000000..8bf4f16ee81 --- /dev/null +++ b/js/js.translator/testFiles/mergeEcma/cases/literalFun.kt @@ -0,0 +1,9 @@ +package foo + +fun ok(f: (s: String) -> String): String { + return f("O"); +} + +fun box(): String { + return ok { (s) -> s + "K" } +} \ No newline at end of file