void ProcessClosureBody(BlockExpression node)
{
MarkVisited(node);
if (node.ContainsAnnotation("inline"))
AddOptionalReturnStatement(node.Body);
var explicitClosureName = node[BlockExpression.ClosureNameAnnotation] as string;
Method closure = CodeBuilder.CreateMethod(
ClosureName(explicitClosureName),
node.ReturnType ?? CodeBuilder.CreateTypeReference(Unknown.Default),
ClosureModifiers());
MarkVisited(closure);
var closureEntity = (InternalMethod)closure.Entity;
closure.LexicalInfo = node.LexicalInfo;
closure.Parameters = node.Parameters;
closure.Body = node.Body;
CurrentMethod.DeclaringType.Members.Add(closure);
CodeBuilder.BindParameterDeclarations(_currentMethod.IsStatic, closure);
// check for invalid names and
// resolve parameter types
Visit(closure.Parameters);
// Inside the closure, connect the closure method namespace with the current namespace
var ns = new NamespaceDelegator(CurrentNamespace, closureEntity);
// Allow closure body to reference itself using its explicit name (BOO-1085)
if (explicitClosureName != null)
ns.DelegateTo(new AliasedNamespace(explicitClosureName, closureEntity));
ProcessMethodBody(closureEntity, ns);
if (closureEntity.ReturnType is Unknown)
TryToResolveReturnType(closureEntity);
node.ExpressionType = closureEntity.Type;
node.Entity = closureEntity;
}