public override void OnBlockExpression(BlockExpression node) { AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(cu); if (node.ReturnType != null) { amrt.MethodReturnType = ConvertType(node.ReturnType); } else { amrt.MethodReturnType = new BooInferredReturnType(node.Body, resolver.CallingClass, node.ContainsAnnotation("inline")); } amrt.MethodParameters = new List<IParameter>(); ConvertVisitor.AddParameters(node.Parameters, amrt.MethodParameters, resolver.CallingMember, resolver.CallingClass ?? new DefaultClass(resolver.CompilationUnit, "__Dummy")); MakeResult(amrt); }
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; }
public override void OnBlockExpression(BlockExpression node) { if (WasVisited(node)) return; MarkVisited(node); Method closure = CodeBuilder.CreateMethod( ClosureNameFor(node), Unknown.Default, ClosureModifiers()); MarkVisited(closure); InternalMethod closureEntity = (InternalMethod)closure.Entity; closure.LexicalInfo = node.LexicalInfo; closure.Parameters = node.Parameters; closure.Body = node.Body; _currentMethod.Method.DeclaringType.Members.Add(closure); CodeBuilder.BindParameterDeclarations(_currentMethod.IsStatic, closure); // check for invalid names and // resolve parameter types Visit(closure.Parameters); if (node.ContainsAnnotation("inline")) { AddOptionalReturnStatement(node.Body); } // Connects the closure method namespace with the current NamespaceDelegator ns = new NamespaceDelegator(CurrentNamespace, closureEntity); ProcessMethodBody(closureEntity, ns); TryToResolveReturnType(closureEntity); node.ExpressionType = closureEntity.Type; node.Entity = closureEntity; }