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 dd4bb9cc9c6..9b1cb61768b 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 @@ -48,6 +48,7 @@ import java.util.List; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.isVarCapturedInClosure; import static org.jetbrains.k2js.translate.context.Namer.getCapturedVarAccessor; import static org.jetbrains.k2js.translate.general.Translation.translateAsExpression; +import static org.jetbrains.k2js.translate.reference.CallExpressionTranslator.shouldBeInlined; import static org.jetbrains.k2js.translate.reference.ReferenceTranslator.translateAsFQReference; import static org.jetbrains.k2js.translate.utils.BindingUtils.*; import static org.jetbrains.k2js.translate.utils.ErrorReportingUtils.message; @@ -185,7 +186,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitCallExpression(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { - if (InlinedCallExpressionTranslator.shouldBeInlined(expression, context) && + if (shouldBeInlined(expression, context) && BindingContextUtilPackage.isUsedAsExpression(expression, context.bindingContext())) { TemporaryVariable temporaryVariable = context.declareTemporary(null); JsExpression callResult = CallExpressionTranslator.translate(expression, null, context).source(expression); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java index a42e19dbeca..082bf8f6838 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallExpressionTranslator.java @@ -31,12 +31,13 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl @Nullable JsExpression receiver, @NotNull TranslationContext context ) { - if (InlinedCallExpressionTranslator.shouldBeInlined(expression, context)) { - return InlinedCallExpressionTranslator.translate(expression, receiver, context); - } return (new CallExpressionTranslator(expression, receiver, context)).translate(); } + public static boolean shouldBeInlined(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { + return false; + } + private CallExpressionTranslator( @NotNull JetCallExpression expression, @Nullable JsExpression receiver, diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java deleted file mode 100644 index a63126daea5..00000000000 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.k2js.translate.reference; - -import com.google.common.collect.Maps; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsLiteral; -import com.google.dart.compiler.backend.js.ast.JsNode; -import com.google.dart.compiler.backend.js.ast.JsReturn; -import com.intellij.util.SmartList; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; -import org.jetbrains.jet.lang.psi.JetCallExpression; -import org.jetbrains.jet.lang.psi.JetFunction; -import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument; -import org.jetbrains.k2js.translate.callTranslator.CallInfo; -import org.jetbrains.k2js.translate.callTranslator.CallTranslatorPackage; -import org.jetbrains.k2js.translate.context.TemporaryVariable; -import org.jetbrains.k2js.translate.context.TranslationContext; -import org.jetbrains.k2js.translate.utils.JsAstUtils; -import org.jetbrains.k2js.translate.utils.mutator.LastExpressionMutator; -import org.jetbrains.k2js.translate.utils.mutator.Mutator; - -import java.util.List; -import java.util.Map; - -import static org.jetbrains.k2js.translate.reference.CallArgumentTranslator.translateSingleArgument; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionForDescriptor; -import static org.jetbrains.k2js.translate.utils.FunctionBodyTranslator.translateFunctionBody; - -public final class InlinedCallExpressionTranslator extends AbstractCallExpressionTranslator { - - @SuppressWarnings("UnusedParameters") - public static boolean shouldBeInlined(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { - //TODO: inlining turned off - //ResolvedCall resolvedCall = CallUtilPackage.getFunctionResolvedCall(expression, bindingContext()); - //CallableDescriptor descriptor = resolvedCall.getCandidateDescriptor(); - //if (descriptor instanceof SimpleFunctionDescriptor) { - // return ((SimpleFunctionDescriptor)descriptor).isInline(); - //} - return false; - } - - @NotNull - public static JsExpression translate( - @NotNull JetCallExpression expression, - @Nullable JsExpression receiver, - @NotNull TranslationContext context - ) { - return (new InlinedCallExpressionTranslator(expression, receiver, context)).translate(); - } - - private InlinedCallExpressionTranslator( - @NotNull JetCallExpression expression, @Nullable JsExpression receiver, - @NotNull TranslationContext context - ) { - super(expression, receiver, context); - } - - @NotNull - private JsExpression translate() { - TranslationContext contextWithAllParametersAliased = createContextForInlining(); - JsNode translatedBody = translateFunctionBody(getFunctionDescriptor(), getFunctionBody(), contextWithAllParametersAliased); - //TODO: declare uninitialized temporary - TemporaryVariable temporaryVariable = contextWithAllParametersAliased.declareTemporary(JsLiteral.NULL); - JsNode mutatedBody = LastExpressionMutator.mutateLastExpression(translatedBody, new InlineFunctionMutator(temporaryVariable)); - context().addStatementToCurrentBlock(JsAstUtils.convertToBlock(mutatedBody)); - return temporaryVariable.reference(); - } - - @NotNull - private JetFunction getFunctionBody() { - return getFunctionForDescriptor(getFunctionDescriptor()); - } - - @NotNull - private SimpleFunctionDescriptor getFunctionDescriptor() { - CallableDescriptor descriptor = resolvedCall.getCandidateDescriptor().getOriginal(); - assert descriptor instanceof SimpleFunctionDescriptor : "Inlined functions should have descriptor of type SimpleFunctionDescriptor"; - return (SimpleFunctionDescriptor)descriptor; - } - - @NotNull - private TranslationContext createContextForInlining() { - TranslationContext contextForInlining = context(); - contextForInlining = createContextWithAliasForThisExpression(contextForInlining); - return createContextWithAliasesForParameters(contextForInlining); - } - - @NotNull - private TranslationContext createContextWithAliasesForParameters(@NotNull TranslationContext contextForInlining) { - Map aliases = Maps.newHashMap(); - for (ValueParameterDescriptor parameterDescriptor : resolvedCall.getResultingDescriptor().getValueParameters()) { - TemporaryVariable aliasForArgument = createAliasForArgument(parameterDescriptor); - aliases.put(parameterDescriptor, aliasForArgument.name().makeRef()); - } - return contextForInlining.innerContextWithDescriptorsAliased(aliases); - } - - @NotNull - private TranslationContext createContextWithAliasForThisExpression(@NotNull TranslationContext contextForInlining) { - TranslationContext contextWithAliasForThisExpression = contextForInlining; - SimpleFunctionDescriptor functionDescriptor = getFunctionDescriptor(); - CallInfo callInfo = CallTranslatorPackage.getCallInfo(contextForInlining, resolvedCall, receiver); - JsExpression receiver = callInfo.getExtensionReceiver(); - if (receiver != null) { - contextWithAliasForThisExpression = - contextWithAlias(contextWithAliasForThisExpression, receiver, functionDescriptor.getExtensionReceiverParameter()); - } - JsExpression dispatchReceiver = callInfo.getDispatchReceiver(); - if (dispatchReceiver != null) { - contextWithAliasForThisExpression = - contextWithAlias(contextWithAliasForThisExpression, dispatchReceiver, functionDescriptor.getDispatchReceiverParameter()); - } - return contextWithAliasForThisExpression; - } - - @NotNull - private TranslationContext contextWithAlias(@NotNull TranslationContext contextWithAliasForThisExpression, - @NotNull JsExpression aliasExpression, @Nullable DeclarationDescriptor descriptorToAlias) { - TemporaryVariable aliasForReceiver = context().declareTemporary(aliasExpression); - assert descriptorToAlias != null; - TranslationContext newContext = - contextWithAliasForThisExpression.innerContextWithAliased(descriptorToAlias, aliasForReceiver.reference()); - newContext.addStatementToCurrentBlock(aliasForReceiver.assignmentExpression().makeStmt()); - return newContext; - } - - @NotNull - private TemporaryVariable createAliasForArgument(@NotNull ValueParameterDescriptor parameterDescriptor) { - List actualArguments = resolvedCall.getValueArgumentsByIndex(); - if (actualArguments == null) { - throw new IllegalStateException("Failed to arrange value arguments by index: " + resolvedCall.getResultingDescriptor()); - } - ResolvedValueArgument actualArgument = actualArguments.get(parameterDescriptor.getIndex()); - JsExpression translatedArgument = translateArgument(actualArgument); - TemporaryVariable aliasForArgument = context().declareTemporary(translatedArgument); - context().addStatementToCurrentBlock(aliasForArgument.assignmentExpression().makeStmt()); - return aliasForArgument; - } - - @NotNull - private JsExpression translateArgument(@NotNull ResolvedValueArgument actualArgument) { - List result = new SmartList(); - translateSingleArgument(actualArgument, result, context(), true); - assert result.size() == 1 : "We always wrap varargs in kotlin calls."; - return result.get(0); - } - - private static final class InlineFunctionMutator implements Mutator { - - @NotNull - private final TemporaryVariable toAssignTo; - - private InlineFunctionMutator(@NotNull TemporaryVariable to) { - toAssignTo = to; - } - - @NotNull - @Override - public JsNode mutate(@NotNull JsNode node) { - if (node instanceof JsReturn) { - JsExpression returnedExpression = ((JsReturn)node).getExpression(); - return JsAstUtils.assignment(toAssignTo.name().makeRef(), returnedExpression); - } - return node; - } - } -} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java index 4e34013a839..0a0af77c9ce 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java @@ -29,6 +29,7 @@ import org.jetbrains.k2js.translate.utils.ErrorReportingUtils; import org.jetbrains.k2js.translate.utils.JsAstUtils; import static org.jetbrains.k2js.translate.general.Translation.translateAsExpression; +import static org.jetbrains.k2js.translate.reference.CallExpressionTranslator.shouldBeInlined; import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; import static org.jetbrains.k2js.translate.utils.PsiUtils.getNotNullSimpleNameSelector; import static org.jetbrains.k2js.translate.utils.PsiUtils.getSelector; @@ -69,7 +70,7 @@ public final class QualifiedExpressionTranslator { return VariableAccessTranslator.newInstance(context, (JetSimpleNameExpression)selector, receiver).translateAsGet(); } if (selector instanceof JetCallExpression) { - if (InlinedCallExpressionTranslator.shouldBeInlined((JetCallExpression) selector, context) && + if (shouldBeInlined((JetCallExpression) selector, context) && BindingContextUtilPackage.isUsedAsExpression(selector, context.bindingContext())) { TemporaryVariable temporaryVariable = context.declareTemporary(null); JsExpression result = invokeCallExpressionTranslator(receiver, selector, context);