From 97a1a13235f35f7996cb202658f875efacddc54c Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 14 Apr 2015 18:02:44 +0300 Subject: [PATCH] JS: inline componentN functions #KT-7294 fixed --- .../dart/compiler/backend/js/ast/JsVars.java | 4 ++-- .../expression/MultiDeclarationTranslator.java | 9 ++++++++- .../reference/CallExpressionTranslator.java | 4 ++-- .../kotlin/js/translate/utils/PsiUtils.java | 5 +++++ .../kotlin/js/translate/utils/inlineUtils.kt | 10 ++++++---- .../testData/inline/cases/multiDeclaration.kt | 17 +++++++++++++++++ 6 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 js/js.translator/testData/inline/cases/multiDeclaration.kt diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java index 18e3a1fc2ee..c8a4333db5d 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java @@ -34,11 +34,11 @@ public class JsVars extends SourceInfoAwareJsNode implements JsStatement, Iterab } public JsVars(JsVar var) { - this(Collections.singletonList(var), false); + this(new SmartList(var), false); } public JsVars(JsVar... vars) { - this(Arrays.asList(vars), false); + this(new SmartList(vars), false); } public boolean isMultiline() { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/MultiDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/MultiDeclarationTranslator.java index dd5f8c6f7ef..81a07830247 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/MultiDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/MultiDeclarationTranslator.java @@ -23,10 +23,12 @@ import com.google.dart.compiler.backend.js.ast.JsVars; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; +import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor; import org.jetbrains.kotlin.descriptors.VariableDescriptor; import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; +import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator; import org.jetbrains.kotlin.psi.JetMultiDeclaration; import org.jetbrains.kotlin.psi.JetMultiDeclarationEntry; import org.jetbrains.kotlin.resolve.BindingContext; @@ -36,6 +38,8 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import java.util.ArrayList; import java.util.List; +import static org.jetbrains.kotlin.js.translate.utils.UtilsPackage.setInlineCallMetadata; + public class MultiDeclarationTranslator extends AbstractTranslator { // if multiObjectName was init, initializer must be null @@ -79,7 +83,10 @@ public class MultiDeclarationTranslator extends AbstractTranslator { ResolvedCall entryInitCall = context().bindingContext().get(BindingContext.COMPONENT_RESOLVED_CALL, entry); assert entryInitCall != null : "Entry init call must be not null"; JsExpression entryInitializer = CallTranslator.INSTANCE$.translate(context(), entryInitCall, multiObjNameRef); - + FunctionDescriptor candidateDescriptor = entryInitCall.getCandidateDescriptor(); + if (CallExpressionTranslator.shouldBeInlined(candidateDescriptor)) { + setInlineCallMetadata(entryInitializer, entry, entryInitCall, context()); + } VariableDescriptor descriptor = BindingContextUtils.getNotNull( context().bindingContext(), BindingContext.VARIABLE, entry); JsName name = context().getNameForDescriptor(descriptor); jsVars.add(new JsVars.JsVar(name, entryInitializer)); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java index 7c652abb17c..e1e5c5695e3 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallExpressionTranslator.java @@ -60,11 +60,11 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl if (isJsCall(resolvedCall)) { return (new CallExpressionTranslator(expression, receiver, context)).translateJsCode(); } - + JsExpression callExpression = (new CallExpressionTranslator(expression, receiver, context)).translate(); if (!resolvedCall.isSafeCall() && shouldBeInlined(expression, context)) { - setInlineCallMetadata(callExpression, expression, context); + setInlineCallMetadata(callExpression, expression, resolvedCall, context); } return callExpression; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/PsiUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/PsiUtils.java index 66fa20dc16e..9fbbe07565a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/PsiUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/PsiUtils.java @@ -146,6 +146,11 @@ public final class PsiUtils { ResolvedCall resolvedCall = CallUtilPackage.getResolvedCall(expression, context.bindingContext()); assert resolvedCall != null; + return getFunctionDescriptor(resolvedCall); + } + + @NotNull + public static CallableDescriptor getFunctionDescriptor(ResolvedCall resolvedCall) { if (resolvedCall instanceof VariableAsFunctionResolvedCall) { return ((VariableAsFunctionResolvedCall) resolvedCall).getVariableCall().getCandidateDescriptor(); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/inlineUtils.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/inlineUtils.kt index 22f57fc34e6..5466db7b665 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/inlineUtils.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/inlineUtils.kt @@ -24,7 +24,8 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.js.inline.util.isCallInvocation import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator -import org.jetbrains.kotlin.psi.JetCallExpression +import org.jetbrains.kotlin.psi.JetExpression +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.inline.InlineStrategy /** @@ -40,10 +41,11 @@ import org.jetbrains.kotlin.resolve.inline.InlineStrategy */ fun setInlineCallMetadata( expression: JsExpression, - jetCall: JetCallExpression, + psiElement: JetExpression, + resolvedCall: ResolvedCall<*>, context: TranslationContext ) { - val descriptor = PsiUtils.getFunctionDescriptor(jetCall, context) + val descriptor = PsiUtils.getFunctionDescriptor(resolvedCall) assert(CallExpressionTranslator.shouldBeInlined(descriptor)) { "Expected descriptor of callable, that should be inlined, but got: $descriptor" } @@ -57,7 +59,7 @@ fun setInlineCallMetadata( if (name == invocation.name) { invocation.descriptor = descriptor invocation.inlineStrategy = InlineStrategy.IN_PLACE - invocation.psiElement = jetCall + invocation.psiElement = psiElement } } } diff --git a/js/js.translator/testData/inline/cases/multiDeclaration.kt b/js/js.translator/testData/inline/cases/multiDeclaration.kt new file mode 100644 index 00000000000..9f3d175f8d4 --- /dev/null +++ b/js/js.translator/testData/inline/cases/multiDeclaration.kt @@ -0,0 +1,17 @@ +package foo + +// CHECK_NOT_CALLED: component1 +// CHECK_NOT_CALLED: component2 + +class A(val a: Int, val b: Int) + +inline fun A.component1(): Int = a +inline fun A.component2(): Int = b + +fun box(): String { + val (a, b) = A(1, 2) + assertEquals(1, a) + assertEquals(2, b) + + return "OK" +} \ No newline at end of file