Added files

This commit is contained in:
Pavel Talanov
2011-11-02 19:36:18 +04:00
parent 26b8424d37
commit 98c461a435
3 changed files with 168 additions and 0 deletions
@@ -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<List<JsPropertyInitializer>> {
@Override
@NotNull
public List<JsPropertyInitializer> visitClass(JetClass expression, TranslationContext context) {
List<JsPropertyInitializer> properties = new ArrayList<JsPropertyInitializer>();
for (JetDeclaration declaration : expression.getDeclarations()) {
properties.addAll(declaration.accept(this, context));
}
return properties;
}
@Override
@NotNull
public List<JsPropertyInitializer> visitProperty(JetProperty expression, TranslationContext context) {
List<JsPropertyInitializer> methods = new ArrayList<JsPropertyInitializer>();
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<JsPropertyInitializer> visitPropertyAccessor
(JetPropertyAccessor expression, TranslationContext context) {
List<JsPropertyInitializer> methods = new ArrayList<JsPropertyInitializer>();
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;
}
}
@@ -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<JsPropertyInitializer> propertyList = new ArrayList<JsPropertyInitializer>();
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());
}
}
@@ -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);
}
}