private static FlowNode ParseIf(RuleContext rule)
        {
            //IF expression INDENT statements DEDENT (ELSE INDENT statements DEDENT)?;
            ExpressionNode expression = ExpressionParser.ParseExpression((RuleContext)rule.GetChild(1));
            BlockNode      trueBlock  = ParseBlockNode((RuleContext)rule.GetChild(3));

            //Pure if
            if (rule.ChildCount == 5)
            {
                return(CrawlSyntaxNode.If(rule.SourceInterval, expression, trueBlock));
            }
            //If Else
            else if (rule.ChildCount == 9)
            {
                BlockNode falseBlock = ParseBlockNode((RuleContext)rule.GetChild(7));
                return(CrawlSyntaxNode.IfElse(rule.SourceInterval, expression, trueBlock, falseBlock));
            }
            //Else if
            else if (rule.ChildCount == 7)
            {
                RuleContext            chain         = (RuleContext)rule.GetChild(6);
                List <CrawlSyntaxNode> blockContents = new List <CrawlSyntaxNode>()
                {
                    ParseIf(chain)
                };
                BlockNode falseBlock = CrawlSyntaxNode.Block(chain.SourceInterval, blockContents);
                return(CrawlSyntaxNode.IfElse(rule.SourceInterval, expression, trueBlock, falseBlock));
            }

            throw new NotImplementedException("if statement with strange argument counts (this is probably else if)");
        }
        //public static ConstructNode ParseConstruct(RuleContext rule)


        public static BlockNode ParseBlockNode(RuleContext rule)
        {
            System.Collections.IEnumerable meaningfullContent;

            if (rule.RuleIndex == CrawlParser.RULE_statements)
            {
                meaningfullContent = rule.AsIEnumerable();
            }
            else if (rule.RuleIndex == CrawlParser.RULE_class_body)
            {
                meaningfullContent = rule.AsEdgeTrimmedIEnumerable();
            }
            else
            {
                throw new NotImplementedException("Probably broken");
            }

            IEnumerable <CrawlSyntaxNode> contents =
                meaningfullContent
                .OfType <RuleContext>()    //FIXME! This can contain raw NEWLINE and END_OF_STATEMENT tokens which is TerminalNodeImpl not RuleContext. Not happy about discarding that trivia
                .Select(ParseStatement).ToList();

            return(CrawlSyntaxNode.Block(rule.SourceInterval, contents));
        }