diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 70548cd4624..e814738a3bb 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -15,18 +15,10 @@
-
-
+
-
-
-
-
-
-
-
-
+
@@ -162,7 +154,7 @@
-
+
@@ -175,7 +167,7 @@
-
+
@@ -248,32 +240,70 @@
-
+
-
+
-
-
-
+
+
+
-
-
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
@@ -288,57 +318,19 @@
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -464,9 +456,7 @@
@@ -601,6 +593,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -655,7 +687,69 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -969,39 +1063,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1122,6 +1183,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1278,11 +1372,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1338,7 +1432,7 @@
-
+
@@ -1403,7 +1497,7 @@
-
+
@@ -1416,7 +1510,6 @@
-
@@ -1441,6 +1534,7 @@
+
@@ -1450,62 +1544,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1524,8 +1562,10 @@
-
-
+
+
+
+
@@ -1536,13 +1576,6 @@
-
-
-
-
-
-
-
@@ -1550,6 +1583,13 @@
+
+
+
+
+
+
+
@@ -1557,17 +1597,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1657,6 +1755,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
index e0e4955b334..db759c10984 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
@@ -9,7 +9,6 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.NullValue;
-import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.general.TranslatorVisitor;
@@ -26,7 +25,6 @@ import java.util.List;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getCompileTimeValue;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression;
-import static org.jetbrains.k2js.translate.utils.TranslationUtils.notNullCheck;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateInitializerForProperty;
/**
@@ -247,59 +245,7 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@NotNull
public JsNode visitDotQualifiedExpression(@NotNull JetDotQualifiedExpression expression,
@NotNull TranslationContext context) {
- //TODO: problem with extension properties lies here
-// if (PropertyAccessTranslator.canBePropertyGetterCall(expression, context)) {
-// return PropertyAccessTranslator.translateAsPropertyGetterCall()
-// }
- if (expression.getSelectorExpression() instanceof JetCallExpression) {
- return CallTranslator.translate(expression, context);
- }
- JsExpression receiver = translateReceiver(expression, context);
- JsExpression selector = translateSelector(expression, context);
- return composeQualifiedExpression(receiver, selector);
- }
-
- @NotNull
- private JsExpression composeQualifiedExpression(@NotNull JsExpression receiver, @NotNull JsExpression selector) {
- //TODO: make sure that logic would not break for binary operation. check if there is a way to provide clearer logic
- assert (selector instanceof JsNameRef || selector instanceof JsInvocation || selector instanceof JsBinaryOperation)
- : "Selector should be a name reference or a method invocation in dot qualified expression.";
- if (selector instanceof JsInvocation) {
- return translateAsQualifiedInvocation(receiver, (JsInvocation) selector);
- } else if (selector instanceof JsNameRef) {
- return translateAsQualifiedNameReference(receiver, (JsNameRef) selector);
- } else {
- ((JsBinaryOperation) selector).setArg1(receiver);
- return selector;
- }
- }
-
- @NotNull
- private 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 JsExpression translateReceiver(@NotNull JetQualifiedExpression expression,
- @NotNull TranslationContext context) {
- return translateAsExpression(expression.getReceiverExpression(), context);
- }
-
- @NotNull
- private JsExpression translateAsQualifiedNameReference(@NotNull JsExpression receiver, @NotNull JsNameRef selector) {
- selector.setQualifier(receiver);
- return selector;
- }
-
- @NotNull
- private JsExpression translateAsQualifiedInvocation(@NotNull JsExpression receiver, @NotNull JsInvocation selector) {
- JsExpression qualifier = selector.getQualifier();
- JsNameRef nameRef = (JsNameRef) qualifier;
- nameRef.setQualifier(receiver);
- return selector;
+ return QualifiedExpressionTranslator.translateDotQualifiedExpression(expression, context);
}
@Override
@@ -328,13 +274,7 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@NotNull
public JsNode visitSafeQualifiedExpression(@NotNull JetSafeQualifiedExpression expression,
@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);
- JsConditional callMethodIfNotNullConditional
- = new JsConditional(notNullCheck(context, receiver.nameReference()), thenExpression, nullLiteral);
- return AstUtil.newSequence(receiver.assignmentExpression(), callMethodIfNotNullConditional);
+ return QualifiedExpressionTranslator.translateSafeQualifiedExpression(expression, context);
}
@Override
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java
new file mode 100644
index 00000000000..fd3136a0e82
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java
@@ -0,0 +1,93 @@
+package org.jetbrains.k2js.translate.expression;
+
+import com.google.dart.compiler.backend.js.ast.*;
+import com.google.dart.compiler.util.AstUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TemporaryVariable;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.reference.CallTranslator;
+import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
+
+import static org.jetbrains.k2js.translate.general.Translation.translateAsExpression;
+import static org.jetbrains.k2js.translate.utils.TranslationUtils.notNullCheck;
+
+/**
+ * @author Pavel Talanov
+ */
+public final class QualifiedExpressionTranslator {
+
+ private QualifiedExpressionTranslator() {
+ }
+
+ @NotNull
+ public static JsExpression translateSafeQualifiedExpression(@NotNull JetSafeQualifiedExpression expression,
+ @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);
+ JsConditional callMethodIfNotNullConditional
+ = new JsConditional(notNullCheck(context, receiver.nameReference()), thenExpression, nullLiteral);
+ return AstUtil.newSequence(receiver.assignmentExpression(), callMethodIfNotNullConditional);
+ }
+
+ @NotNull
+ public static JsExpression translateDotQualifiedExpression(@NotNull JetDotQualifiedExpression expression,
+ @NotNull TranslationContext context) {
+ //TODO: problem with extension properties lies here
+ //TODO: problem with extension properties lies here
+ if (PropertyAccessTranslator.canBePropertyGetterCall(expression, context)) {
+ return PropertyAccessTranslator.translateAsPropertyGetterCall(expression, context);
+ }
+ if (expression.getSelectorExpression() instanceof JetCallExpression) {
+ return CallTranslator.translate(expression, context);
+ }
+ JsExpression receiver = translateReceiver(expression, context);
+ JsExpression selector = translateSelector(expression, context);
+ return composeQualifiedExpression(receiver, selector);
+ }
+
+ @NotNull
+ private static JsExpression composeQualifiedExpression(@NotNull JsExpression receiver, @NotNull JsExpression selector) {
+ //TODO: make sure that logic would not break for binary operation. check if there is a way to provide clearer logic
+ assert (selector instanceof JsNameRef || selector instanceof JsInvocation || selector instanceof JsBinaryOperation)
+ : "Selector should be a name reference or a method invocation in dot qualified expression.";
+ if (selector instanceof JsInvocation) {
+ return translateAsQualifiedInvocation(receiver, (JsInvocation) selector);
+ } else if (selector instanceof JsNameRef) {
+ return translateAsQualifiedNameReference(receiver, (JsNameRef) selector);
+ } else {
+ ((JsBinaryOperation) selector).setArg1(receiver);
+ return selector;
+ }
+ }
+
+ @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) {
+ return translateAsExpression(expression.getReceiverExpression(), context);
+ }
+
+ @NotNull
+ private static JsExpression translateAsQualifiedNameReference(@NotNull JsExpression receiver, @NotNull JsNameRef selector) {
+ selector.setQualifier(receiver);
+ return selector;
+ }
+
+ @NotNull
+ private static JsExpression translateAsQualifiedInvocation(@NotNull JsExpression receiver, @NotNull JsInvocation selector) {
+ JsExpression qualifier = selector.getQualifier();
+ JsNameRef nameRef = (JsNameRef) qualifier;
+ nameRef.setQualifier(receiver);
+ return selector;
+ }
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
index a9cd866b5f5..fd26d1a18b6 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
@@ -54,6 +54,13 @@ public final class PropertyAccessTranslator extends AccessTranslator {
.translateAsGet();
}
+ @NotNull
+ public static JsExpression translateAsPropertyGetterCall(@NotNull JetQualifiedExpression expression,
+ @NotNull TranslationContext context) {
+ return (newInstance(expression, context))
+ .translateAsGet();
+ }
+
@NotNull
private static PropertyAccessTranslator newInstance(@NotNull PropertyDescriptor descriptor,
@NotNull ResolvedCall> resolvedCall,