diff --git a/js/js.dart-ast/js.dart-ast.iml b/js/js.dart-ast/js.dart-ast.iml index 641076a3d8d..5e7b8f6572b 100644 --- a/js/js.dart-ast/js.dart-ast.iml +++ b/js/js.dart-ast/js.dart-ast.iml @@ -9,6 +9,7 @@ + diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java index f86e51ae90a..cd581c79593 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java @@ -7,12 +7,14 @@ package com.google.dart.compiler.backend.js.ast; import com.google.dart.compiler.util.AstUtil; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.types.lang.InlineStrategy; import java.util.Arrays; import java.util.List; public final class JsInvocation extends JsExpressionImpl.JsExpressionHasArguments { private JsExpression qualifier; + private InlineStrategy inlineStrategy = InlineStrategy.NOT_INLINE; public JsInvocation() { super(new SmartList()); @@ -50,6 +52,14 @@ public final class JsInvocation extends JsExpressionImpl.JsExpressionHasArgument this.qualifier = qualifier; } + public InlineStrategy getInlineStrategy() { + return inlineStrategy; + } + + public void setInlineStrategy(InlineStrategy inlineStrategy) { + this.inlineStrategy = inlineStrategy; + } + @Override public void accept(JsVisitor v) { v.visitInvocation(this); @@ -76,7 +86,7 @@ public final class JsInvocation extends JsExpressionImpl.JsExpressionHasArgument JsExpression qualifierCopy = AstUtil.deepCopy(qualifier); List argumentsCopy = AstUtil.deepCopy(arguments); JsInvocation copy = new JsInvocation(qualifierCopy, argumentsCopy); - copy.setInlineStatus(getInlineStatus()); + copy.setInlineStrategy(inlineStrategy); return copy; } } 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 082bf8f6838..d158269c28a 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 @@ -17,9 +17,19 @@ package org.jetbrains.k2js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsInvocation; 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.resolve.calls.callUtil.CallUtilPackage; +import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; +import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall; +import org.jetbrains.jet.lang.types.lang.InlineStrategy; +import org.jetbrains.jet.lang.types.lang.InlineUtil; import org.jetbrains.k2js.translate.callTranslator.CallTranslator; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -31,10 +41,39 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl @Nullable JsExpression receiver, @NotNull TranslationContext context ) { - return (new CallExpressionTranslator(expression, receiver, context)).translate(); + JsExpression callExpression = (new CallExpressionTranslator(expression, receiver, context)).translate(); + + if (shouldBeInlined(expression, context) + && callExpression instanceof JsInvocation) { + + ((JsInvocation) callExpression).setInlineStrategy(InlineStrategy.IN_PLACE); + } + + return callExpression; } public static boolean shouldBeInlined(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { + ResolvedCall resolvedCall = CallUtilPackage.getResolvedCall(expression, context.bindingContext()); + assert resolvedCall != null; + + CallableDescriptor descriptor; + + if (resolvedCall instanceof VariableAsFunctionResolvedCall) { + descriptor = ((VariableAsFunctionResolvedCall) resolvedCall).getVariableCall().getCandidateDescriptor(); + } else { + descriptor = resolvedCall.getCandidateDescriptor(); + } + + if (descriptor instanceof SimpleFunctionDescriptor) { + return ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline(); + } + + if (descriptor instanceof ValueParameterDescriptor) { + DeclarationDescriptor containingDescriptor = descriptor.getContainingDeclaration(); + return InlineUtil.getInlineType(containingDescriptor).isInline() + && !InlineUtil.hasNoinlineAnnotation(descriptor); + } + return false; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/InlineAnnotation.kt b/js/js.translator/src/org/jetbrains/k2js/translate/utils/InlineAnnotation.kt new file mode 100644 index 00000000000..0d4f7ce0565 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/InlineAnnotation.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2014 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.utils + +enum class InlineAnnotation(val fqName: String) { + INLINE : InlineAnnotation("kotlin.inline") + NO_INLINE : InlineAnnotation("kotlin.noinline") +} \ No newline at end of file