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:
+27
-16
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user