diff --git a/.idea/workspace.xml b/.idea/workspace.xml index bbca007f954..12c0556fd90 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,11 @@ - + + + @@ -201,27 +203,9 @@ - + - - - - - - - - - - - - - - - - - - @@ -234,16 +218,34 @@ - + - + + + + + + + + + + + + + + + + + + + - + @@ -258,7 +260,7 @@ - + @@ -318,10 +320,10 @@ - + - + @@ -377,17 +379,19 @@ - + - - + + - - + + + + @@ -424,10 +428,10 @@ @@ -1195,7 +1199,7 @@ - + @@ -1238,7 +1242,7 @@ @@ -1285,57 +1289,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1364,9 +1317,9 @@ - + - + @@ -1378,29 +1331,80 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 5cf22bf19fa..76526c24dae 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -55,7 +55,7 @@ public final class CallTranslator extends AbstractTranslator { @NotNull TranslationContext context) { DeclarationDescriptor descriptor = getFunctionDescriptorForCallExpression(context.bindingContext(), callExpression); - JsExpression receiver = ReferenceTranslator.getImplicitReceiver(descriptor, context); + JsExpression receiver = getImplicitReceiver(context, descriptor); List arguments = translateArgumentList(context, callExpression.getValueArguments()); return (new CallTranslator(receiver, arguments, (FunctionDescriptor) descriptor, context)).translate(); } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java index 8dc2386237b..47a4b0aea9a 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java @@ -21,6 +21,7 @@ import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForRe import static org.jetbrains.k2js.translate.utils.PsiUtils.getSelectorAsSimpleName; import static org.jetbrains.k2js.translate.utils.PsiUtils.isBackingFieldReference; import static org.jetbrains.k2js.translate.utils.TranslationUtils.backingFieldReference; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.getImplicitReceiver; /** * @author Talanov Pavel @@ -196,7 +197,7 @@ public final class PropertyAccessTranslator extends AccessTranslator { if (qualifier != null) { return Translation.translateAsExpression(qualifier, context()); } - JsExpression implicitReceiver = ReferenceTranslator.getImplicitReceiver(propertyDescriptor, context()); + JsExpression implicitReceiver = getImplicitReceiver(context(), propertyDescriptor); assert implicitReceiver != null : "Property can only be a member of class or a namespace."; return implicitReceiver; } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 25bcbbc3560..b278ce4a7f4 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -9,30 +9,15 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; -import org.jetbrains.k2js.translate.utils.BindingUtils; -import org.jetbrains.k2js.translate.utils.TranslationUtils; import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.getImplicitReceiver; /** * @author Talanov Pavel */ public class ReferenceTranslator extends AbstractTranslator { - // TODO: move to other util - @Nullable - public static JsExpression getImplicitReceiver(@NotNull DeclarationDescriptor referencedDescriptor, - @NotNull TranslationContext context) { - if (!context.isDeclared(referencedDescriptor)) return null; - - if (BindingUtils.isOwnedByClass(referencedDescriptor)) { - return TranslationUtils.getThisQualifier(context); - } - if (!BindingUtils.isOwnedByNamespace(referencedDescriptor)) return null; - - return context.declarations().getQualifier(referencedDescriptor); - } - @NotNull public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { @@ -41,25 +26,30 @@ public class ReferenceTranslator extends AbstractTranslator { } DeclarationDescriptor referencedDescriptor = getDescriptorForReferenceExpression(context.bindingContext(), expression); - return (new ReferenceTranslator(referencedDescriptor, context)).translate(); + return (new ReferenceTranslator(referencedDescriptor, true, context)).translate(); } @NotNull public static JsExpression translateReference(@NotNull DeclarationDescriptor referencedDescriptor, @NotNull TranslationContext context) { - return (new ReferenceTranslator(referencedDescriptor, context)).translate(); + return (new ReferenceTranslator(referencedDescriptor, false, context)).translate(); } @NotNull private final DeclarationDescriptor referencedDescriptor; + private final boolean shouldQualify; + @Nullable private JsExpression result; - private ReferenceTranslator(@NotNull DeclarationDescriptor referencedDescriptor, @NotNull TranslationContext context) { + private ReferenceTranslator(@NotNull DeclarationDescriptor referencedDescriptor, + boolean shouldQualify, + @NotNull TranslationContext context) { super(context); this.referencedDescriptor = referencedDescriptor; this.result = null; + this.shouldQualify = shouldQualify; } @NotNull @@ -87,16 +77,12 @@ public class ReferenceTranslator extends AbstractTranslator { if (!context().isDeclared(referencedDescriptor)) return; JsName referencedName = context().getNameForDescriptor(referencedDescriptor); - JsExpression implicitReceiver = getImplicitReceiver(referencedDescriptor, context()); + JsExpression implicitReceiver = getImplicitReceiver(context(), referencedDescriptor); - generateReference(referencedName, implicitReceiver); - } - - private void generateReference(@NotNull JsName referencedName, @Nullable JsExpression implicitReceiver) { - if (implicitReceiver != null) { + if (shouldQualify && implicitReceiver != null) { result = AstUtil.qualified(referencedName, implicitReceiver); } else { - result = context().getNameForDescriptor(referencedDescriptor).makeRef(); + result = referencedName.makeRef(); } } diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 2773d3f8116..60382849dcb 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -220,5 +220,4 @@ public final class TranslationUtils { return context.declarations().getQualifier(referencedDescriptor); } - }