JS backend: improve and move getQualifiedReference function from TranslationUtils to TranslationContext and StaticContext.

(cherry picked from commit fa3db43)
This commit is contained in:
develar
2013-08-22 19:34:12 +04:00
committed by Zalim Bashorov
parent 3f0c1b2645
commit c27fb10f5a
9 changed files with 47 additions and 39 deletions
@@ -126,11 +126,6 @@ public final class StaticContext {
return ecmaVersion == EcmaVersion.v5;
}
@NotNull
public EcmaVersion getEcmaVersion() {
return ecmaVersion;
}
@NotNull
public JsProgram getProgram() {
return program;
@@ -171,6 +166,28 @@ public final class StaticContext {
return function;
}
@NotNull
public JsNameRef getQualifiedReference(@NotNull DeclarationDescriptor descriptor) {
ClassDescriptor classDescriptor;
if (descriptor instanceof ConstructorDescriptor) {
classDescriptor = ((ConstructorDescriptor) descriptor).getContainingDeclaration();
}
else if (descriptor instanceof ClassDescriptor) {
classDescriptor = (ClassDescriptor) descriptor;
}
else {
classDescriptor = null;
}
if (classDescriptor != null) {
JsNameRef reference = classDeclarationTranslator.getQualifiedReference((classDescriptor));
if (reference != null) {
return reference;
}
}
return new JsNameRef(getNameForDescriptor(descriptor), getQualifierForDescriptor(descriptor));
}
@NotNull
public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) {
JsName name = names.get(descriptor.getOriginal());
@@ -181,6 +181,11 @@ public class TranslationContext {
return program().getStringLiteral(named.getName().asString());
}
@NotNull
public JsNameRef getQualifiedReference(@NotNull DeclarationDescriptor descriptor) {
return staticContext.getQualifiedReference(descriptor);
}
@Nullable
public JsNameRef getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) {
return staticContext.getQualifierForDescriptor(descriptor);
@@ -50,7 +50,6 @@ import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptorForConstructorParameter;
import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getContainingClass;
import static org.jetbrains.k2js.translate.utils.PsiUtils.getPrimaryConstructorParameters;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.getQualifiedReference;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.simpleReturnFunction;
/**
@@ -164,7 +163,7 @@ public final class ClassTranslator extends AbstractTranslator {
});
}
else {
qualifiedReference = getQualifiedReference(declarationContext, descriptor);
qualifiedReference = declarationContext.getQualifiedReference(descriptor);
declarationContext.literalFunctionTranslator().setDefinitionPlace(
new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() {
@Override
@@ -305,7 +304,7 @@ public final class ClassTranslator extends AbstractTranslator {
}
// from library
return getQualifiedReference(context(), superClassDescriptor);
return context().getQualifiedReference(superClassDescriptor);
}
private void translatePropertiesAsConstructorParameters(@NotNull TranslationContext classDeclarationContext,
@@ -32,7 +32,6 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.*;
import static com.google.dart.compiler.backend.js.ast.JsVars.JsVar;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.getQualifiedReference;
public final class NamespaceDeclarationTranslator extends AbstractTranslator {
private final Iterable<JetFile> files;
@@ -114,7 +113,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator {
) {
if (context.isEcma5()) {
return Arrays.asList(initializer == null ? JsLiteral.NULL : initializer,
new JsDocComment(JsAstUtils.LENDS_JS_DOC_TAG, getQualifiedReference(context, descriptor)),
new JsDocComment(JsAstUtils.LENDS_JS_DOC_TAG, context.getQualifiedReference(descriptor)),
members);
}
else {
@@ -43,7 +43,6 @@ import static org.jetbrains.k2js.translate.expression.LiteralFunctionTranslator.
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForDelegate;
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.getQualifiedReference;
final class NamespaceTranslator extends AbstractTranslator {
@NotNull
@@ -73,7 +72,7 @@ final class NamespaceTranslator extends AbstractTranslator {
defineInvocation = createDefinitionPlace(null, descriptorToDefineInvocation);
}
return createPlace(getListFromPlace(defineInvocation), getQualifiedReference(context(), descriptor));
return createPlace(getListFromPlace(defineInvocation), context().getQualifiedReference(descriptor));
}
};
}
@@ -106,7 +105,7 @@ final class NamespaceTranslator extends AbstractTranslator {
initializer = visitor.initializer;
if (!context().isEcma5()) {
initializers.add(new JsInvocation(new JsNameRef("call", initializer),
getQualifiedReference(context(), descriptor)).makeStmt());
context().getQualifiedReference(descriptor)).makeStmt());
}
}
@@ -178,7 +177,10 @@ final class NamespaceTranslator extends AbstractTranslator {
@Override
public Void visitClass(@NotNull JetClass declaration, @NotNull TranslationContext context) {
result.add(context.classDeclarationTranslator().translate(declaration, context));
JsPropertyInitializer entry = context.classDeclarationTranslator().translate(declaration, context);
if (entry != null) {
result.add(entry);
}
return null;
}
@@ -23,13 +23,16 @@ 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.ClassDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetIsExpression;
import org.jetbrains.jet.lang.psi.JetTypeReference;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getTypeByReference;
import static org.jetbrains.k2js.translate.utils.JsAstUtils.*;
public final class PatternTranslator extends AbstractTranslator {
@@ -68,7 +71,7 @@ public final class PatternTranslator extends AbstractTranslator {
private JsExpression translateAsIsCheck(@NotNull JsExpression expressionToMatch,
@NotNull JetTypeReference typeReference) {
JsInvocation isCheck = new JsInvocation(context().namer().isOperationReference(),
expressionToMatch, getClassReference(typeReference));
expressionToMatch, getClassNameReference(typeReference));
if (isNullable(typeReference)) {
return addNullCheck(expressionToMatch, isCheck);
}
@@ -79,7 +82,7 @@ public final class PatternTranslator extends AbstractTranslator {
private JsExpression translateAsIntrinsicTypeCheck(@NotNull JsExpression expressionToMatch,
@NotNull JetTypeReference typeReference) {
JsExpression result = null;
JsName className = getClassReference(typeReference).getName();
JsName className = getClassNameReference(typeReference).getName();
if (className.getIdent().equals("String")) {
result = typeof(expressionToMatch, program().getStringLiteral("string"));
}
@@ -95,19 +98,14 @@ public final class PatternTranslator extends AbstractTranslator {
}
private boolean isNullable(JetTypeReference typeReference) {
return BindingUtils.getTypeByReference(bindingContext(), typeReference).isNullable();
return getTypeByReference(bindingContext(), typeReference).isNullable();
}
@NotNull
private JsNameRef getClassReference(@NotNull JetTypeReference typeReference) {
return getClassNameReferenceForTypeReference(typeReference);
}
@NotNull
private JsNameRef getClassNameReferenceForTypeReference(@NotNull JetTypeReference typeReference) {
private JsNameRef getClassNameReference(@NotNull JetTypeReference typeReference) {
ClassDescriptor referencedClass = BindingUtils.getClassDescriptorForTypeReference
(bindingContext(), typeReference);
return TranslationUtils.getQualifiedReference(context(), referencedClass);
return context().getQualifiedReference(referencedClass);
}
@NotNull
@@ -41,7 +41,6 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassDescriptorF
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToStatement;
import static org.jetbrains.k2js.translate.utils.PsiUtils.getPrimaryConstructorParameters;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.getQualifiedReference;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateArgumentList;
public final class ClassInitializerTranslator extends AbstractTranslator {
@@ -89,7 +88,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator {
} else {
arguments = Collections.emptyList();
}
JsNameRef reference = getQualifiedReference(context(), getClassDescriptorForType(enumClassType));
JsNameRef reference = context().getQualifiedReference(getClassDescriptorForType(enumClassType));
if(context().isEcma5()) {
return new JsInvocation(reference, arguments);
} else {
@@ -17,7 +17,6 @@
package org.jetbrains.k2js.translate.reference;
import com.google.dart.compiler.backend.js.ast.JsExpression;
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;
@@ -43,11 +42,7 @@ public final class ReferenceTranslator {
public static JsExpression translateAsFQReference(@NotNull DeclarationDescriptor referencedDescriptor,
@NotNull TranslationContext context) {
JsExpression alias = context.getAliasForDescriptor(referencedDescriptor);
if (alias != null) {
return alias;
}
return new JsNameRef(context.getNameForDescriptor(referencedDescriptor), context.getQualifierForDescriptor(referencedDescriptor));
return alias != null ? alias : context.getQualifiedReference(referencedDescriptor);
}
@NotNull
@@ -21,7 +21,6 @@ import com.intellij.openapi.util.Pair;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
@@ -177,11 +176,6 @@ public final class TranslationUtils {
return jsInitExpression;
}
@NotNull
public static JsNameRef getQualifiedReference(@NotNull TranslationContext context, @NotNull DeclarationDescriptor descriptor) {
return new JsNameRef(context.getNameForDescriptor(descriptor), context.getQualifierForDescriptor(descriptor));
}
@NotNull
public static List<JsExpression> translateExpressionList(@NotNull TranslationContext context,
@NotNull List<JetExpression> expressions) {