JS backend: minor refactoring in LiteralFunctionTranslator

This commit is contained in:
Zalim Bashorov
2013-12-10 15:47:41 +04:00
parent 24c9d802c2
commit 1c3c2b2f77
2 changed files with 16 additions and 16 deletions
@@ -403,15 +403,14 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
@Override @Override
@NotNull @NotNull
public JsNode visitFunctionLiteralExpression(@NotNull JetFunctionLiteralExpression expression, @NotNull TranslationContext context) { public JsNode visitFunctionLiteralExpression(@NotNull JetFunctionLiteralExpression expression, @NotNull TranslationContext context) {
FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression.getFunctionLiteral()); return context.literalFunctionTranslator().translate(expression.getFunctionLiteral(), context);
return context.literalFunctionTranslator().translate(expression.getFunctionLiteral(), descriptor, context);
} }
@Override @Override
@NotNull @NotNull
public JsNode visitNamedFunction(@NotNull JetNamedFunction expression, @NotNull TranslationContext context) { public JsNode visitNamedFunction(@NotNull JetNamedFunction expression, @NotNull TranslationContext context) {
JsExpression alias = context.literalFunctionTranslator().translate(expression, context);
FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression); FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression);
JsExpression alias = context.literalFunctionTranslator().translate(expression, descriptor, context);
JsName name = context.scope().declareFreshName(descriptor.getName().asString()); JsName name = context.scope().declareFreshName(descriptor.getName().asString());
context.aliasingContext().registerAlias(descriptor, name.makeRef()); context.aliasingContext().registerAlias(descriptor, name.makeRef());
return new JsVars(new JsVars.JsVar(name, alias)).source(expression); return new JsVars(new JsVars.JsVar(name, alias)).source(expression);
@@ -40,6 +40,7 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator;
import java.util.List; import java.util.List;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor;
import static org.jetbrains.k2js.translate.utils.FunctionBodyTranslator.translateFunctionBody; import static org.jetbrains.k2js.translate.utils.FunctionBodyTranslator.translateFunctionBody;
import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getExpectedReceiverDescriptor; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getExpectedReceiverDescriptor;
@@ -68,13 +69,14 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
} }
} }
public JsExpression translate(@NotNull JetDeclarationWithBody declaration, @NotNull FunctionDescriptor descriptor, @NotNull TranslationContext outerContext) { @NotNull
JsFunction fun = createFunction(); public JsExpression translate(@NotNull JetDeclarationWithBody declaration, @NotNull TranslationContext outerContext) {
TranslationContext funContext; FunctionDescriptor descriptor = getFunctionDescriptor(outerContext.bindingContext(), declaration);
boolean asInner;
ClassDescriptor outerClass;
AliasingContext aliasingContext;
DeclarationDescriptor receiverDescriptor = getExpectedReceiverDescriptor(descriptor); DeclarationDescriptor receiverDescriptor = getExpectedReceiverDescriptor(descriptor);
JsFunction fun = createFunction();
AliasingContext aliasingContext;
JsName receiverName; JsName receiverName;
if (receiverDescriptor == null) { if (receiverDescriptor == null) {
receiverName = null; receiverName = null;
@@ -85,6 +87,8 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
aliasingContext = outerContext.aliasingContext().inner(receiverDescriptor, receiverName.makeRef()); aliasingContext = outerContext.aliasingContext().inner(receiverDescriptor, receiverName.makeRef());
} }
boolean asInner;
ClassDescriptor outerClass;
if (descriptor.getContainingDeclaration() instanceof ConstructorDescriptor) { if (descriptor.getContainingDeclaration() instanceof ConstructorDescriptor) {
// KT-2388 // KT-2388
asInner = true; asInner = true;
@@ -101,16 +105,11 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
asInner = DescriptorUtils.isTopLevelDeclaration(descriptor); asInner = DescriptorUtils.isTopLevelDeclaration(descriptor);
} }
funContext = outerContext.newFunctionBody(fun, aliasingContext, UsageTracker funTracker = new UsageTracker(descriptor, outerContext.usageTracker(), outerClass);
new UsageTracker(descriptor, outerContext.usageTracker(), outerClass)); TranslationContext funContext = outerContext.newFunctionBody(fun, aliasingContext, funTracker);
fun.getBody().getStatements().addAll(translateFunctionBody(descriptor, declaration, funContext).getStatements()); fun.getBody().getStatements().addAll(translateFunctionBody(descriptor, declaration, funContext).getStatements());
InnerFunctionTranslator translator = null;
if (!asInner) {
translator = new InnerFunctionTranslator(descriptor, funContext, fun);
}
if (asInner) { if (asInner) {
addRegularParameters(descriptor, fun, funContext, receiverName); addRegularParameters(descriptor, fun, funContext, receiverName);
if (outerClass != null) { if (outerClass != null) {
@@ -127,6 +126,8 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
return fun; return fun;
} }
InnerFunctionTranslator translator = new InnerFunctionTranslator(descriptor, funContext, fun);
JsExpression result = translator.translate(createReference(fun), outerContext); JsExpression result = translator.translate(createReference(fun), outerContext);
addRegularParameters(descriptor, fun, funContext, receiverName); addRegularParameters(descriptor, fun, funContext, receiverName);
return result; return result;