JS backend: rewrite FileDeclarationVisitor use kotlin

This commit is contained in:
Erokhin Stanislav
2013-10-18 21:09:14 +04:00
parent 4a55f5a65e
commit b958e453e8
3 changed files with 97 additions and 74 deletions
@@ -20,6 +20,7 @@ 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 jet.runtime.typeinfo.KotlinSignature;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
@@ -42,6 +43,7 @@ import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor
import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor;
public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
@KotlinSignature("val result: MutableList<JsPropertyInitializer>")
protected final List<JsPropertyInitializer> result;
protected final List<JsPropertyInitializer> staticResult;
protected final List<JsPropertyInitializer> enumEntryList = new SmartList<JsPropertyInitializer>();
@@ -65,7 +67,7 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
}
@Override
public Void visitClass(@NotNull JetClass expression, @NotNull TranslationContext context) {
public Void visitClass(@NotNull JetClass expression, TranslationContext context) {
return null;
}
@@ -85,9 +87,7 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
}
@Override
public Void visitClassObject(
@NotNull JetClassObject classObject, TranslationContext context
) {
public Void visitClassObject(@NotNull JetClassObject classObject, TranslationContext context) {
JetObjectDeclaration declaration = classObject.getObjectDeclaration();
assert declaration != null : "Declaration for class object must be not null";
ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration);
@@ -99,13 +99,13 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
}
@Override
public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, @NotNull TranslationContext context) {
public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, TranslationContext context) {
// parsed it in initializer visitor => no additional actions are needed
return null;
}
@Override
public Void visitNamedFunction(@NotNull JetNamedFunction expression, @NotNull TranslationContext context) {
public Void visitNamedFunction(@NotNull JetNamedFunction expression, TranslationContext context) {
FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression);
if (descriptor.getModality() == Modality.ABSTRACT) {
return null;
@@ -117,14 +117,14 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
}
@Override
public Void visitProperty(@NotNull JetProperty expression, @NotNull TranslationContext context) {
public Void visitProperty(@NotNull JetProperty expression, TranslationContext context) {
PropertyDescriptor propertyDescriptor = BindingUtils.getPropertyDescriptor(context.bindingContext(), expression);
PropertyTranslator.translateAccessors(propertyDescriptor, expression, result, context);
return null;
}
@Override
public Void visitAnonymousInitializer(@NotNull JetClassInitializer expression, @NotNull TranslationContext context) {
public Void visitAnonymousInitializer(@NotNull JetClassInitializer expression, TranslationContext context) {
// parsed it in initializer visitor => no additional actions are needed
return null;
}
@@ -0,0 +1,87 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.k2js.translate.declaration
import com.google.dart.compiler.backend.js.ast.JsExpression
import com.google.dart.compiler.backend.js.ast.JsNameRef
import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer
import org.jetbrains.k2js.translate.initializer.InitializerVisitor
import org.jetbrains.k2js.translate.utils.JsAstUtils
import org.jetbrains.k2js.translate.context.TranslationContext
import org.jetbrains.jet.lang.psi.JetClassInitializer
import com.google.dart.compiler.backend.js.ast.JsStatement
import org.jetbrains.k2js.translate.general.Translation
import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.k2js.translate.initializer.InitializerUtils
import org.jetbrains.jet.lang.psi.JetObjectDeclaration
import org.jetbrains.jet.lang.psi.JetClass
import com.google.dart.compiler.backend.js.ast.JsFunction
import org.jetbrains.k2js.translate.utils.BindingUtils.*
import org.jetbrains.k2js.translate.initializer.InitializerUtils.*
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
class FileDeclarationVisitor(val context: TranslationContext) : DeclarationBodyVisitor() {
private val initializer = JsAstUtils.createFunctionWithEmptyBody(context.scope())
private val initializerContext = context.contextWithScope(initializer)
private val initializerStatements = initializer.getBody()!!.getStatements()!!
private val initializerVisitor = InitializerVisitor(initializerStatements)
fun computeInitializer(): JsFunction? {
if (initializerStatements.isEmpty()) {
return null
} else {
return initializer
}
}
public override fun visitClass(expression: JetClass, context: TranslationContext?): Void? {
val entry = context!!.classDeclarationTranslator().translate(expression, context)
if (entry != null) {
result.add(entry)
}
return null
}
public override fun visitObjectDeclaration(declaration: JetObjectDeclaration, context: TranslationContext?): Void? {
InitializerUtils.generateObjectInitializer(declaration, initializerStatements, context!!)
return null
}
public override fun visitProperty(expression: JetProperty, context: TranslationContext?): Void? {
context!! // hack
super.visitProperty(expression, context)
val initializer = expression.getInitializer()
if (initializer != null) {
val value = Translation.translateAsExpression(initializer, initializerContext)
val propertyDescriptor: PropertyDescriptor = getPropertyDescriptor(context.bindingContext(), expression)
initializerStatements.add(generateInitializerForProperty(context, propertyDescriptor, value))
}
val delegate = generateInitializerForDelegate(context, expression)
if (delegate != null)
initializerStatements.add(delegate)
return null
}
public override fun visitAnonymousInitializer(expression: JetClassInitializer, context: TranslationContext?): Void? {
expression.accept(initializerVisitor, initializerContext)
return null
}
}
@@ -23,26 +23,18 @@ import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.k2js.translate.LabelGenerator;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.initializer.InitializerUtils;
import org.jetbrains.k2js.translate.initializer.InitializerVisitor;
import org.jetbrains.k2js.translate.utils.AnnotationsUtils;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.List;
import java.util.Map;
import static org.jetbrains.k2js.translate.declaration.DefineInvocation.createDefineInvocation;
import static org.jetbrains.k2js.translate.expression.LiteralFunctionTranslator.createPlace;
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForDelegate;
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor;
final class NamespaceTranslator extends AbstractTranslator {
@NotNull
@@ -61,7 +53,7 @@ final class NamespaceTranslator extends AbstractTranslator {
this.descriptor = descriptor;
visitor = new FileDeclarationVisitor();
visitor = new FileDeclarationVisitor(context());
definitionPlace = new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() {
@Override
@@ -98,13 +90,7 @@ final class NamespaceTranslator extends AbstractTranslator {
}
public void add(@NotNull Map<NamespaceDescriptor, DefineInvocation> descriptorToDefineInvocation) {
JsExpression initializer;
if (visitor.initializerStatements.isEmpty()) {
initializer = null;
}
else {
initializer = visitor.initializer;
}
JsExpression initializer = visitor.computeInitializer();
DefineInvocation defineInvocation = descriptorToDefineInvocation.get(descriptor);
if (defineInvocation == null) {
@@ -155,54 +141,4 @@ final class NamespaceTranslator extends AbstractTranslator {
}
}
private class FileDeclarationVisitor extends DeclarationBodyVisitor {
private final JsFunction initializer;
private final TranslationContext initializerContext;
private final List<JsStatement> initializerStatements;
private final InitializerVisitor initializerVisitor;
private FileDeclarationVisitor() {
initializer = JsAstUtils.createFunctionWithEmptyBody(context().scope());
initializerContext = context().contextWithScope(initializer);
initializerStatements = initializer.getBody().getStatements();
initializerVisitor = new InitializerVisitor(initializerStatements);
}
@Override
public Void visitClass(@NotNull JetClass declaration, @NotNull TranslationContext context) {
JsPropertyInitializer entry = context.classDeclarationTranslator().translate(declaration, context);
if (entry != null) {
result.add(entry);
}
return null;
}
@Override
public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, @NotNull TranslationContext context) {
InitializerUtils.generateObjectInitializer(declaration, initializerStatements, context);
return null;
}
@Override
public Void visitProperty(@NotNull JetProperty property, @NotNull TranslationContext context) {
super.visitProperty(property, context);
JetExpression initializer = property.getInitializer();
if (initializer != null) {
JsExpression value = Translation.translateAsExpression(initializer, initializerContext);
PropertyDescriptor propertyDescriptor = getPropertyDescriptor(context.bindingContext(), property);
initializerStatements.add(generateInitializerForProperty(context, propertyDescriptor, value));
}
JsStatement delegate = generateInitializerForDelegate(context, property);
if (delegate != null) initializerStatements.add(delegate);
return null;
}
@Override
public Void visitAnonymousInitializer(@NotNull JetClassInitializer expression, @NotNull TranslationContext context) {
expression.accept(initializerVisitor, initializerContext);
return null;
}
}
}