From c68c0f8c89c8aada873bf9df23fd9f66d70283ec Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Mon, 23 Jan 2012 17:45:13 +0400 Subject: [PATCH] refactor access translator logic --- .idea/workspace.xml | 151 +++++++++--------- .../QualifiedExpressionTranslator.java | 22 ++- .../translate/reference/AccessTranslator.java | 7 +- .../reference/PropertyAccessTranslator.java | 42 +---- .../reference/ReferenceTranslator.java | 2 +- 5 files changed, 104 insertions(+), 120 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e814738a3bb..d633e24302b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -15,10 +15,11 @@ - - + + + @@ -154,7 +155,7 @@ - + @@ -1432,7 +1433,7 @@ - + @@ -1452,7 +1453,7 @@ - + @@ -1497,7 +1498,7 @@ @@ -1544,31 +1545,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1597,13 +1573,6 @@ - - - - - - - @@ -1611,13 +1580,6 @@ - - - - - - - @@ -1650,18 +1612,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java index fd3136a0e82..9c9b5f49da0 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/QualifiedExpressionTranslator.java @@ -6,8 +6,10 @@ 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.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.TranslationUtils.notNullCheck; @@ -20,6 +22,16 @@ public final class QualifiedExpressionTranslator { private QualifiedExpressionTranslator() { } + @NotNull + public static AccessTranslator getAccessTranslator(@NotNull JetQualifiedExpression expression, + @NotNull TranslationContext context) { + if (expression instanceof JetDotQualifiedExpression) { + JsExpression receiver = translateReceiver(expression, context); + return PropertyAccessTranslator.newInstance(PsiUtils.getSelectorAsSimpleName(expression), receiver, context); + } + throw new UnsupportedOperationException(); + } + @NotNull public static JsExpression translateSafeQualifiedExpression(@NotNull JetSafeQualifiedExpression expression, @NotNull TranslationContext context) { @@ -35,15 +47,15 @@ public final class QualifiedExpressionTranslator { @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); } + //TODO: problem with extension properties lies here JsExpression receiver = translateReceiver(expression, context); + if (PropertyAccessTranslator.canBePropertyGetterCall(expression, context)) { + return PropertyAccessTranslator.translateAsPropertyGetterCall + (PsiUtils.getSelectorAsSimpleName(expression), receiver, context); + } JsExpression selector = translateSelector(expression, context); return composeQualifiedExpression(receiver, selector); } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java index 2e3e43af23e..803ede6fc4b 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.expression.QualifiedExpressionTranslator; import org.jetbrains.k2js.translate.general.AbstractTranslator; /** @@ -16,8 +17,12 @@ public abstract class AccessTranslator extends AbstractTranslator { @NotNull TranslationContext context) { assert ((referenceExpression instanceof JetReferenceExpression) || (referenceExpression instanceof JetDotQualifiedExpression)); + //TODO: if (PropertyAccessTranslator.canBePropertyAccess(referenceExpression, context)) { - return PropertyAccessTranslator.newInstance(referenceExpression, context); + if (referenceExpression instanceof JetQualifiedExpression) { + return QualifiedExpressionTranslator.getAccessTranslator((JetQualifiedExpression) referenceExpression, context); + } + return PropertyAccessTranslator.newInstance((JetSimpleNameExpression) referenceExpression, null, context); } if (referenceExpression instanceof JetArrayAccessExpression) { return ArrayAccessTranslator.newInstance((JetArrayAccessExpression) referenceExpression, context); diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java index fd26d1a18b6..69ef377834b 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java @@ -12,7 +12,6 @@ import org.jetbrains.jet.lang.psi.JetQualifiedExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.k2js.translate.context.TranslationContext; -import org.jetbrains.k2js.translate.general.Translation; import java.util.Arrays; @@ -49,15 +48,9 @@ public final class PropertyAccessTranslator extends AccessTranslator { @NotNull public static JsExpression translateAsPropertyGetterCall(@NotNull JetSimpleNameExpression expression, + @Nullable JsExpression qualifier, @NotNull TranslationContext context) { - return (newInstance(expression, context)) - .translateAsGet(); - } - - @NotNull - public static JsExpression translateAsPropertyGetterCall(@NotNull JetQualifiedExpression expression, - @NotNull TranslationContext context) { - return (newInstance(expression, context)) + return (newInstance(expression, qualifier, context)) .translateAsGet(); } @@ -68,38 +61,15 @@ public final class PropertyAccessTranslator extends AccessTranslator { return new PropertyAccessTranslator(descriptor, null, false, resolvedCall, context); } - @NotNull - public static PropertyAccessTranslator newInstance(@NotNull JetQualifiedExpression expression, - @NotNull TranslationContext context) { - JetExpression qualifier = expression.getReceiverExpression(); - JetSimpleNameExpression selector = getNotNullSelector(expression); - ResolvedCall resolvedCall = getResolvedCall(context.bindingContext(), selector); - PropertyDescriptor propertyDescriptor = getPropertyDescriptor(selector, context); - boolean isBackingFieldAccess = isBackingFieldReference(selector); - JsExpression jsQualifier = Translation.translateAsExpression(qualifier, context); - return new PropertyAccessTranslator(propertyDescriptor, jsQualifier, - isBackingFieldAccess, resolvedCall, context); - } - @NotNull public static PropertyAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression, + @Nullable JsExpression qualifier, @NotNull TranslationContext context) { PropertyDescriptor propertyDescriptor = getPropertyDescriptor(expression, context); ResolvedCall resolvedCall = getResolvedCall(context.bindingContext(), expression); - return new PropertyAccessTranslator(propertyDescriptor, null, - isBackingFieldReference(expression), resolvedCall, context); - } - - @NotNull - public static PropertyAccessTranslator newInstance(@NotNull JetExpression expression, - @NotNull TranslationContext context) { - if (expression instanceof JetQualifiedExpression) { - return newInstance((JetQualifiedExpression) expression, context); - } - if (expression instanceof JetSimpleNameExpression) { - return newInstance((JetSimpleNameExpression) expression, context); - } - throw new AssertionError(MESSAGE); + boolean backingFieldAccess = isBackingFieldReference(expression); + return new PropertyAccessTranslator(propertyDescriptor, qualifier, + backingFieldAccess, resolvedCall, context); } public static boolean canBePropertyGetterCall(@NotNull JetQualifiedExpression expression, diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 571cd1a4592..d45b7b8d52d 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -21,7 +21,7 @@ public final class ReferenceTranslator { public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { if (PropertyAccessTranslator.canBePropertyAccess(expression, context)) { - return PropertyAccessTranslator.translateAsPropertyGetterCall(expression, context); + return PropertyAccessTranslator.translateAsPropertyGetterCall(expression, null, context); } DeclarationDescriptor referencedDescriptor = getDescriptorForReferenceExpression(context.bindingContext(), expression);