JS backend: Remove {value: function...} and {value: Kotlin.createClass() } structures.

This commit is contained in:
Erokhin Stanislav
2013-09-05 18:32:00 +04:00
parent a79b67eb48
commit 638beff551
7 changed files with 40 additions and 46 deletions
@@ -72,6 +72,10 @@ public class RegressionMergeEcmaTest extends SingleFileTranslationTest {
checkFooBoxIsOk();
}
public void testLiteralFun() throws Exception {
checkFooBoxIsOk();
}
public void testOverloadExtension() throws Exception {
checkFooBoxIsOk();
}
@@ -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<Void> {
protected final List<JsPropertyInitializer> result;
@@ -120,10 +122,6 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
}
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;
}
@@ -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<List<JsPropertyInitializer>, 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;
}
@@ -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);
}
}
@@ -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<JsStatement> to, @NotNull JsScope scope) {
JsFunction packageBlockFunction = createFunctionWithEmptyBody(scope);
+18 -2
View File
@@ -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) {
@@ -0,0 +1,9 @@
package foo
fun ok(f: (s: String) -> String): String {
return f("O");
}
fun box(): String {
return ok { (s) -> s + "K" }
}