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 @@ - - - - - - - - - - - - - - - - @@ -887,17 +883,17 @@ - + + + + + + + + + + + + + + + + + - - - - - - + + + + + + localhost @@ -1184,7 +1214,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();