Change the logic of how initializers are constructed.
Adapted from https://github.com/develar/kotlin/commit/a9e0a42fb1347fa8e21c86b5a073ef8a7c873da0.
This commit is contained in:
+1
-1
@@ -64,7 +64,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator {
|
||||
// for properties declared as constructor parameters
|
||||
setParameters(result, translatePrimaryConstructorParameters());
|
||||
mayBeAddCallToSuperMethod(result);
|
||||
initializerStatements.addAll(new InitializerVisitor().traverseClass(classDeclaration, context()));
|
||||
(new InitializerVisitor(initializerStatements)).traverseClass(classDeclaration, context());
|
||||
result.getBody().getStatements().addAll(initializerStatements);
|
||||
return result;
|
||||
}
|
||||
|
||||
+45
-14
@@ -16,33 +16,30 @@
|
||||
|
||||
package org.jetbrains.k2js.translate.initializer;
|
||||
|
||||
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.google.dart.compiler.backend.js.ast.JsStatement;
|
||||
import com.google.dart.compiler.backend.js.ast.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.Named;
|
||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||
import org.jetbrains.k2js.translate.context.Namer;
|
||||
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||
import org.jetbrains.k2js.translate.declaration.ClassTranslator;
|
||||
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor;
|
||||
import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment;
|
||||
import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField;
|
||||
|
||||
/**
|
||||
* @author Pavel Talanov
|
||||
*/
|
||||
public final class InitializerUtils {
|
||||
|
||||
private InitializerUtils() {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static JsPropertyInitializer generateInitializeMethod(@NotNull JsFunction initializerFunction) {
|
||||
JsPropertyInitializer initializer = new JsPropertyInitializer(Namer.initializeMethodReference());
|
||||
initializer.setValueExpr(initializerFunction);
|
||||
return initializer;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static JsStatement generateInitializerForProperty(@NotNull TranslationContext context,
|
||||
@NotNull PropertyDescriptor descriptor,
|
||||
@@ -54,4 +51,38 @@ public final class InitializerUtils {
|
||||
return assignmentToBackingField(context, descriptor, value).makeStmt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void generate(@NotNull JetObjectDeclaration declaration,
|
||||
@NotNull List<JsStatement> initializers,
|
||||
@Nullable List<JsPropertyInitializer> definitions,
|
||||
@NotNull TranslationContext context) {
|
||||
ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration);
|
||||
JsExpression value = ClassTranslator.generateClassCreation(declaration, descriptor, context);
|
||||
if (definitions != null && value instanceof JsLiteral) {
|
||||
definitions.add(createPropertyInitializer(descriptor, value, context));
|
||||
}
|
||||
else {
|
||||
initializers.add(create(descriptor, value, context));
|
||||
}
|
||||
}
|
||||
|
||||
public static JsStatement create(Named named, JsExpression value, TranslationContext context) {
|
||||
JsExpression expression;
|
||||
if (context.isEcma5()) {
|
||||
expression = JsAstUtils.defineProperty(named.getName().getName(), JsAstUtils.createDataDescriptor(value), context);
|
||||
}
|
||||
else {
|
||||
expression = assignment(new JsNameRef(named.getName().getName(), JsLiteral.THIS), value);
|
||||
}
|
||||
return expression.makeStmt();
|
||||
}
|
||||
|
||||
|
||||
public static JsExpression toDataDescriptor(JsExpression value, TranslationContext context) {
|
||||
return context.isEcma5() ? JsAstUtils.createDataDescriptor(value) : value;
|
||||
}
|
||||
|
||||
public static JsPropertyInitializer createPropertyInitializer(Named named, JsExpression value, TranslationContext context) {
|
||||
return new JsPropertyInitializer(context.nameToLiteral(named), toDataDescriptor(value, context));
|
||||
}
|
||||
}
|
||||
+24
-45
@@ -16,90 +16,69 @@
|
||||
|
||||
package org.jetbrains.k2js.translate.initializer;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.dart.compiler.backend.js.ast.JsExpression;
|
||||
import com.google.dart.compiler.backend.js.ast.JsInvocation;
|
||||
import com.google.dart.compiler.backend.js.ast.JsStatement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
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.context.TranslationContext;
|
||||
import org.jetbrains.k2js.translate.declaration.ClassTranslator;
|
||||
import org.jetbrains.k2js.translate.general.Translation;
|
||||
import org.jetbrains.k2js.translate.general.TranslatorVisitor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.k2js.translate.general.Translation.translateAsStatement;
|
||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
|
||||
import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationForName;
|
||||
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty;
|
||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor;
|
||||
|
||||
/**
|
||||
* @author Pavel Talanov
|
||||
*/
|
||||
public final class InitializerVisitor extends TranslatorVisitor<List<JsStatement>> {
|
||||
public final class InitializerVisitor extends TranslatorVisitor<Void> {
|
||||
private final List<JsStatement> result;
|
||||
|
||||
public InitializerVisitor(List<JsStatement> result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public final List<JsStatement> visitProperty(@NotNull JetProperty property, @NotNull TranslationContext context) {
|
||||
public final Void visitProperty(@NotNull JetProperty property, @NotNull TranslationContext context) {
|
||||
JetExpression initializer = property.getInitializer();
|
||||
if (initializer == null) {
|
||||
return Collections.emptyList();
|
||||
if (initializer != null) {
|
||||
result.add(generateInitializerForProperty(context, getPropertyDescriptor(context.bindingContext(), property),
|
||||
Translation.translateAsExpression(initializer, context)));
|
||||
}
|
||||
|
||||
return generateInitializerForProperty(getPropertyDescriptor(context.bindingContext(), property),
|
||||
Translation.translateAsExpression(initializer, context), context);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static List<JsStatement> generateInitializerForProperty(@NotNull PropertyDescriptor descriptor,
|
||||
@NotNull JsExpression value, @NotNull TranslationContext context) {
|
||||
return Collections.singletonList(InitializerUtils.generateInitializerForProperty(context, descriptor, value));
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public List<JsStatement> visitAnonymousInitializer(@NotNull JetClassInitializer initializer,
|
||||
@NotNull TranslationContext context) {
|
||||
return Arrays.asList(translateAsStatement(initializer.getBody(), context));
|
||||
public Void visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) {
|
||||
result.add(translateAsStatement(initializer.getBody(), context));
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
// Not interested in other types of declarations, they do not contain initializers.
|
||||
public List<JsStatement> visitDeclaration(@NotNull JetDeclaration expression, @NotNull TranslationContext context) {
|
||||
return Collections.emptyList();
|
||||
public Void visitDeclaration(@NotNull JetDeclaration expression, @NotNull TranslationContext context) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public final List<JsStatement> visitObjectDeclarationName(@NotNull JetObjectDeclarationName objectName,
|
||||
@NotNull TranslationContext context) {
|
||||
PropertyDescriptor propertyDescriptor = getPropertyDescriptorForObjectDeclaration(context.bindingContext(), objectName);
|
||||
JetObjectDeclaration objectDeclaration = getObjectDeclarationForName(objectName);
|
||||
JsExpression objectValue = ClassTranslator.generateClassCreationExpression(objectDeclaration, context);
|
||||
return generateInitializerForProperty(propertyDescriptor, objectValue, context);
|
||||
public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, @NotNull TranslationContext context) {
|
||||
InitializerUtils.generate(declaration, result, null, context);
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private List<JsStatement> generateInitializerStatements(@NotNull List<JetDeclaration> declarations,
|
||||
@NotNull TranslationContext context) {
|
||||
List<JsStatement> statements = Lists.newArrayList();
|
||||
for (JetDeclaration declaration : declarations) {
|
||||
statements.addAll(declaration.accept(this, context));
|
||||
declaration.accept(this, context);
|
||||
}
|
||||
return statements;
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public final List<JsStatement> traverseClass(@NotNull JetClassOrObject expression, @NotNull TranslationContext context) {
|
||||
return generateInitializerStatements(expression.getDeclarations(), context);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public final List<JsStatement> traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) {
|
||||
return generateInitializerStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context);
|
||||
}
|
||||
}
|
||||
|
||||
-53
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2012 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.initializer;
|
||||
|
||||
import com.google.dart.compiler.backend.js.ast.JsFunction;
|
||||
import com.google.dart.compiler.backend.js.ast.JsStatement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Pavel Talanov
|
||||
*/
|
||||
public final class NamespaceInitializerTranslator {
|
||||
|
||||
@NotNull
|
||||
private final NamespaceDescriptor namespace;
|
||||
@NotNull
|
||||
private final TranslationContext namespaceContext;
|
||||
|
||||
public NamespaceInitializerTranslator(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) {
|
||||
this.namespace = namespace;
|
||||
this.namespaceContext = context;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public JsFunction generateInitializeMethod() {
|
||||
JsFunction result = JsAstUtils.createFunctionWithEmptyBody(namespaceContext.scope());
|
||||
TranslationContext namespaceInitializerContext
|
||||
= namespaceContext.innerContextWithGivenScopeAndBlock(result.getScope(), result.getBody());
|
||||
|
||||
List<JsStatement> initializerStatements = new InitializerVisitor().traverseNamespace(namespace, namespaceInitializerContext);
|
||||
result.getBody().getStatements().addAll(initializerStatements);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user