JS backend: minor refactoring in LiteralFunctionTranslator
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
+14
-13
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user