Ejemplo n.º 1
0
        public override bool VisitStmtIfElseIfElse([NotNull] GamaParser.StmtIfElseIfElseContext context)
        {
            var exprctx = context.expr();

            /* lmao */
            for (int i = 0; i < exprctx.Length; i++)
            {
                var e   = exprctx[i];
                var val = VisitExpression(e);
                if (val == null)
                {
                    return(false);
                }

                if (val.Type != InstanceTypes.Bool)
                {
                    NamespaceContext.Context.AddError(new ErrorTypeMismatch(e));
                    return(false);
                }

                CurrentBlock.PositionBuilderAtEnd(Builder);

                var iftrue = Self.AddBlock("if.true");
                var ifend  = Self.AddBlock("if.end");

                Builder.BuildCondBr(val.Value, iftrue.Block, ifend.Block);

                SetBlock(iftrue);
                Push();
                {
                    Visit(context.block(i));
                }
                if (!iftrue.HasTerminator())
                {
                    iftrue.PositionBuilderAtEnd(Builder);
                    Builder.BuildBr(ifend.Block);
                }
                if (CurrentBlock != iftrue) /* Block nesting */
                {
                    CurrentBlock.PositionBuilderAtEnd(Builder);
                    Builder.BuildBr(ifend.Block);
                }
                Pop();
                SetBlock(ifend);
            }

            // TODO:

            return(true);
        }