JS backend: fixed closure variables in object which declared in another object in method.

(cherry picked from commit f3e8325)
This commit is contained in:
develar
2013-08-20 15:32:43 +04:00
committed by Zalim Bashorov
parent 39ccf418c0
commit b122893823
4 changed files with 34 additions and 12 deletions
@@ -52,4 +52,7 @@ public final class ObjectTest extends SingleFileTranslationTest {
public void testObjectInheritingFromClass() throws Exception {
fooBoxTest();
}
public void testObjectInObjectWithClosure() throws Exception {
fooBoxTest();
}
}
@@ -119,7 +119,7 @@ public final class ClassTranslator extends AbstractTranslator {
if (containingClass == null) {
return translate(context());
}
return context().literalFunctionTranslator().translate(containingClass, classDeclaration, descriptor, this);
return context().literalFunctionTranslator().translate(containingClass, context(), classDeclaration, descriptor, this);
}
@NotNull
@@ -103,7 +103,7 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
}
funContext = outerContext.newFunctionBody(fun, aliasingContext,
new UsageTracker(descriptor, outerContext.usageTracker(), outerClass));
new UsageTracker(descriptor, outerContext.usageTracker(), outerClass));
fun.getBody().getStatements().addAll(translateFunctionBody(descriptor, declaration, funContext).getStatements());
@@ -140,10 +140,12 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
return nameRef;
}
private static void addRegularParameters(FunctionDescriptor descriptor,
JsFunction fun,
TranslationContext funContext,
JsName receiverName) {
private static void addRegularParameters(
@NotNull FunctionDescriptor descriptor,
@NotNull JsFunction fun,
@NotNull TranslationContext funContext,
@Nullable JsName receiverName
) {
if (receiverName != null) {
fun.getParameters().add(new JsParameter(receiverName));
}
@@ -156,21 +158,20 @@ public class LiteralFunctionTranslator extends AbstractTranslator {
public JsExpression translate(
@NotNull ClassDescriptor outerClass,
@NotNull TranslationContext outerClassContext,
@NotNull JetClassOrObject declaration,
@NotNull ClassDescriptor descriptor,
@NotNull ClassTranslator classTranslator
) {
JsFunction fun = createFunction();
JsNameRef outerClassRef = fun.getScope().declareName(Namer.OUTER_CLASS_NAME).makeRef();
UsageTracker usageTracker = new UsageTracker(descriptor, null, outerClass);
TranslationContext funContext = context().newFunctionBody(fun, context().aliasingContext().inner(outerClass, outerClassRef),
usageTracker);
UsageTracker usageTracker = new UsageTracker(descriptor, outerClassContext.usageTracker(), outerClass);
AliasingContext aliasingContext = outerClassContext.aliasingContext().inner(outerClass, outerClassRef);
TranslationContext funContext = outerClassContext.newFunctionBody(fun, aliasingContext, usageTracker);
fun.getBody().getStatements().add(new JsReturn(classTranslator.translate(funContext)));
JetClassBody body = declaration.getBody();
assert body != null;
InnerObjectTranslator translator = new InnerObjectTranslator(funContext, fun);
return translator.translate(createReference(fun), usageTracker.isUsed() ? outerClassRef : null);
return new InnerObjectTranslator(funContext, fun).translate(createReference(fun), usageTracker.isUsed() ? outerClassRef : null);
}
}
@@ -0,0 +1,18 @@
package foo
class Foo {
fun bar(param: String): String {
val local = "world!"
var a = object {
object b {
val bar = param + local
}
}
return a.b.bar
}
}
fun box(): Boolean {
return Foo().bar("hello ") == "hello world!"
}