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