From 98c461a4351b800c6a7993ad708d95877195f039 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Wed, 2 Nov 2011 19:36:18 +0400 Subject: [PATCH] Added files --- .../k2js/translate/ClassBodyVisitor.java | 60 +++++++++++++++++ .../k2js/translate/ClassTranslator.java | 65 +++++++++++++++++++ src/org/jetbrains/k2js/translate/Namer.java | 43 ++++++++++++ 3 files changed, 168 insertions(+) create mode 100644 src/org/jetbrains/k2js/translate/ClassBodyVisitor.java create mode 100644 src/org/jetbrains/k2js/translate/ClassTranslator.java create mode 100644 src/org/jetbrains/k2js/translate/Namer.java diff --git a/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java b/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java new file mode 100644 index 00000000000..7747ffc620d --- /dev/null +++ b/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java @@ -0,0 +1,60 @@ +package org.jetbrains.k2js.translate; + +import com.google.dart.compiler.backend.js.ast.JsBlock; +import com.google.dart.compiler.backend.js.ast.JsFunction; +import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer; +import com.google.dart.compiler.util.AstUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Talanov Pavel + */ +public class ClassBodyVisitor extends K2JsVisitor> { + + @Override + @NotNull + public List visitClass(JetClass expression, TranslationContext context) { + List properties = new ArrayList(); + for (JetDeclaration declaration : expression.getDeclarations()) { + properties.addAll(declaration.accept(this, context)); + } + return properties; + } + + @Override + @NotNull + public List visitProperty(JetProperty expression, TranslationContext context) { + List methods = new ArrayList(); + if (expression.getSetter() != null) { + methods.addAll(expression.getSetter().accept(this, context)); + } + if (expression.getGetter() != null) { + methods.addAll(expression.getGetter().accept(this, context)); + } + return methods; + } + + @Override + @NotNull + public List visitPropertyAccessor + (JetPropertyAccessor expression, TranslationContext context) { + List methods = new ArrayList(); + JsPropertyInitializer namedMethod = new JsPropertyInitializer(); + // TODO + namedMethod.setLabelExpr(Namer.getNameForAccessor("nameForAccessor", expression).makeRef()); + JsFunction methodBody = new JsFunction(context.scope()); + ExpressionTranslator expressionTranslator = + new ExpressionTranslator(context.newScope(methodBody.getScope())); + JsBlock methodBlock = AstUtil.convertToBlock(expressionTranslator.translate(expression.getBodyExpression())); + methodBody.setBody(methodBlock); + namedMethod.setValueExpr(methodBody); + methods.add(namedMethod); + return methods; + } + + +} diff --git a/src/org/jetbrains/k2js/translate/ClassTranslator.java b/src/org/jetbrains/k2js/translate/ClassTranslator.java new file mode 100644 index 00000000000..5a22874cc20 --- /dev/null +++ b/src/org/jetbrains/k2js/translate/ClassTranslator.java @@ -0,0 +1,65 @@ +package org.jetbrains.k2js.translate; + +import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.util.AstUtil; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.psi.JetClass; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.types.JetType; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Talanov Pavel + */ +public class ClassTranslator extends AbstractTranslator { + + private final ClassBodyVisitor classBodyVisitor = new ClassBodyVisitor(); + + public ClassTranslator(TranslationContext context) { + super(context); + } + + public JsStatement translateClass(JetClass classDeclaration) { + JsInvocation jsClassDeclaration = new JsInvocation(); + jsClassDeclaration.setQualifier(translationContext().classCreationMethodReference()); + JsObjectLiteral jsClassDescription = translateClassDeclarations(classDeclaration); + jsClassDeclaration.getArguments().add(jsClassDescription); + //getSuperClassName(classDeclaration); + String className = classDeclaration.getName(); + JsStatement result = AstUtil.convertToStatement(AstUtil.newAssignment( + translationContext().getQualifiedReference(getJSName(className)), jsClassDeclaration)); + return result; + } + + private void getSuperClassName(JetClass classDeclaration) { + ClassDescriptor classDescriptor = bindingContext().get(BindingContext.CLASS, classDeclaration); + JetType superType = classDescriptor.getSuperclassType(); + DeclarationDescriptor descriptor = superType.getConstructor().getDeclarationDescriptor(); + JetClass superClass = (JetClass)bindingContext().get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor); + String superClassName = superClass.getName(); + } + + private JsObjectLiteral translateClassDeclarations(JetClass classDeclaration) { + List propertyList = new ArrayList(); + propertyList.add(generateInitializeMethod(classDeclaration)); + propertyList.addAll(classDeclaration.accept(classBodyVisitor, translationContext())); + return new JsObjectLiteral(propertyList); + } + + private JsPropertyInitializer generateInitializeMethod(JetClass classDeclaration) { + JsPropertyInitializer initializer = new JsPropertyInitializer(); + initializer.setLabelExpr(program().getStringLiteral(Namer.INITIALIZE_METHOD_NAME)); + initializer.setValueExpr(generateInitializeMethodBody(classDeclaration)); + return initializer; + } + + private JsFunction generateInitializeMethodBody(JetClass classDeclaration) { + return AstUtil.newFunction(scope(), null, null, new JsBlock()); + } + + + +} diff --git a/src/org/jetbrains/k2js/translate/Namer.java b/src/org/jetbrains/k2js/translate/Namer.java new file mode 100644 index 00000000000..a4760fbcd4d --- /dev/null +++ b/src/org/jetbrains/k2js/translate/Namer.java @@ -0,0 +1,43 @@ +package org.jetbrains.k2js.translate; + +import com.google.dart.compiler.backend.js.ast.JsName; +import org.jetbrains.jet.lang.psi.JetPropertyAccessor; + +import java.util.Set; + +/** + * @author Talanov Pavel + */ + +/* + * This class is a complete dummy and needs a lot of work + */ +public final class Namer { + + private Namer() { + + } + + public static final String INITIALIZE_METHOD_NAME = "initialize"; + private static final String CLASS_OBJECT_NAME = "Class"; + private static final String CLASS_CREATE_METHOD_NAME = "create"; + private static final String SETTER_PREFIX = "_set_"; + private static final String GETTER_PREFIX = "_get_"; + + public static JsName getClassObjectName() { + //TODO dummy representation + return new JsName(null, "Class", "Class", "Class"); + } + + public static JsName getNameForAccessor(String propertyName, JetPropertyAccessor accessor) { + String name = propertyName; + if (accessor.isGetter()) { + name += GETTER_PREFIX; + } + if (accessor.isSetter()) { + name += SETTER_PREFIX; + } + return new JsName(null, name, name, name); + } + +}