Properly capture local functions
Local functions in local classed wasn't captured properly
This commit is contained in:
@@ -255,7 +255,7 @@ public class ClosureCodegen extends GenerationStateAware {
|
||||
: typeMapper.mapType((VariableDescriptor) descriptor);
|
||||
args.add(FieldInfo.createForHiddenField(ownerType, type, "$" + descriptor.getName().getName()));
|
||||
}
|
||||
else if (isLocalNamedFun(state.getBindingContext(), descriptor)) {
|
||||
else if (isLocalNamedFun(descriptor)) {
|
||||
Type type =
|
||||
classNameForAnonymousClass(bindingContext,
|
||||
(JetElement) BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor))
|
||||
|
||||
@@ -51,7 +51,7 @@ import java.util.*;
|
||||
import static org.jetbrains.asm4.Opcodes.*;
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.*;
|
||||
import static org.jetbrains.jet.codegen.CodegenUtil.*;
|
||||
import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalFun;
|
||||
import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalNamedFun;
|
||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration;
|
||||
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
|
||||
@@ -152,7 +152,7 @@ public class FunctionCodegen extends GenerationStateAware {
|
||||
if (expectedThisObject != null) {
|
||||
thisType = typeMapper.mapType(expectedThisObject.getType());
|
||||
}
|
||||
else if (declaration instanceof JetFunctionLiteral || isLocalFun(bindingContext, functionDescriptor)) {
|
||||
else if (declaration instanceof JetFunctionLiteral || isLocalNamedFun(functionDescriptor)) {
|
||||
thisType = typeMapper.mapType(context.getThisDescriptor());
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1233,7 +1233,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
}
|
||||
}
|
||||
constructorContext.lookupInContext(descriptor, null, state, true);
|
||||
} else if (descriptor instanceof CallableMemberDescriptor) {
|
||||
} else if (isLocalNamedFun(descriptor)) {
|
||||
MutableClassDescriptor classDescriptor =
|
||||
(MutableClassDescriptor) constructorContext.getParentContext().getContextDescriptor();
|
||||
|
||||
|
||||
@@ -295,19 +295,10 @@ public class CodegenBinding {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isLocalFun(BindingContext bindingContext, DeclarationDescriptor fd) {
|
||||
PsiElement psiElement = descriptorToDeclaration(bindingContext, fd);
|
||||
if (psiElement instanceof JetNamedFunction && psiElement.getParent() instanceof JetBlockExpression) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isLocalNamedFun(BindingContext bindingContext, DeclarationDescriptor fd) {
|
||||
PsiElement psiElement = descriptorToDeclaration(bindingContext, fd);
|
||||
if (psiElement instanceof JetNamedFunction) {
|
||||
DeclarationDescriptor declaration = fd.getContainingDeclaration();
|
||||
return declaration instanceof FunctionDescriptor || declaration instanceof PropertyDescriptor;
|
||||
public static boolean isLocalNamedFun(DeclarationDescriptor fd) {
|
||||
if (fd instanceof FunctionDescriptor) {
|
||||
FunctionDescriptor descriptor = (FunctionDescriptor) fd;
|
||||
return descriptor.getVisibility() == Visibilities.LOCAL && !descriptor.getName().isSpecial();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public interface LocalLookup {
|
||||
LOCAL_NAMED_FUNCTION {
|
||||
@Override
|
||||
public boolean isCase(DeclarationDescriptor d, GenerationState state) {
|
||||
return isLocalNamedFun(state.getBindingContext(), d);
|
||||
return isLocalNamedFun(d);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -85,7 +85,7 @@ public interface LocalLookup {
|
||||
) {
|
||||
FunctionDescriptor vd = (FunctionDescriptor) d;
|
||||
|
||||
boolean idx = localLookup.lookupLocal(vd);
|
||||
boolean idx = localLookup != null && localLookup.lookupLocal(vd);
|
||||
if (!idx) return null;
|
||||
|
||||
JetElement expression = (JetElement) callableDescriptorToDeclaration(state.getBindingContext(), vd);
|
||||
|
||||
@@ -816,7 +816,7 @@ public class JetTypeMapper extends BindingTraceAware {
|
||||
signatureWriter.writeAsmType(sharedVarType, false);
|
||||
signatureWriter.writeParameterTypeEnd();
|
||||
}
|
||||
else if (isLocalNamedFun(bindingContext, variableDescriptor)) {
|
||||
else if (isLocalNamedFun(variableDescriptor)) {
|
||||
Type type = classNameForAnonymousClass(
|
||||
bindingContext,
|
||||
(JetElement) BindingContextUtils.descriptorToDeclaration(bindingContext, variableDescriptor)
|
||||
|
||||
Reference in New Issue
Block a user