diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c6634cc28f4..9d54a5c9573 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -8,38 +8,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - + + - + + @@ -110,20 +89,7 @@ @@ -193,94 +159,98 @@ - + - - + + - + + + + + + + + + + + + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - + @@ -293,34 +263,36 @@ - + - - + + - + + + + + + + + + + + + - - + + - - - - - - - - - - + @@ -329,7 +301,16 @@ - + + + + + + + + + + @@ -337,46 +318,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + + + + + + + + + + + + + + + + @@ -405,22 +375,22 @@ @@ -510,6 +480,21 @@ + + + + + + + + + + + @@ -542,6 +527,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -708,17 +679,7 @@ - - - - - - - - - - @@ -831,9 +767,9 @@ - - + + @@ -852,49 +788,20 @@ - - - - - - - - - - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -938,19 +909,19 @@ - + - + - - - - - - - - - - - @@ -1058,6 +999,17 @@ + + + + + + @@ -1084,23 +1036,37 @@ - - - - - + + + + + + + + + + - - - - - - + + + + + + + localhost @@ -1155,7 +1121,7 @@ - + @@ -1173,8 +1139,8 @@ - - + + @@ -1218,7 +1184,7 @@ @@ -1265,13 +1231,110 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1279,104 +1342,9 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java b/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java index b4de4eb32a3..9735837ce7b 100644 --- a/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java +++ b/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java @@ -74,7 +74,9 @@ public final class DeclarationVisitor extends DeclarationDescriptorVisitor { @NotNull public JsNode visitSimpleNameExpression(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { - return Translation.referenceTranslator(context).translateSimpleName(expression); + return ReferenceTranslator.translateSimpleName(expression, context); } diff --git a/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java index 5c7bf37ecf7..84e7b4d4c5a 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java @@ -98,7 +98,8 @@ public final class PatternTranslator extends AbstractTranslator { (context().bindingContext(), typeReference); //TODO should reference class by full name here JsName className = context().getNameForDescriptor(referencedClass); - return context().getNamespaceQualifiedReference(className); + assert TranslationUtils.hasQualifier(context(), referencedClass); + return TranslationUtils.getQualifiedReference(context(), referencedClass); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/general/Translation.java b/translator/src/org/jetbrains/k2js/translate/general/Translation.java index 6b498adacc3..a57dfa0319b 100644 --- a/translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -18,7 +18,6 @@ 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.reference.ReferenceTranslator; import org.jetbrains.k2js.translate.utils.BindingUtils; /** @@ -57,10 +56,10 @@ public final class Translation { return PatternTranslator.newInstance(context); } - @NotNull - static public ReferenceTranslator referenceTranslator(@NotNull TranslationContext context) { - return ReferenceTranslator.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) { diff --git a/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java index 7364219dc39..0acf98a3061 100644 --- a/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java @@ -1,13 +1,10 @@ package org.jetbrains.k2js.translate.general; import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.backend.js.ast.JsNameRef; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.google.dart.compiler.backend.js.ast.JsScope; -import com.google.dart.compiler.util.AstUtil; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -45,7 +42,7 @@ public final class TranslationContext { Namer namer = Namer.newInstance(rootScope); Aliaser aliaser = Aliaser.aliasesForStandardClasses (JetStandardLibrary.getJetStandardLibrary(project), namer); - return new TranslationContext(null, program, bindingContext, + return new TranslationContext(program, bindingContext, scopes, extractor, aliaser, namer); } @@ -55,8 +52,6 @@ public final class TranslationContext { private final BindingContext bindingContext; @NotNull private final Scopes scopes; - @Nullable - private final JsName namespaceName; @NotNull private final Declarations declarations; @NotNull @@ -65,13 +60,12 @@ public final class TranslationContext { private final Namer namer; - private TranslationContext(@Nullable JsName namespaceName, @NotNull JsProgram program, + private TranslationContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, @NotNull Scopes scopes, @NotNull Declarations declarations, @NotNull Aliaser aliaser, @NotNull Namer namer) { this.program = program; this.bindingContext = bindingContext; - this.namespaceName = namespaceName; this.scopes = scopes; this.declarations = declarations; this.aliaser = aliaser; @@ -86,9 +80,8 @@ public final class TranslationContext { @NotNull public TranslationContext newNamespace(@NotNull NamespaceDescriptor descriptor) { JsScope namespaceScope = declarations.getScope(descriptor); - JsName namespaceName = getNameForDescriptor(descriptor); Scopes newScopes = new Scopes(namespaceScope, namespaceScope, namespaceScope); - return new TranslationContext(namespaceName, program, bindingContext, newScopes, + return new TranslationContext(program, bindingContext, newScopes, declarations, aliaser, namer); } @@ -101,7 +94,7 @@ public final class TranslationContext { public TranslationContext newClass(@NotNull ClassDescriptor descriptor) { JsScope classScope = declarations.getScope(descriptor); Scopes newScopes = new Scopes(classScope, classScope, scopes.namespaceScope); - return new TranslationContext(namespaceName, program, bindingContext, + return new TranslationContext(program, bindingContext, newScopes, declarations, aliaser, namer); } @@ -124,7 +117,7 @@ public final class TranslationContext { public TranslationContext newFunctionDeclaration(@NotNull FunctionDescriptor descriptor) { JsScope functionScope = declarations.getScope(descriptor); Scopes newScopes = new Scopes(functionScope, scopes.classScope, scopes.namespaceScope); - return new TranslationContext(namespaceName, program, bindingContext, + return new TranslationContext(program, bindingContext, newScopes, declarations, aliaser, namer); } @@ -132,20 +125,10 @@ public final class TranslationContext { @NotNull public TranslationContext newEnclosingScope(@NotNull JsScope enclosingScope) { Scopes newScopes = new Scopes(enclosingScope, scopes.classScope, scopes.namespaceScope); - return new TranslationContext(namespaceName, program, bindingContext, + return new TranslationContext(program, bindingContext, newScopes, declarations, aliaser, namer); } - - //TODO: move to namer - @NotNull - public JsNameRef getNamespaceQualifiedReference(@NotNull JsName name) { - if (namespaceName != null) { - return AstUtil.newNameRef(namespaceName.makeRef(), name); - } - return new JsNameRef(name); - } - @NotNull public BindingContext bindingContext() { return bindingContext; @@ -202,7 +185,7 @@ public final class TranslationContext { } public boolean isDeclared(@NotNull DeclarationDescriptor descriptor) { - return declarations.isDeclared(descriptor); + return declarations.hasDeclaredName(descriptor); } @NotNull @@ -214,4 +197,9 @@ public final class TranslationContext { public Namer namer() { return namer; } + + @NotNull + public Declarations declarations() { + return declarations; + } } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java index c46f2b191f4..c5bb53a7f85 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java @@ -18,6 +18,7 @@ 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; /** * @author Talanov Pavel @@ -57,6 +58,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator { return canBePropertyGetterCall(expression); } + //TODO: delete? public boolean canBePropertySetterCall(@NotNull JetExpression expression) { if (expression instanceof JetQualifiedExpression) { JetSimpleNameExpression selector = getNullableSelector((JetQualifiedExpression) expression); @@ -91,10 +93,15 @@ public final class PropertyAccessTranslator extends AbstractTranslator { @NotNull private JsInvocation resolveAsPropertyGet(@NotNull JetSimpleNameExpression expression) { JsName getterName = getNotNullGetterName(expression); - JsNameRef getterReference = ReferenceProvider.getReference(getterName, context(), expression); + JsNameRef getterReference = getAccessorReference(getterName); return AstUtil.newInvocation(getterReference); } + @NotNull + private JsNameRef getAccessorReference(@NotNull JsName getterName) { + return TranslationUtils.getThisQualifiedNameReference(context(), getterName); + } + @NotNull public JsInvocation translateAsPropertySetterCall(@NotNull JetExpression expression) { if (expression instanceof JetDotQualifiedExpression) { @@ -115,7 +122,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator { @NotNull private JsInvocation resolveAsPropertySet(@NotNull JetSimpleNameExpression expression) { JsName setterName = getNotNullSetterName(expression); - JsNameRef setterReference = ReferenceProvider.getReference(setterName, context(), expression); + JsNameRef setterReference = getAccessorReference(setterName); return AstUtil.newInvocation(setterReference); } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java deleted file mode 100644 index 95a07c78e62..00000000000 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.jetbrains.k2js.translate.reference; - -import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.backend.js.ast.JsNameRef; -import com.google.dart.compiler.util.AstUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; -import org.jetbrains.jet.lexer.JetTokens; -import org.jetbrains.k2js.translate.general.TranslationContext; - -/** - * @author Talanov Pavel - */ -public final class ReferenceProvider { - - @NotNull - private final TranslationContext context; - @NotNull - private final JsName referencedName; - private boolean isBackingFieldAccess; - private boolean requiresThisQualifier; - private boolean requiresNamespaceQualifier; - - public static JsNameRef getReference(@NotNull JsName referencedName, @NotNull TranslationContext context, - boolean isBackingFieldAccess) { - return (new ReferenceProvider(referencedName, context, isBackingFieldAccess)).generateCorrectReference(); - } - - - public static JsNameRef getReference(@NotNull JsName referencedName, @NotNull TranslationContext context, - JetSimpleNameExpression expression) { - boolean isBackingFieldAccess = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER; - return (new ReferenceProvider(referencedName, context, isBackingFieldAccess)) - .generateCorrectReference(); - } - - private ReferenceProvider(@NotNull JsName referencedName, @NotNull TranslationContext context, - boolean isBackingFieldAccess) { - this.context = context; - this.referencedName = referencedName; - this.isBackingFieldAccess = isBackingFieldAccess; - this.requiresThisQualifier = requiresThisQualifier(); - this.requiresNamespaceQualifier = requiresNamespaceQualifier(); - } - - @NotNull - public JsNameRef generateCorrectReference() { - if (requiresNamespaceQualifier) { - return context.getNamespaceQualifiedReference(referencedName); - } else if (requiresThisQualifier) { - return thisQualifiedReference(); - } - return referencedName.makeRef(); - } - - private JsNameRef thisQualifiedReference() { - if (!context.aliaser().hasAliasForThis()) { - return AstUtil.thisQualifiedReference(referencedName); - } - JsNameRef reference = referencedName.makeRef(); - AstUtil.setQualifier(reference, context.aliaser().getAliasForThis()); - return reference; - } - - private boolean requiresNamespaceQualifier() { - return context.namespaceScope().ownsName(referencedName); - } - - private boolean requiresThisQualifier() { - JsName name = context.enclosingScope().findExistingName(referencedName.getIdent()); - boolean isClassMember = context.classScope().ownsName(name); - return isClassMember || isBackingFieldAccess; - } -} diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index d22810ed8b7..eae80039278 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -1,13 +1,12 @@ package org.jetbrains.k2js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsInvocation; import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.backend.js.ast.JsNameRef; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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; @@ -17,84 +16,119 @@ import org.jetbrains.k2js.translate.utils.TranslationUtils; /** * @author Talanov Pavel */ -//TODO: implement state public class ReferenceTranslator extends AbstractTranslator { @NotNull - static public ReferenceTranslator newInstance(@NotNull TranslationContext context) { - return new ReferenceTranslator(context); - } + private final JetSimpleNameExpression simpleName; - private ReferenceTranslator(@NotNull TranslationContext context) { - super(context); - } + @Nullable + private JsExpression result; - // TODO: refactor put the checks inside resolvers @NotNull - public JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression) { - JsExpression result = resolveAsAliasReference(expression); - if (result != null) return result; - - result = resolveAsPropertyAccess(expression); - if (result != null) return result; - - result = resolveAsGlobalReference(expression); - if (result != null) return result; - - result = resolveAsLocalReference(expression); - if (result != null) return result; - - throw new AssertionError("Undefined name in this scope: " + expression.getReferencedName()); + public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, + @NotNull TranslationContext context) { + return (new ReferenceTranslator(expression, context)).translateSimpleName(); } - @Nullable - private JsNameRef resolveAsAliasReference(@NotNull JetSimpleNameExpression expression) { - //TODO: decide if this code is meaningful + private ReferenceTranslator(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { + super(context); + this.simpleName = expression; + this.result = null; + } + + @NotNull + public JsExpression translateSimpleName() { + tryResolveAsThisQualifiedExpression(); + tryResolveAsAliasReference(); + tryResolveAsPropertyAccess(); + tryResolveAsGlobalReference(); + tryResolveAsLocalReference(); + if (result != null) { + return result; + } + throw new AssertionError("Undefined name in this scope: " + simpleName.getReferencedName()); + } + + private void tryResolveAsThisQualifiedExpression() { + if (alreadyResolved()) return; + DeclarationDescriptor referencedDescriptor = - BindingUtils.getDescriptorForReferenceExpression(context().bindingContext(), expression); - if (referencedDescriptor == null) return null; + BindingUtils.getDescriptorForReferenceExpression(context().bindingContext(), simpleName); - if (!context().aliaser().hasAliasForDeclaration(referencedDescriptor)) { - return null; - } + if (referencedDescriptor == null) return; + if (!context().isDeclared(referencedDescriptor)) return; - return context().aliaser().getAliasForDeclaration(referencedDescriptor); - } - - @Nullable - private JsInvocation resolveAsPropertyAccess(@NotNull JetSimpleNameExpression expression) { - PropertyAccessTranslator propertyAccessTranslator = Translation.propertyAccessTranslator(context()); - if (propertyAccessTranslator.canBePropertyGetterCall(expression)) { - return propertyAccessTranslator.translateAsPropertyGetterCall(expression); - } - return null; - } - - @Nullable - private JsExpression resolveAsGlobalReference(@NotNull JetSimpleNameExpression expression) { - DeclarationDescriptor referencedDescriptor = - BindingUtils.getDescriptorForReferenceExpression(context().bindingContext(), expression); - if (referencedDescriptor == null) { - return null; - } - //TODO: think about the places where we should check for original descriptors - if (!context().isDeclared(referencedDescriptor)) { - return null; - } JsName referencedName = context().getNameForDescriptor(referencedDescriptor); - return ReferenceProvider.getReference(referencedName, context(), expression); + + if (!requiresThisQualifier(simpleName, referencedName)) return; + + result = TranslationUtils.getThisQualifiedNameReference(context(), referencedName); } - @Nullable - private JsExpression resolveAsLocalReference(@NotNull JetSimpleNameExpression expression) { - String name = expression.getReferencedName(); + private boolean requiresThisQualifier(@NotNull JetSimpleNameExpression expression, + @NotNull JsName referencedName) { + + JsName name = context().enclosingScope().findExistingName(referencedName.getIdent()); + boolean isClassMember = context().classScope().ownsName(name); + boolean isBackingFieldAccess = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER; + return (isBackingFieldAccess || isClassMember); + } + + private void tryResolveAsAliasReference() { + //TODO: decide if this code is meaningful + if (alreadyResolved()) return; + + DeclarationDescriptor referencedDescriptor = + BindingUtils.getDescriptorForReferenceExpression(context().bindingContext(), simpleName); + + if (referencedDescriptor == null) return; + if (!context().aliaser().hasAliasForDeclaration(referencedDescriptor)) return; + + result = context().aliaser().getAliasForDeclaration(referencedDescriptor); + } + + private boolean alreadyResolved() { + return result != null; + } + + private void tryResolveAsPropertyAccess() { + if (alreadyResolved()) return; + + PropertyAccessTranslator propertyAccessTranslator = Translation.propertyAccessTranslator(context()); + + if (!propertyAccessTranslator.canBePropertyGetterCall(simpleName)) return; + + result = propertyAccessTranslator.translateAsPropertyGetterCall(simpleName); + } + + private void tryResolveAsGlobalReference() { + if (alreadyResolved()) return; + + DeclarationDescriptor referencedDescriptor = + BindingUtils.getDescriptorForReferenceExpression(context().bindingContext(), simpleName); + + if (referencedDescriptor == null) return; + if (!context().isDeclared(referencedDescriptor)) return; + + result = TranslationUtils.getQualifiedReference(context(), referencedDescriptor); + } + + private void tryResolveAsLocalReference() { + if (alreadyResolved()) return; + + String name = getReferencedName(); + JsName localReferencedName = TranslationUtils.getLocalReferencedName(context(), name); + + if (localReferencedName == null) return; + + result = localReferencedName.makeRef(); + } + + @NotNull + private String getReferencedName() { + String name = simpleName.getReferencedName(); assert name != null : "SimpleNameExpression should reference a name"; - JsName localReferencedName = TranslationUtils.getLocalReferencedName - (context(), name); - if (localReferencedName == null) { - return null; - } - return localReferencedName.makeRef(); + return name; } } diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 0d0e86aa9b2..3517fb889e4 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.JetCallExpression; import org.jetbrains.jet.lang.psi.JetExpression; @@ -14,7 +15,6 @@ import org.jetbrains.jet.lang.psi.ValueArgument; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslationContext; -import org.jetbrains.k2js.translate.reference.ReferenceProvider; import java.util.ArrayList; import java.util.List; @@ -68,20 +68,14 @@ public final class TranslationUtils { static public JsNameRef backingFieldReference(@NotNull TranslationContext context, @NotNull JetProperty expression) { JsName backingFieldName = getBackingFieldName(getPropertyName(expression), context); - return generateReference(context, backingFieldName); + return getThisQualifiedNameReference(context, backingFieldName); } @NotNull static public JsNameRef backingFieldReference(@NotNull TranslationContext context, @NotNull PropertyDescriptor descriptor) { JsName backingFieldName = getBackingFieldName(descriptor.getName(), context); - return generateReference(context, backingFieldName); - } - - @NotNull - private static JsNameRef generateReference(@NotNull TranslationContext context, - @NotNull JsName backingFieldName) { - return ReferenceProvider.getReference(backingFieldName, context, true); + return getThisQualifiedNameReference(context, backingFieldName); } @NotNull @@ -130,4 +124,48 @@ public final class TranslationUtils { JsNameRef backingFieldReference = backingFieldReference(context, descriptor); return AstUtil.newAssignmentStatement(backingFieldReference, parameter.getName().makeRef()); } + + + public static boolean hasQualifier(@NotNull TranslationContext context, @NotNull DeclarationDescriptor descriptor) { + return context.declarations().hasQualifier(descriptor); + } + + @NotNull + public static JsNameRef getQualifiedReference(@NotNull TranslationContext context, + @NotNull DeclarationDescriptor descriptor) { + JsName name = context.declarations().getName(descriptor); + JsNameRef reference = name.makeRef(); + if (hasQualifier(context, descriptor)) { + JsNameRef qualifier = getQualifier(context, descriptor); + AstUtil.setQualifier(reference, qualifier); + } + return reference; + } + + @NotNull + private static JsNameRef getQualifier(@NotNull TranslationContext context, + @NotNull DeclarationDescriptor descriptor) { + return context.declarations().getQualifier(descriptor); + } + + @NotNull + 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) { + JsExpression qualifier; + if (context.aliaser().hasAliasForThis()) { + qualifier = context.aliaser().getAliasForThis(); + } else { + qualifier = new JsThisRef(); + } + return qualifier; + } }