JS backend: rewrite FileDeclarationVisitor use kotlin
This commit is contained in:
+8
-8
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
+2
-66
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user