Added files
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user