diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index b67baf9eed5..10783856747 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -403,15 +403,14 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Override @NotNull public JsNode visitFunctionLiteralExpression(@NotNull JetFunctionLiteralExpression expression, @NotNull TranslationContext context) { - FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression.getFunctionLiteral()); - return context.literalFunctionTranslator().translate(expression.getFunctionLiteral(), descriptor, context); + return context.literalFunctionTranslator().translate(expression.getFunctionLiteral(), context); } @Override @NotNull public JsNode visitNamedFunction(@NotNull JetNamedFunction expression, @NotNull TranslationContext context) { + JsExpression alias = context.literalFunctionTranslator().translate(expression, context); FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression); - JsExpression alias = context.literalFunctionTranslator().translate(expression, descriptor, context); JsName name = context.scope().declareFreshName(descriptor.getName().asString()); context.aliasingContext().registerAlias(descriptor, name.makeRef()); return new JsVars(new JsVars.JsVar(name, alias)).source(expression); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java index e9992377398..58661a9ff72 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LiteralFunctionTranslator.java @@ -40,6 +40,7 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator; 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.JsDescriptorUtils.getExpectedReceiverDescriptor; @@ -68,13 +69,14 @@ public class LiteralFunctionTranslator extends AbstractTranslator { } } - public JsExpression translate(@NotNull JetDeclarationWithBody declaration, @NotNull FunctionDescriptor descriptor, @NotNull TranslationContext outerContext) { - JsFunction fun = createFunction(); - TranslationContext funContext; - boolean asInner; - ClassDescriptor outerClass; - AliasingContext aliasingContext; + @NotNull + public JsExpression translate(@NotNull JetDeclarationWithBody declaration, @NotNull TranslationContext outerContext) { + FunctionDescriptor descriptor = getFunctionDescriptor(outerContext.bindingContext(), declaration); + DeclarationDescriptor receiverDescriptor = getExpectedReceiverDescriptor(descriptor); + JsFunction fun = createFunction(); + + AliasingContext aliasingContext; JsName receiverName; if (receiverDescriptor == null) { receiverName = null; @@ -85,6 +87,8 @@ public class LiteralFunctionTranslator extends AbstractTranslator { aliasingContext = outerContext.aliasingContext().inner(receiverDescriptor, receiverName.makeRef()); } + boolean asInner; + ClassDescriptor outerClass; if (descriptor.getContainingDeclaration() instanceof ConstructorDescriptor) { // KT-2388 asInner = true; @@ -101,16 +105,11 @@ public class LiteralFunctionTranslator extends AbstractTranslator { asInner = DescriptorUtils.isTopLevelDeclaration(descriptor); } - funContext = outerContext.newFunctionBody(fun, aliasingContext, - new UsageTracker(descriptor, outerContext.usageTracker(), outerClass)); + UsageTracker funTracker = new UsageTracker(descriptor, outerContext.usageTracker(), outerClass); + TranslationContext funContext = outerContext.newFunctionBody(fun, aliasingContext, funTracker); fun.getBody().getStatements().addAll(translateFunctionBody(descriptor, declaration, funContext).getStatements()); - InnerFunctionTranslator translator = null; - if (!asInner) { - translator = new InnerFunctionTranslator(descriptor, funContext, fun); - } - if (asInner) { addRegularParameters(descriptor, fun, funContext, receiverName); if (outerClass != null) { @@ -127,6 +126,8 @@ public class LiteralFunctionTranslator extends AbstractTranslator { return fun; } + InnerFunctionTranslator translator = new InnerFunctionTranslator(descriptor, funContext, fun); + JsExpression result = translator.translate(createReference(fun), outerContext); addRegularParameters(descriptor, fun, funContext, receiverName); return result;