예제 #1
0
        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);
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
 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);
     }
 }
예제 #5
0
 override public void OnCallableBlockExpression(CallableBlockExpression node)
 {
     ++_closureDepth;
     Visit(node.Body);
     --_closureDepth;
 }
예제 #6
0
 override public void OnCallableBlockExpression(CallableBlockExpression node)
 {
     // ignore closure's body since it will be visited
     // through the closure's newly created method
 }
예제 #7
0
 override public void OnCallableBlockExpression(CallableBlockExpression node)
 {
     // nothing to do
 }
예제 #8
0
 public override void OnCallableBlockExpression(CallableBlockExpression node)
 {
 }