diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 9d54a5c9573..7f37b9fb423 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -7,17 +7,18 @@
-
-
+
+
-
-
-
+
+
+
+
@@ -89,19 +90,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -162,26 +150,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -221,12 +189,23 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -256,52 +235,32 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -310,7 +269,7 @@
-
+
@@ -321,14 +280,50 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -336,19 +331,10 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
@@ -375,22 +361,22 @@
@@ -607,6 +593,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -669,7 +699,7 @@
-
+
@@ -788,40 +818,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -887,17 +883,17 @@
-
+
-
+
-
-
+
+
-
-
-
+
+
+
@@ -941,6 +937,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1061,12 +1091,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
localhost
@@ -1184,7 +1214,7 @@
-
+
@@ -1197,7 +1227,6 @@
-
@@ -1222,6 +1251,7 @@
+
@@ -1231,111 +1261,67 @@
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -1344,11 +1330,57 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translator/src/org/jetbrains/k2js/declarations/Declarations.java b/translator/src/org/jetbrains/k2js/declarations/Declarations.java
index 4b232b07126..a5ad56722e4 100644
--- a/translator/src/org/jetbrains/k2js/declarations/Declarations.java
+++ b/translator/src/org/jetbrains/k2js/declarations/Declarations.java
@@ -78,7 +78,7 @@ public final class Declarations {
}
/*package*/ void putScope(@NotNull DeclarationDescriptor descriptor, @NotNull JsScope scope) {
- assert !descriptorToScopeMap.containsKey(descriptor) : "Already contains that key!";
+// assert !descriptorToScopeMap.containsKey(descriptor) : "Already contains that key!";
descriptorToScopeMap.put(descriptor, scope);
}
@@ -89,7 +89,7 @@ public final class Declarations {
}
/*package*/ void putQualifier(@NotNull DeclarationDescriptor descriptor, @Nullable JsNameRef qualifier) {
- assert !descriptorToQualifierMap.containsKey(descriptor) : "Already contains that key!";
+// assert !descriptorToQualifierMap.containsKey(descriptor) : "Already contains that key!";
descriptorToQualifierMap.put(descriptor, qualifier);
}
}
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
index 2f8390b93db..c1dc9fdf156 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
@@ -258,9 +258,8 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@NotNull
private JsExpression translateQualifiedExpression(@NotNull JetQualifiedExpression expression,
@NotNull TranslationContext context) {
- PropertyAccessTranslator propertyAccessTranslator = Translation.propertyAccessTranslator(context);
- if (propertyAccessTranslator.canBePropertyGetterCall(expression)) {
- return propertyAccessTranslator.translateAsPropertyGetterCall(expression);
+ if (PropertyAccessTranslator.canBePropertyGetterCall(expression, context)) {
+ return PropertyAccessTranslator.translateAsPropertyGetterCall(expression, context);
}
return translateAsQualifiedAccess(expression, context);
}
diff --git a/translator/src/org/jetbrains/k2js/translate/general/Translation.java b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
index a57dfa0319b..50c052dc3a0 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/Translation.java
+++ b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
@@ -17,7 +17,6 @@ import org.jetbrains.k2js.translate.expression.PatternTranslator;
import org.jetbrains.k2js.translate.expression.WhenTranslator;
import org.jetbrains.k2js.translate.initializer.ClassInitializerTranslator;
import org.jetbrains.k2js.translate.initializer.NamespaceInitializerTranslator;
-import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
import org.jetbrains.k2js.translate.utils.BindingUtils;
/**
@@ -34,11 +33,6 @@ public final class Translation {
return FunctionTranslator.newInstance(function, context);
}
- @NotNull
- static public PropertyAccessTranslator propertyAccessTranslator(@NotNull TranslationContext context) {
- return PropertyAccessTranslator.newInstance(context);
- }
-
@NotNull
static public JsStatement translateNamespace(@NotNull JetNamespace namespace,
@NotNull TranslationContext context) {
@@ -56,11 +50,6 @@ public final class Translation {
return PatternTranslator.newInstance(context);
}
-// @NotNull
-// static public ReferenceTranslator referenceTranslator(@NotNull TranslationContext context) {
-// return ReferenceTranslator.translateSimpleName(context);
-// }
-
@NotNull
static public JsNode translateExpression(@NotNull JetExpression expression, @NotNull TranslationContext context) {
return expression.accept(new ExpressionVisitor(), context);
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
index 360157b6d61..f40d82b6259 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
@@ -145,8 +145,8 @@ public final class BinaryOperationTranslator extends OperationTranslator {
@NotNull
public JsInvocation setterCall(@NotNull JsExpression assignTo) {
- PropertyAccessTranslator propertyAccessTranslator = Translation.propertyAccessTranslator(context());
- JsInvocation setterCall = propertyAccessTranslator.translateAsPropertySetterCall(expression.getLeft());
+ JsInvocation setterCall =
+ PropertyAccessTranslator.translateAsPropertySetterCall(expression.getLeft(), context());
setterCall.setArguments(assignTo);
return setterCall;
}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java
index 7359b820e8c..2c8c70e77d7 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java
@@ -10,8 +10,8 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
-import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
import org.jetbrains.k2js.translate.utils.BindingUtils;
/**
@@ -42,7 +42,7 @@ public class OperationTranslator extends AbstractTranslator {
}
protected boolean isPropertyAccess(@NotNull JetExpression expression) {
- return Translation.propertyAccessTranslator(context()).canBePropertyAccess(expression);
+ return PropertyAccessTranslator.canBePropertyAccess(expression, context());
}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
index f9e7cd63ccc..e17365555f6 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
@@ -124,9 +124,9 @@ public final class UnaryOperationTranslator extends OperationTranslator {
@NotNull
private JsExpression propertyReassignment(@NotNull JsExpression toCallMethodUpon) {
JetExpression jetBaseExpression = getBaseExpression();
- PropertyAccessTranslator propertyAccessTranslator = Translation.propertyAccessTranslator(context());
- JsInvocation setterCall = propertyAccessTranslator.translateAsPropertySetterCall(jetBaseExpression);
- assert propertyAccessTranslator.canBePropertyGetterCall(jetBaseExpression) : "Should be a getter call";
+ JsInvocation setterCall =
+ PropertyAccessTranslator.translateAsPropertySetterCall(jetBaseExpression, context());
+ assert PropertyAccessTranslator.canBePropertyGetterCall(jetBaseExpression, context()) : "Should be a getter call";
JsExpression overloadedMethodCallOnPropertyGetter = operationExpression(toCallMethodUpon);
setterCall.setArguments(overloadedMethodCallOnPropertyGetter);
return setterCall;
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
index c5bb53a7f85..ee26e452d96 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
@@ -10,7 +10,6 @@ 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.psi.JetDotQualifiedExpression;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetQualifiedExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
@@ -18,152 +17,189 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
+import org.jetbrains.k2js.translate.utils.PsiUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
/**
* @author Talanov Pavel
*/
-//TODO ask for code review. Class has messy code.
+//TODO Refactor.
public final class PropertyAccessTranslator extends AbstractTranslator {
private static String MESSAGE = "Cannot be accessor call. Use canBeProperty*Call to ensure this method " +
"can be called safely.";
@NotNull
- public static PropertyAccessTranslator newInstance(@NotNull TranslationContext context) {
- return new PropertyAccessTranslator(context);
- }
-
- private PropertyAccessTranslator(@NotNull TranslationContext context) {
- super(context);
- }
-
-
- //TODO: ask if these methods can be more clear
- public boolean canBePropertyGetterCall(@NotNull JetExpression expression) {
- if (expression instanceof JetQualifiedExpression) {
- JetSimpleNameExpression selector = getNullableSelector((JetQualifiedExpression) expression);
- if (selector == null) {
- return false;
- }
- return (getNullableGetterName(selector) != null);
- }
- if (expression instanceof JetSimpleNameExpression) {
- return (getNullableGetterName((JetSimpleNameExpression) expression) != null);
- }
- return false;
- }
-
- public boolean canBePropertyAccess(@NotNull JetExpression expression) {
- return canBePropertyGetterCall(expression);
- }
-
- //TODO: delete?
- public boolean canBePropertySetterCall(@NotNull JetExpression expression) {
- if (expression instanceof JetQualifiedExpression) {
- JetSimpleNameExpression selector = getNullableSelector((JetQualifiedExpression) expression);
- if (selector == null) {
- return false;
- }
- return (getNullableSetterName(selector) != null);
- }
- if (expression instanceof JetSimpleNameExpression) {
- return (getNullableSetterName((JetSimpleNameExpression) expression) != null);
- }
- return false;
+ public static JsInvocation translateAsPropertySetterCall(@NotNull JetQualifiedExpression expression,
+ @NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context))
+ .translateAsPropertySetterCall();
}
@NotNull
- public JsInvocation translateAsPropertyGetterCall(@NotNull JetExpression expression) {
+ public static JsInvocation translateAsPropertySetterCall(@NotNull JetSimpleNameExpression expression,
+ @NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context))
+ .translateAsPropertySetterCall();
+ }
+
+ @NotNull
+ public static JsInvocation translateAsPropertySetterCall(@NotNull JetExpression expression,
+ @NotNull TranslationContext context) {
if (expression instanceof JetQualifiedExpression) {
- return resolveAsPropertyGet((JetQualifiedExpression) expression);
+ return translateAsPropertySetterCall((JetQualifiedExpression) expression, context);
}
if (expression instanceof JetSimpleNameExpression) {
- return resolveAsPropertyGet((JetSimpleNameExpression) expression);
+ return translateAsPropertySetterCall((JetSimpleNameExpression) expression, context);
}
throw new AssertionError(MESSAGE);
}
@NotNull
- private JsInvocation resolveAsPropertyGet(@NotNull JetQualifiedExpression expression) {
- JsName getterName = getNotNullGetterName(getNotNullSelector(expression));
- return translateReceiverAndReturnAccessorInvocation(expression, getterName);
+ public static JsInvocation translateAsPropertyGetterCall(@NotNull JetQualifiedExpression expression,
+ @NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context))
+ .translateAsPropertyGetterCall();
}
@NotNull
- private JsInvocation resolveAsPropertyGet(@NotNull JetSimpleNameExpression expression) {
- JsName getterName = getNotNullGetterName(expression);
- JsNameRef getterReference = getAccessorReference(getterName);
- return AstUtil.newInvocation(getterReference);
+ public static JsInvocation translateAsPropertyGetterCall(@NotNull JetSimpleNameExpression expression,
+ @NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context))
+ .translateAsPropertyGetterCall();
}
@NotNull
- private JsNameRef getAccessorReference(@NotNull JsName getterName) {
- return TranslationUtils.getThisQualifiedNameReference(context(), getterName);
- }
-
- @NotNull
- public JsInvocation translateAsPropertySetterCall(@NotNull JetExpression expression) {
- if (expression instanceof JetDotQualifiedExpression) {
- return resolveAsPropertySet((JetDotQualifiedExpression) expression);
+ public static JsInvocation translateAsPropertyGetterCall(@NotNull JetExpression expression,
+ @NotNull TranslationContext context) {
+ if (expression instanceof JetQualifiedExpression) {
+ return translateAsPropertyGetterCall((JetQualifiedExpression) expression, context);
}
if (expression instanceof JetSimpleNameExpression) {
- return resolveAsPropertySet((JetSimpleNameExpression) expression);
+ return translateAsPropertyGetterCall((JetSimpleNameExpression) expression, context);
}
throw new AssertionError(MESSAGE);
}
- @NotNull
- private JsInvocation resolveAsPropertySet(@NotNull JetDotQualifiedExpression dotQualifiedExpression) {
- JsName setterName = getNotNullSetterName(getNotNullSelector(dotQualifiedExpression));
- return translateReceiverAndReturnAccessorInvocation(dotQualifiedExpression, setterName);
+ public static boolean canBePropertyGetterCall(@NotNull JetQualifiedExpression expression,
+ @NotNull TranslationContext context) {
+ JetSimpleNameExpression selector = PsiUtils.getSelectorAsSimpleName(expression);
+ if (selector == null) {
+ return false;
+ }
+ return canBePropertyGetterCall(selector, context);
}
- @NotNull
- private JsInvocation resolveAsPropertySet(@NotNull JetSimpleNameExpression expression) {
- JsName setterName = getNotNullSetterName(expression);
- JsNameRef setterReference = getAccessorReference(setterName);
- return AstUtil.newInvocation(setterReference);
+ public static boolean canBePropertyGetterCall(@NotNull JetSimpleNameExpression expression,
+ @NotNull TranslationContext context) {
+ return (BindingUtils.getPropertyDescriptorForSimpleName(context.bindingContext(), expression) != null);
}
- @NotNull
- private JsInvocation translateReceiverAndReturnAccessorInvocation
- (@NotNull JetQualifiedExpression qualifiedExpression, @NotNull JsName accessorName) {
- JsExpression qualifier = Translation.translateAsExpression
- (qualifiedExpression.getReceiverExpression(), context());
- JsNameRef result = accessorName.makeRef();
- AstUtil.setQualifier(result, qualifier);
- return AstUtil.newInvocation(result);
+ public static boolean canBePropertyGetterCall(@NotNull JetExpression expression,
+ @NotNull TranslationContext context) {
+ if (expression instanceof JetQualifiedExpression) {
+ return canBePropertyGetterCall((JetQualifiedExpression) expression, context);
+ }
+ if (expression instanceof JetSimpleNameExpression) {
+ return canBePropertyGetterCall((JetSimpleNameExpression) expression, context);
+ }
+ return false;
}
+ public static boolean canBePropertyAccess(@NotNull JetExpression expression,
+ @NotNull TranslationContext context) {
+ return canBePropertyGetterCall(expression, context);
+ }
+
+
+ @NotNull
+ private final JetSimpleNameExpression expression;
@Nullable
- private JetSimpleNameExpression getNullableSelector(@NotNull JetQualifiedExpression expression) {
- JetExpression selectorExpression = expression.getSelectorExpression();
- assert selectorExpression != null : "Selector should not be null.";
- if (!(selectorExpression instanceof JetSimpleNameExpression)) {
- return null;
+ private final JetExpression qualifier;
+ @NotNull
+ private final PropertyDescriptor propertyDescriptor;
+
+ private PropertyAccessTranslator(@NotNull JetSimpleNameExpression simpleName,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = simpleName;
+ this.qualifier = null;
+ this.propertyDescriptor = getNotNullPropertyDescriptor();
+ }
+
+ private PropertyAccessTranslator(@NotNull JetQualifiedExpression qualifiedExpression,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = getNotNullSelector(qualifiedExpression);
+ this.qualifier = qualifiedExpression.getReceiverExpression();
+ this.propertyDescriptor = getNotNullPropertyDescriptor();
+ }
+
+ @NotNull
+ public JsInvocation translateAsPropertyGetterCall() {
+ JsName getterName = getNotNullGetterName();
+ return qualifiedAccessorInvocation(getterName);
+ }
+
+ @NotNull
+ private JsInvocation qualifiedAccessorInvocation(@NotNull JsName accessorName) {
+ JsNameRef accessorReference = accessorName.makeRef();
+ AstUtil.setQualifier(accessorReference, translateQualifier());
+ return AstUtil.newInvocation(accessorReference);
+ }
+
+ @NotNull
+ private JsExpression defaultQualifier() {
+ if (BindingUtils.isOwnedByClass(propertyDescriptor)) {
+ return TranslationUtils.getThisQualifier(context());
}
- return (JetSimpleNameExpression) selectorExpression;
+ assert BindingUtils.isOwnedByNamespace(propertyDescriptor)
+ : "Property can be a member of class or a namespace.";
+ //NOTE: qualifier for descriptor and it's accessor should be equal
+ return context().declarations().getQualifier(propertyDescriptor);
+ }
+
+ @NotNull
+ public JsInvocation translateAsPropertySetterCall() {
+ JsName setterName = getNotNullSetterName();
+ return qualifiedAccessorInvocation(setterName);
+ }
+
+ @NotNull
+ private JsExpression translateQualifier() {
+ if (qualifier != null) {
+ return Translation.translateAsExpression(qualifier, context());
+ }
+ return defaultQualifier();
}
@NotNull
- private JetSimpleNameExpression getNotNullSelector(@NotNull JetQualifiedExpression expression) {
- JetSimpleNameExpression selectorExpression = getNullableSelector(expression);
+ private static JetSimpleNameExpression getNotNullSelector(@NotNull JetQualifiedExpression qualifiedExpression) {
+ JetSimpleNameExpression selectorExpression = PsiUtils.getSelectorAsSimpleName(qualifiedExpression);
assert selectorExpression != null : MESSAGE;
return selectorExpression;
}
@NotNull
- private JsName getNotNullGetterName(@NotNull JetSimpleNameExpression selectorExpression) {
- JsName getterName = getNullableGetterName(selectorExpression);
+ private JsName getNotNullGetterName() {
+ JsName getterName = getNullableGetterName();
assert getterName != null : MESSAGE;
return getterName;
}
@Nullable
- private JsName getNullableGetterName(@NotNull JetSimpleNameExpression expression) {
- PropertyDescriptor property = getPropertyDescriptor(expression);
+ private JsName getNullableGetterName() {
+ PropertyGetterDescriptor getter = getGetterDescriptor();
+
+ if (getter == null) return null;
+
+ return context().getNameForDescriptor(getter);
+ }
+
+ @Nullable
+ private PropertyGetterDescriptor getGetterDescriptor() {
+ PropertyDescriptor property = getNullablePropertyDescriptor();
if (property == null) {
return null;
}
@@ -171,19 +207,19 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
if (getter == null) {
return null;
}
- return context().getNameForDescriptor(getter);
+ return getter;
}
@NotNull
- private JsName getNotNullSetterName(@NotNull JetSimpleNameExpression selectorExpression) {
- JsName setterName = getNullableSetterName(selectorExpression);
+ private JsName getNotNullSetterName() {
+ JsName setterName = getNullableSetterName();
assert setterName != null : MESSAGE;
return setterName;
}
@Nullable
- private JsName getNullableSetterName(@NotNull JetSimpleNameExpression expression) {
- PropertyDescriptor property = getPropertyDescriptor(expression);
+ private JsName getNullableSetterName() {
+ PropertyDescriptor property = getNullablePropertyDescriptor();
if (property == null) {
return null;
}
@@ -195,7 +231,14 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
}
@Nullable
- private PropertyDescriptor getPropertyDescriptor(@NotNull JetSimpleNameExpression expression) {
+ private PropertyDescriptor getNullablePropertyDescriptor() {
return BindingUtils.getPropertyDescriptorForSimpleName(context().bindingContext(), expression);
}
+
+ @NotNull
+ private PropertyDescriptor getNotNullPropertyDescriptor() {
+ PropertyDescriptor propertyDescriptor = getNullablePropertyDescriptor();
+ assert propertyDescriptor != null;
+ return propertyDescriptor;
+ }
}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
index eae80039278..007be8dbf50 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
@@ -8,7 +8,6 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
-import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
@@ -38,9 +37,9 @@ public class ReferenceTranslator extends AbstractTranslator {
@NotNull
public JsExpression translateSimpleName() {
+ tryResolveAsPropertyAccess();
tryResolveAsThisQualifiedExpression();
tryResolveAsAliasReference();
- tryResolveAsPropertyAccess();
tryResolveAsGlobalReference();
tryResolveAsLocalReference();
if (result != null) {
@@ -62,7 +61,12 @@ public class ReferenceTranslator extends AbstractTranslator {
if (!requiresThisQualifier(simpleName, referencedName)) return;
- result = TranslationUtils.getThisQualifiedNameReference(context(), referencedName);
+ if (BindingUtils.isOwnedByClass(referencedDescriptor)) {
+ result = TranslationUtils.getThisQualifiedNameReference(context(), referencedName);
+ }
+ if (BindingUtils.isOwnedByNamespace(referencedDescriptor)) {
+ result = TranslationUtils.getQualifiedReference(context(), referencedDescriptor);
+ }
}
private boolean requiresThisQualifier(@NotNull JetSimpleNameExpression expression,
@@ -94,11 +98,9 @@ public class ReferenceTranslator extends AbstractTranslator {
private void tryResolveAsPropertyAccess() {
if (alreadyResolved()) return;
- PropertyAccessTranslator propertyAccessTranslator = Translation.propertyAccessTranslator(context());
+ if (!PropertyAccessTranslator.canBePropertyGetterCall(simpleName, context())) return;
- if (!propertyAccessTranslator.canBePropertyGetterCall(simpleName)) return;
-
- result = propertyAccessTranslator.translateAsPropertyGetterCall(simpleName);
+ result = PropertyAccessTranslator.translateAsPropertyGetterCall(simpleName, context());
}
private void tryResolveAsGlobalReference() {
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
index 11234847a9d..5558eb50d6f 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
@@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
+import org.jetbrains.jet.lang.types.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType;
import java.util.ArrayList;
@@ -88,6 +89,7 @@ public final class BindingUtils {
return (JetClass) result;
}
+ //TODO: delete?
@Nullable
static public JetDeclaration getDeclarationForDescriptor(@NotNull BindingContext context,
@NotNull DeclarationDescriptor descriptor) {
@@ -174,9 +176,8 @@ public final class BindingUtils {
return context.get(BindingContext.REFERENCE_TARGET, reference);
}
- //TODO better implementation?
static private boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) {
- return !superClassDescriptor.getName().equals("Any");
+ return !superClassDescriptor.equals(JetStandardClasses.getAny());
}
//TODO move unrelated utils to other class
@@ -190,8 +191,16 @@ public final class BindingUtils {
return null;
}
+ static public boolean isOwnedByNamespace(@NotNull DeclarationDescriptor descriptor) {
+ return (descriptor.getContainingDeclaration() instanceof NamespaceDescriptor);
+ }
- //TODO: refactor
+ static public boolean isOwnedByClass(@NotNull DeclarationDescriptor descriptor) {
+ return (descriptor.getContainingDeclaration() instanceof ClassDescriptor);
+ }
+
+
+ //TODO: refactor, check with getDescriptorForReferenceExpression
@Nullable
public static PropertyDescriptor getPropertyDescriptorForSimpleName(@NotNull BindingContext context,
@NotNull JetSimpleNameExpression expression) {
@@ -224,4 +233,5 @@ public final class BindingUtils {
assert result != null;
return result;
}
+
}
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java
new file mode 100644
index 00000000000..9ad024de66f
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java
@@ -0,0 +1,26 @@
+package org.jetbrains.k2js.translate.utils;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.psi.JetExpression;
+import org.jetbrains.jet.lang.psi.JetQualifiedExpression;
+import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class PsiUtils {
+
+ private PsiUtils() {
+ }
+
+ @Nullable
+ public static JetSimpleNameExpression getSelectorAsSimpleName(@NotNull JetQualifiedExpression expression) {
+ JetExpression selectorExpression = expression.getSelectorExpression();
+ assert selectorExpression != null : "Selector should not be null.";
+ if (!(selectorExpression instanceof JetSimpleNameExpression)) {
+ return null;
+ }
+ return (JetSimpleNameExpression) selectorExpression;
+ }
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java
index 3517fb889e4..382bbf25990 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java
@@ -152,14 +152,13 @@ public final class TranslationUtils {
public static JsNameRef getThisQualifiedNameReference(@NotNull TranslationContext context,
@NotNull JsName name) {
JsExpression qualifier = getThisQualifier(context);
-
JsNameRef reference = name.makeRef();
AstUtil.setQualifier(reference, qualifier);
return reference;
}
@NotNull
- private static JsExpression getThisQualifier(@NotNull TranslationContext context) {
+ public static JsExpression getThisQualifier(@NotNull TranslationContext context) {
JsExpression qualifier;
if (context.aliaser().hasAliasForThis()) {
qualifier = context.aliaser().getAliasForThis();