Fix for local closures

This commit is contained in:
Mikhael Bogdanov
2013-03-26 14:30:32 +04:00
parent 9091becbea
commit 932c1444a2
6 changed files with 67 additions and 1 deletions
@@ -40,6 +40,7 @@ import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.codegen.state.JetTypeMapperMode;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
@@ -1232,6 +1233,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
}
constructorContext.lookupInContext(descriptor, null, state, true);
} else if (descriptor instanceof CallableMemberDescriptor) {
MutableClassDescriptor classDescriptor =
(MutableClassDescriptor) constructorContext.getParentContext().getContextDescriptor();
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getAllCallableMembers()) {
if (descriptor.equals(memberDescriptor)) {
return;
}
}
constructorContext.lookupInContext(descriptor, null, state, true);
}
}
@@ -16,6 +16,8 @@
package org.jetbrains.jet.codegen.context;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.OwnerKind;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
@@ -29,7 +31,7 @@ public class ConstructorContext extends MethodContext {
public ConstructorContext(
ConstructorDescriptor contextDescriptor,
OwnerKind kind,
CodegenContext parent
@NotNull CodegenContext parent
) {
super(contextDescriptor, kind, parent);
@@ -46,4 +48,11 @@ public class ConstructorContext extends MethodContext {
public String toString() {
return "Constructor: " + getContextDescriptor().getName();
}
@NotNull
@Override
public CodegenContext getParentContext() {
//noinspection ConstantConditions
return super.getParentContext();
}
}
@@ -816,6 +816,16 @@ public class JetTypeMapper extends BindingTraceAware {
signatureWriter.writeAsmType(sharedVarType, false);
signatureWriter.writeParameterTypeEnd();
}
else if (isLocalNamedFun(bindingContext, variableDescriptor)) {
Type type = classNameForAnonymousClass(
bindingContext,
(JetElement) BindingContextUtils.descriptorToDeclaration(bindingContext, variableDescriptor)
).getAsmType();
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE);
signatureWriter.writeAsmType(type, false);
signatureWriter.writeParameterTypeEnd();
}
}
JetDelegatorToSuperCall superCall = closure.getSuperCall();
@@ -0,0 +1,14 @@
fun box(): String {
fun local():Int {
return 10;
}
class A {
fun test(): Int {
return local()
}
}
return if (A().test() == 10) "OK" else "fail"
}
@@ -0,0 +1,12 @@
fun box(): String {
fun local():Int {
return 10;
}
class A {
val test = local()
}
return if (A().test == 10) "OK" else "fail"
}
@@ -951,6 +951,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest("compiler/testData/codegen/box/closures/kt2151.kt");
}
@TestMetadata("localFunctionInFunction.kt")
public void testLocalFunctionInFunction() throws Exception {
doTest("compiler/testData/codegen/box/closures/localFunctionInFunction.kt");
}
@TestMetadata("localFunctionInInitializer.kt")
public void testLocalFunctionInInitializer() throws Exception {
doTest("compiler/testData/codegen/box/closures/localFunctionInInitializer.kt");
}
@TestMetadata("recursiveClosure.kt")
public void testRecursiveClosure() throws Exception {
doTest("compiler/testData/codegen/box/closures/recursiveClosure.kt");