bool IsSimpleClosure(CallableBlockExpression node) { if (1 == node.Body.Statements.Count) { switch (node.Body.Statements[0].NodeType) { case NodeType.IfStatement: { return(false); } case NodeType.WhileStatement: { return(false); } case NodeType.ForStatement: { return(false); } } return(true); } return(false); }
override public void LeaveCallableBlockExpression(CallableBlockExpression node) { InternalMethod closureEntity = (InternalMethod)GetEntity(node); using (ForeignReferenceCollector collector = new ForeignReferenceCollector()) { collector.CurrentMethod = closureEntity.Method; collector.CurrentType = (IType)closureEntity.DeclaringType; collector.Initialize(_context); collector.Visit(closureEntity.Method.Body); if (collector.ContainsForeignLocalReferences) { BooClassBuilder closureClass = CreateClosureClass(collector, closureEntity); collector.AdjustReferences(); ReplaceCurrentNode( CodeBuilder.CreateMemberReference( collector.CreateConstructorInvocationWithReferencedEntities( closureClass.Entity), closureEntity)); } else { Expression expression = CodeBuilder.CreateMemberReference(closureEntity); TypeSystemServices.GetConcreteExpressionType(expression); ReplaceCurrentNode(expression); } } }
void EnsureClosureEndSourceLocation(string code, int line, int column) { CompileUnit cu = BooParser.ParseString("closures", code); Expression e = ((ExpressionStatement)cu.Modules[0].Globals.Statements[0]).Expression; CallableBlockExpression cbe = (CallableBlockExpression)((BinaryExpression)e).Right; SourceLocation esl = cbe.Body.EndSourceLocation; Assert.AreEqual(line, esl.Line); Assert.AreEqual(column, esl.Column); }
override public void OnCallableBlockExpression(CallableBlockExpression node) { if (IsSimpleClosure(node)) { DisableNewLine(); Write("{ "); if (node.Parameters.Count > 0) { WriteCommaSeparatedList(node.Parameters); Write(" | "); } Visit(node.Body.Statements); Write(" }"); EnableNewLine(); } else { WriteKeyword("def "); WriteParameterList(node.Parameters); WriteTypeReference(node.ReturnType); WriteLine(":"); WriteBlock(node.Body); } }
override public void OnCallableBlockExpression(CallableBlockExpression node) { ++_closureDepth; Visit(node.Body); --_closureDepth; }
override public void OnCallableBlockExpression(CallableBlockExpression node) { // ignore closure's body since it will be visited // through the closure's newly created method }
override public void OnCallableBlockExpression(CallableBlockExpression node) { // nothing to do }
public override void OnCallableBlockExpression(CallableBlockExpression node) { }