diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java index 855e0bfd01c..262646cae9a 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java @@ -4,7 +4,6 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetArrayAccessExpression; -import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.utils.BindingUtils; @@ -17,6 +16,8 @@ import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForRe /** * @author Pavel Talanov */ + +//TODO: inspect not clear how the class handles set and get operations differently public final class ArrayAccessTranslator extends AccessTranslator { /*package*/ @@ -34,6 +35,7 @@ public final class ArrayAccessTranslator extends AccessTranslator { @NotNull TranslationContext context) { super(context); this.expression = expression; + //TODO: that is strange this.methodDescriptor = (FunctionDescriptor) getDescriptorForReferenceExpression(context.bindingContext(), expression); } @@ -41,20 +43,27 @@ public final class ArrayAccessTranslator extends AccessTranslator { @Override @NotNull public JsExpression translateAsGet() { - ResolvedCall resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), expression); List arguments = translateIndexExpressions(); - return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall, - methodDescriptor, CallType.NORMAL, context()); + return translateAsMethodCall(arguments); } @Override @NotNull public JsExpression translateAsSet(@NotNull JsExpression expression) { - ResolvedCall resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), this.expression); + List arguments = translateIndexExpressions(); arguments.add(expression); - return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall, - methodDescriptor, CallType.NORMAL, context()); + return translateAsMethodCall(arguments); + } + + @NotNull + private JsExpression translateAsMethodCall(@NotNull List arguments) { + return CallBuilder.build(context()) + .receiver(translateArrayExpression()) + .args(arguments) + .resolvedCall(BindingUtils.getResolvedCall(context().bindingContext(), expression)) + .descriptor(methodDescriptor) + .translate(); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index fe2e2f9f9c5..42ca8bf4ab5 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -17,7 +17,6 @@ import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; @@ -43,25 +42,6 @@ public final class CallTranslator extends AbstractTranslator { public /*var*/ JsExpression functionReference; } - @NotNull - public static JsExpression translate(@Nullable JsExpression receiver, - @NotNull ResolvedCall resolvedCall, - @Nullable CallableDescriptor descriptorToCall, - @NotNull CallType callType, - @NotNull TranslationContext context) { - return (new CallTranslator(receiver, null, Collections.emptyList(), resolvedCall, - descriptorToCall, CallType.SAFE, context)).translate(); - } - - @NotNull - public static JsExpression translate(@Nullable JsExpression receiver, @NotNull List arguments, - @NotNull ResolvedCall resolvedCall, - @Nullable CallableDescriptor descriptorToCall, - @NotNull CallType callType, - @NotNull TranslationContext context) { - return (new CallTranslator(receiver, null, arguments, resolvedCall, descriptorToCall, callType, context)).translate(); - } - @Nullable private /*var*/ JsExpression receiver; diff --git a/translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java index 8bb64aa070d..a496712565c 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/KotlinPropertyAccessTranslator.java @@ -4,11 +4,11 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor; +import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.k2js.translate.context.TranslationContext; -import java.util.Arrays; - /** * @author Pavel Talanov *

@@ -37,15 +37,32 @@ public final class KotlinPropertyAccessTranslator extends PropertyAccessTranslat @Override @NotNull public JsExpression translateAsGet() { - return CallTranslator.translate(qualifier, resolvedCall, propertyDescriptor.getGetter(), getCallType(), context()); + //TODO: check for duplication + PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); + assert getter != null : "Getter for kotlin properties should bot be null."; + return callBuilderForAccessor() + .descriptor(getter) + .translate(); } @Override @NotNull public JsExpression translateAsSet(@NotNull JsExpression toSetTo) { + //TODO: check for duplication + PropertySetterDescriptor setter = propertyDescriptor.getSetter(); + assert setter != null : "Getter for kotlin properties should bot be null."; + return callBuilderForAccessor() + .args(toSetTo) + .descriptor(setter) + .translate(); + } - return CallTranslator.translate(qualifier, Arrays.asList(toSetTo), - resolvedCall, propertyDescriptor.getSetter(), getCallType(), context()); + @NotNull + private CallBuilder callBuilderForAccessor() { + return CallBuilder.build(context()) + .receiver(qualifier) + .resolvedCall(resolvedCall) + .type(getCallType()); } }