diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d633e24302b..0da00cdbd16 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -16,10 +16,12 @@ + + - + @@ -168,7 +170,7 @@ @@ -1545,13 +1547,6 @@ - - - - - - - @@ -1580,24 +1575,6 @@ - - - - - - - - - - - - - - - - - - @@ -1612,13 +1589,6 @@ - - - - - - - @@ -1633,13 +1603,6 @@ - - - - - - - @@ -1647,18 +1610,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index db759c10984..6e3547c79b3 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -116,7 +116,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitCallExpression(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { - return CallTranslator.translate(expression, context); + return CallTranslator.translate(expression, null, context); } @Override diff --git a/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java index 9c9b5f49da0..f738ca8e1ea 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java @@ -9,9 +9,9 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.reference.AccessTranslator; import org.jetbrains.k2js.translate.reference.CallTranslator; import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator; -import org.jetbrains.k2js.translate.utils.PsiUtils; import static org.jetbrains.k2js.translate.general.Translation.translateAsExpression; +import static org.jetbrains.k2js.translate.utils.PsiUtils.getNotNullSimpleNameSelector; import static org.jetbrains.k2js.translate.utils.TranslationUtils.notNullCheck; /** @@ -27,7 +27,7 @@ public final class QualifiedExpressionTranslator { @NotNull TranslationContext context) { if (expression instanceof JetDotQualifiedExpression) { JsExpression receiver = translateReceiver(expression, context); - return PropertyAccessTranslator.newInstance(PsiUtils.getSelectorAsSimpleName(expression), receiver, context); + return PropertyAccessTranslator.newInstance(getNotNullSimpleNameSelector(expression), receiver, context); } throw new UnsupportedOperationException(); } @@ -37,8 +37,8 @@ public final class QualifiedExpressionTranslator { @NotNull TranslationContext context) { TemporaryVariable receiver = context.declareTemporary(translateReceiver(expression, context)); JsNullLiteral nullLiteral = context.program().getNullLiteral(); - JsExpression selector = translateSelector(expression, context); - JsExpression thenExpression = composeQualifiedExpression(receiver.nameReference(), selector); + JetExpression selector = getSelector(expression); + JsExpression thenExpression = translate(receiver.nameReference(), selector, context); JsConditional callMethodIfNotNullConditional = new JsConditional(notNullCheck(context, receiver.nameReference()), thenExpression, nullLiteral); return AstUtil.newSequence(receiver.assignmentExpression(), callMethodIfNotNullConditional); @@ -47,17 +47,31 @@ public final class QualifiedExpressionTranslator { @NotNull public static JsExpression translateDotQualifiedExpression(@NotNull JetDotQualifiedExpression expression, @NotNull TranslationContext context) { - if (expression.getSelectorExpression() instanceof JetCallExpression) { - return CallTranslator.translate(expression, context); - } //TODO: problem with extension properties lies here JsExpression receiver = translateReceiver(expression, context); - if (PropertyAccessTranslator.canBePropertyGetterCall(expression, context)) { + JetExpression selector = getSelector(expression); + return translate(receiver, selector, context); + } + + @NotNull + private static JetExpression getSelector(@NotNull JetQualifiedExpression expression) { + JetExpression selector = expression.getSelectorExpression(); + //TODO: util? + assert selector != null; + return selector; + } + + @NotNull + private static JsExpression translate(@NotNull JsExpression receiver, @NotNull JetExpression selector, + @NotNull TranslationContext context) { + if (PropertyAccessTranslator.canBePropertyGetterCall(selector, context)) { return PropertyAccessTranslator.translateAsPropertyGetterCall - (PsiUtils.getSelectorAsSimpleName(expression), receiver, context); + ((JetSimpleNameExpression) selector, receiver, context); } - JsExpression selector = translateSelector(expression, context); - return composeQualifiedExpression(receiver, selector); + if (selector instanceof JetCallExpression) { + return CallTranslator.translate((JetCallExpression) selector, receiver, context); + } + return composeQualifiedExpression(receiver, translateAsExpression(selector, context)); } @NotNull @@ -75,14 +89,6 @@ public final class QualifiedExpressionTranslator { } } - @NotNull - private static JsExpression translateSelector(@NotNull JetQualifiedExpression expression, - @NotNull TranslationContext context) { - JetExpression jetSelector = expression.getSelectorExpression(); - assert jetSelector != null : "Selector should not be null in dot qualified expression."; - return translateAsExpression(jetSelector, context); - } - @NotNull private static JsExpression translateReceiver(@NotNull JetQualifiedExpression expression, @NotNull TranslationContext context) { diff --git a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java index 803ede6fc4b..6e78c8ed50f 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java @@ -22,6 +22,7 @@ public abstract class AccessTranslator extends AbstractTranslator { if (referenceExpression instanceof JetQualifiedExpression) { return QualifiedExpressionTranslator.getAccessTranslator((JetQualifiedExpression) referenceExpression, context); } + assert referenceExpression instanceof JetSimpleNameExpression; return PropertyAccessTranslator.newInstance((JetSimpleNameExpression) referenceExpression, null, context); } if (referenceExpression instanceof JetArrayAccessExpression) { diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index a4d1b3bfd2e..511029590b7 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -7,7 +7,10 @@ import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.JetBinaryExpression; +import org.jetbrains.jet.lang.psi.JetCallExpression; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetUnaryExpression; import org.jetbrains.jet.lang.resolve.calls.DefaultValueArgument; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedCallImpl; @@ -76,24 +79,13 @@ public final class CallTranslator extends AbstractTranslator { } @NotNull - private CallTranslator buildFromDotQualified(@NotNull JetDotQualifiedExpression dotExpression) { - JsExpression receiver = translateReceiver(context, dotExpression); - //TODO: util? - JetExpression selectorExpression = dotExpression.getSelectorExpression(); - assert selectorExpression instanceof JetCallExpression; - JetCallExpression callExpression = (JetCallExpression) selectorExpression; + private CallTranslator buildFromCallExpression(@NotNull JetCallExpression callExpression, + @Nullable JsExpression receiver) { ResolvedCall resolvedCall = getResolvedCallForCallExpression(context.bindingContext(), callExpression); List arguments = translateArgumentsForCallExpression(callExpression, context); return new CallTranslator(receiver, arguments, resolvedCall, null, context); } - @NotNull - private CallTranslator buildFromCallExpression(@NotNull JetCallExpression callExpression) { - ResolvedCall resolvedCall = getResolvedCallForCallExpression(context.bindingContext(), callExpression); - List arguments = translateArgumentsForCallExpression(callExpression, context); - return new CallTranslator(null, arguments, resolvedCall, null, context); - } - @NotNull private static List translateArgumentsForCallExpression(@NotNull JetCallExpression callExpression, @NotNull TranslationContext context) { @@ -151,17 +143,11 @@ public final class CallTranslator extends AbstractTranslator { return (new Builder(context).buildFromUnary(unaryExpression)).translate(); } - @NotNull - public static JsExpression translate(@NotNull JetDotQualifiedExpression dotExpression, - @NotNull TranslationContext context) { - return (new Builder(context).buildFromDotQualified(dotExpression)).translate(); - } - - @NotNull public static JsExpression translate(@NotNull JetCallExpression callExpression, + @Nullable JsExpression receiver, @NotNull TranslationContext context) { - return (new Builder(context).buildFromCallExpression(callExpression)).translate(); + return (new Builder(context).buildFromCallExpression(callExpression, receiver)).translate(); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java index 69ef377834b..d7e2814da37 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java @@ -87,6 +87,7 @@ public final class PropertyAccessTranslator extends AccessTranslator { (context.bindingContext(), expression) instanceof PropertyDescriptor); } + //TODO: make this method more specific public static boolean canBePropertyGetterCall(@NotNull JetExpression expression, @NotNull TranslationContext context) { if (expression instanceof JetQualifiedExpression) { diff --git a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java index 433fd6b4137..c1c450da736 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java @@ -28,6 +28,13 @@ public final class PsiUtils { return (JetSimpleNameExpression) selectorExpression; } + @NotNull + public static JetSimpleNameExpression getNotNullSimpleNameSelector(@NotNull JetQualifiedExpression expression) { + JetSimpleNameExpression selectorAsSimpleName = getSelectorAsSimpleName(expression); + assert selectorAsSimpleName != null; + return selectorAsSimpleName; + } + @NotNull public static JetToken getOperationToken(@NotNull JetOperationExpression expression) { JetSimpleNameExpression operationExpression = expression.getOperationReference();