Fix a problem which caused temporary variables to be created in invalid context when creating object literal.

Only 2 tests failing atm.
This commit is contained in:
Pavel V. Talanov
2012-07-03 15:53:16 +04:00
parent d6ffb42497
commit 30a01a674d
@@ -23,10 +23,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetObjectLiteralExpression;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.AbstractTranslator;
@@ -55,9 +52,9 @@ public final class ClassTranslator extends AbstractTranslator {
@NotNull @NotNull
public static JsPropertyInitializer translateAsProperty(@NotNull JetClassOrObject classDeclaration, public static JsPropertyInitializer translateAsProperty(@NotNull JetClassOrObject classDeclaration,
@NotNull TranslationContext context) { @NotNull TranslationContext context) {
JsExpression classCreationExpression = JsExpression classCreationExpression =
generateClassCreationExpression(classDeclaration, context); generateClassCreationExpression(classDeclaration, context);
JsName className = context.getNameForElement(classDeclaration); JsName className = context.getNameForElement(classDeclaration);
return new JsPropertyInitializer(className.makeRef(), classCreationExpression); return new JsPropertyInitializer(className.makeRef(), classCreationExpression);
} }
@@ -71,18 +68,23 @@ public final class ClassTranslator extends AbstractTranslator {
@NotNull @NotNull
public static JsExpression generateClassCreationExpression(@NotNull JetClassOrObject classDeclaration, public static JsExpression generateClassCreationExpression(@NotNull JetClassOrObject classDeclaration,
@NotNull TranslationContext context) {
@NotNull TranslationContext context) {
return (new ClassTranslator(classDeclaration, null, context)).translateClassOrObjectCreation(); return (new ClassTranslator(classDeclaration, null, context)).translateClassOrObjectCreation();
} }
@NotNull @NotNull
public static JsExpression generateObjectLiteralExpression(@NotNull JetObjectLiteralExpression objectLiteralExpression, public static JsExpression generateObjectLiteralExpression(@NotNull JetObjectLiteralExpression objectLiteralExpression,
@NotNull TranslationContext context) { @NotNull TranslationContext outerContext) {
return (new ClassTranslator(objectLiteralExpression.getObjectDeclaration(), null, context)) JetObjectDeclaration objectDeclaration = objectLiteralExpression.getObjectDeclaration();
.translateObjectLiteralExpression(); ClassTranslator classTranslator = new ClassTranslator(objectDeclaration, null, outerContext);
ClassDescriptor containingClass = getContainingClass(classTranslator.descriptor);
if (containingClass == null) {
return classTranslator.translateClassOrObjectCreation();
}
return classTranslator.translateObjectLiteralWithThisAliased(containingClass, outerContext);
} }
@NotNull @NotNull
private final DeclarationBodyVisitor declarationBodyVisitor = new DeclarationBodyVisitor(); private final DeclarationBodyVisitor declarationBodyVisitor = new DeclarationBodyVisitor();
@@ -119,6 +121,7 @@ public final class ClassTranslator extends AbstractTranslator {
@NotNull @NotNull
private JsExpression translateAsObjectCreationExpressionWithEnclosingThisSaved(@NotNull ClassDescriptor containingClass) { private JsExpression translateAsObjectCreationExpressionWithEnclosingThisSaved(@NotNull ClassDescriptor containingClass) {
aliasForContainingClassThis = context().declareTemporary(getThisObject(context(), containingClass)); aliasForContainingClassThis = context().declareTemporary(getThisObject(context(), containingClass));
context().addStatementToCurrentBlock(context().program().getStringLiteral("АВПАВПАВП").makeStmt());
return newSequence(aliasForContainingClassThis.assignmentExpression(), translateClassOrObjectCreation()); return newSequence(aliasForContainingClassThis.assignmentExpression(), translateClassOrObjectCreation());
} }
@@ -160,7 +163,8 @@ public final class ClassTranslator extends AbstractTranslator {
if (!isTrait()) { if (!isTrait()) {
JsFunction initializer = Translation.generateClassInitializerMethod(classDeclaration, classDeclarationContext); JsFunction initializer = Translation.generateClassInitializerMethod(classDeclaration, classDeclarationContext);
if (context().isEcma5()) { if (context().isEcma5()) {
jsClassDeclaration.getArguments().add(initializer.getName() == null ? initializer : JsAstUtils.encloseFunction(initializer)); jsClassDeclaration.getArguments()
.add(initializer.getName() == null ? initializer : JsAstUtils.encloseFunction(initializer));
} }
else { else {
propertyList.add(InitializerUtils.generateInitializeMethod(initializer)); propertyList.add(InitializerUtils.generateInitializeMethod(initializer));
@@ -208,7 +212,7 @@ public final class ClassTranslator extends AbstractTranslator {
} }
private void addTraits(@NotNull List<JsExpression> superclassReferences, private void addTraits(@NotNull List<JsExpression> superclassReferences,
@NotNull List<ClassDescriptor> superclassDescriptors) { @NotNull List<ClassDescriptor> superclassDescriptors) {
for (ClassDescriptor superClassDescriptor : superclassDescriptors) { for (ClassDescriptor superClassDescriptor : superclassDescriptors) {
assert (superClassDescriptor.getKind() == ClassKind.TRAIT) : "Only traits are expected here"; assert (superClassDescriptor.getKind() == ClassKind.TRAIT) : "Only traits are expected here";
superclassReferences.add(getClassReference(superClassDescriptor)); superclassReferences.add(getClassReference(superClassDescriptor));
@@ -216,7 +220,7 @@ public final class ClassTranslator extends AbstractTranslator {
} }
private void addAncestorClass(@NotNull List<JsExpression> superclassReferences, private void addAncestorClass(@NotNull List<JsExpression> superclassReferences,
@NotNull List<ClassDescriptor> superclassDescriptors) { @NotNull List<ClassDescriptor> superclassDescriptors) {
//here we remove ancestor class from the list //here we remove ancestor class from the list
ClassDescriptor ancestorClass = findAndRemoveAncestorClass(superclassDescriptors); ClassDescriptor ancestorClass = findAndRemoveAncestorClass(superclassDescriptors);
if (ancestorClass != null) { if (ancestorClass != null) {
@@ -229,7 +233,7 @@ public final class ClassTranslator extends AbstractTranslator {
// aliasing here is needed for the declaration generation step // aliasing here is needed for the declaration generation step
if (aliasingMap != null) { if (aliasingMap != null) {
JsNameRef name = aliasingMap.get(BindingUtils.getClassForDescriptor(bindingContext(), superClassDescriptor), JsNameRef name = aliasingMap.get(BindingUtils.getClassForDescriptor(bindingContext(), superClassDescriptor),
(JetClass) classDeclaration); (JetClass) classDeclaration);
if (name != null) { if (name != null) {
return name; return name;
} }
@@ -251,7 +255,7 @@ public final class ClassTranslator extends AbstractTranslator {
List<JsPropertyInitializer> result = new ArrayList<JsPropertyInitializer>(); List<JsPropertyInitializer> result = new ArrayList<JsPropertyInitializer>();
for (JetParameter parameter : getPrimaryConstructorParameters(classDeclaration)) { for (JetParameter parameter : getPrimaryConstructorParameters(classDeclaration)) {
PropertyDescriptor descriptor = PropertyDescriptor descriptor =
getPropertyDescriptorForConstructorParameter(bindingContext(), parameter); getPropertyDescriptorForConstructorParameter(bindingContext(), parameter);
if (descriptor != null) { if (descriptor != null) {
result.addAll(PropertyTranslator.translateAccessors(descriptor, classDeclarationContext)); result.addAll(PropertyTranslator.translateAccessors(descriptor, classDeclarationContext));
} }
@@ -268,4 +272,11 @@ public final class ClassTranslator extends AbstractTranslator {
assert containingClass != null; assert containingClass != null;
return context().innerContextWithThisAliased(containingClass, aliasForContainingClassThis.name()); return context().innerContextWithThisAliased(containingClass, aliasForContainingClassThis.name());
} }
@NotNull
private JsExpression translateObjectLiteralWithThisAliased(@NotNull ClassDescriptor containingClass,
@NotNull TranslationContext outerContext) {
aliasForContainingClassThis = outerContext.declareTemporary(getThisObject(outerContext, containingClass));
return newSequence(aliasForContainingClassThis.assignmentExpression(), translateClassOrObjectCreation());
}
} }