JS backend: extract inline calls during translation

This commit is contained in:
Michael Nedzelsky
2014-08-08 01:23:56 +04:00
parent 76757b14e2
commit d3bf58d761
2 changed files with 19 additions and 2 deletions
@@ -170,7 +170,15 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
@NotNull
public JsNode visitCallExpression(@NotNull JetCallExpression expression,
@NotNull TranslationContext context) {
return CallExpressionTranslator.translate(expression, null, context).source(expression);
if (InlinedCallExpressionTranslator.shouldBeInlined(expression, context) &&
BindingContextUtilPackage.isUsedAsExpression(expression, context.bindingContext())) {
TemporaryVariable temporaryVariable = context.declareTemporary(null);
JsExpression callResult = CallExpressionTranslator.translate(expression, null, context).source(expression);
context.addStatementToCurrentBlock(JsAstUtils.assignment(temporaryVariable.reference(), callResult).makeStmt());
return temporaryVariable.reference();
} else {
return CallExpressionTranslator.translate(expression, null, context).source(expression);
}
}
@Override
@@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage;
import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.utils.ErrorReportingUtils;
@@ -68,7 +69,15 @@ public final class QualifiedExpressionTranslator {
return VariableAccessTranslator.newInstance(context, (JetSimpleNameExpression)selector, receiver).translateAsGet();
}
if (selector instanceof JetCallExpression) {
return invokeCallExpressionTranslator(receiver, selector, context);
if (InlinedCallExpressionTranslator.shouldBeInlined((JetCallExpression) selector, context) &&
BindingContextUtilPackage.isUsedAsExpression(selector, context.bindingContext())) {
TemporaryVariable temporaryVariable = context.declareTemporary(null);
JsExpression result = invokeCallExpressionTranslator(receiver, selector, context);
context.addStatementToCurrentBlock(JsAstUtils.assignment(temporaryVariable.reference(), result).makeStmt());
return temporaryVariable.reference();
} else {
return invokeCallExpressionTranslator(receiver, selector, context);
}
}
//TODO: never get there
if (selector instanceof JetSimpleNameExpression) {