JS backend: extract inline calls during translation
This commit is contained in:
@@ -170,7 +170,15 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public JsNode visitCallExpression(@NotNull JetCallExpression expression,
|
public JsNode visitCallExpression(@NotNull JetCallExpression expression,
|
||||||
@NotNull TranslationContext context) {
|
@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
|
@Override
|
||||||
|
|||||||
+10
-1
@@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
|
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
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.TemporaryVariable;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.utils.ErrorReportingUtils;
|
import org.jetbrains.k2js.translate.utils.ErrorReportingUtils;
|
||||||
@@ -68,7 +69,15 @@ public final class QualifiedExpressionTranslator {
|
|||||||
return VariableAccessTranslator.newInstance(context, (JetSimpleNameExpression)selector, receiver).translateAsGet();
|
return VariableAccessTranslator.newInstance(context, (JetSimpleNameExpression)selector, receiver).translateAsGet();
|
||||||
}
|
}
|
||||||
if (selector instanceof JetCallExpression) {
|
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
|
//TODO: never get there
|
||||||
if (selector instanceof JetSimpleNameExpression) {
|
if (selector instanceof JetSimpleNameExpression) {
|
||||||
|
|||||||
Reference in New Issue
Block a user