From b958e453e8e850f4502f969de276472476c18487 Mon Sep 17 00:00:00 2001 From: Erokhin Stanislav Date: Fri, 18 Oct 2013 21:09:14 +0400 Subject: [PATCH] JS backend: rewrite FileDeclarationVisitor use kotlin --- .../declaration/DeclarationBodyVisitor.java | 16 ++-- .../translate/declaration/FileDeclaration.kt | 87 +++++++++++++++++++ .../declaration/NamespaceTranslator.java | 68 +-------------- 3 files changed, 97 insertions(+), 74 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/declaration/FileDeclaration.kt diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java index 21a9064eec6..96f261794b4 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java @@ -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 { + @KotlinSignature("val result: MutableList") protected final List result; protected final List staticResult; protected final List enumEntryList = new SmartList(); @@ -65,7 +67,7 @@ public class DeclarationBodyVisitor extends TranslatorVisitor { } @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 { } @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 { } @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 { } @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; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/FileDeclaration.kt b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/FileDeclaration.kt new file mode 100644 index 00000000000..2112417b159 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/FileDeclaration.kt @@ -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 + } + +} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java index 07a48d6a59f..29010665758 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java @@ -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, LabelGenerator, JsExpression>>() { @Override @@ -98,13 +90,7 @@ final class NamespaceTranslator extends AbstractTranslator { } public void add(@NotNull Map 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 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; - } - } }