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 @@
-
+
@@ -244,11 +246,11 @@
-
+
-
-
-
+
+
+
@@ -266,7 +268,7 @@
-
+
@@ -274,19 +276,28 @@
-
-
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
-
+
@@ -310,10 +321,10 @@
-
+
-
+
@@ -328,15 +339,6 @@
-
-
-
-
-
-
-
-
-
@@ -457,7 +459,6 @@
@@ -1453,7 +1455,7 @@
-
+
@@ -1498,7 +1500,7 @@
-
+
@@ -1511,7 +1513,6 @@
-
@@ -1536,6 +1537,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();