JS backend: fixed closure variables in object which declared in another object in method.
(cherry picked from commit f3e8325)
This commit is contained in:
@@ -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
|
||||
|
||||
+12
-11
@@ -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!"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user