public override ITextArea[] VisitLineBlockLine([NotNull] LineBlockLineContext context)
            {
                var indentation = context.indentation();
                var result      = new List <ITextArea>();
                int length      = indentation == null ? 0 : indentation.GetText().Length;

                IndentationTracker.Track(length);

                var spanVisitor = new TextAreaVisitor().Inherit(this);
                var bodyContext = context.span();

                foreach (var atom in bodyContext)
                {
                    result.Add(spanVisitor.VisitSpan(atom));
                }

                var starTextContext = context.starText();

                if (starTextContext != null)
                {
                    result.Add(spanVisitor.VisitStarText(starTextContext));
                }

                result.First().Indentation = length;
                return(result.ToArray());
            }
            public override ITextArea[] VisitLineNoBreak([NotNull] LineNoBreakContext context)
            {
                var result      = new List <ITextArea>();
                var indentation = context.indentation();
                int length      = indentation == null ? 0 : indentation.GetText().Length;

                IndentationTracker.Track(length);

                var spanVisitor = new TextAreaVisitor().Inherit(this);

                result.Add(spanVisitor.VisitSpanLineStartNoStar(context.spanLineStartNoStar()));
                var spanContext = context.span();

                if (spanContext != null)
                {
                    foreach (var atom in spanContext)
                    {
                        result.Add(spanVisitor.VisitSpan(atom));
                    }
                }

                if (result.Last().TypeCode == ElementType.Text)
                {
                    result.Last().Content.Append("\n");
                }
                else
                {
                    result.Add(new TextArea("\n", result.Last().Scope));
                }

                result.First().Indentation = length;
                return(result.ToArray());
            }
            public override Comment VisitComment([NotNull] CommentContext context)
            {
                var result      = new List <ITextArea>();
                var indentation = context.indentation();
                int length      = indentation == null ? 0 : indentation.GetText().Length;

                IndentationTracker.Track(length);

                var commentLineContext = context.commentLineNoBreak();

                if (commentLineContext != null)
                {
                    var visitor = new TextAreaVisitor().Inherit(this);
                    result.Add(visitor.VisitCommentLineNoBreak(commentLineContext));
                }

                var linesContext = context.commentParagraphs();

                if (linesContext != null)
                {
                    var lineVisitor = new TextAreasVisitor().Inherit(this);

                    result.AddRange(lineVisitor.VisitCommentParagraphs(linesContext));
                }

                return(new Comment(result)
                {
                    Indentation = length
                });
            }
            public override ListItem VisitBulletSimple([NotNull] BulletSimpleContext context)
            {
                var indentation = context.indentation();
                int length      = indentation == null ? 0 : indentation.GetText().Length;

                IndentationTracker.Track(length);
                var start            = context.bullet().GetText();
                var list             = new List <IElement>();
                var paragraphVisitor = new ParagraphVisitor().Inherit(this);
                var first            = context.paragraphNoBreak();

                if (first != null)
                {
                    list.Add(paragraphVisitor.VisitParagraphNoBreak(first));
                }

                var paragraph = context.paragraph();

                if (paragraph != null)
                {
                    foreach (var item in paragraph)
                    {
                        list.Add(paragraphVisitor.VisitParagraph(item));
                    }
                }

                return(new ListItem(start, null, list)
                {
                    Indentation = length
                });
            }
            public override ITextArea[] VisitLineNormal([NotNull] LineNormalContext context)
            {
                var result  = new List <ITextArea>();
                var special = context.lineSpecial();

                if (special != null)
                {
                    var text = context.GetText().TrimStart() + "\n";
                    return(new ITextArea[] { new TextArea(text, new Scope {
                            LineStart = context.Start.Line, LineEnd = context.Stop.Line
                        }) });
                }

                var indentation = context.indentation();
                int length      = indentation == null ? 0 : indentation.GetText().Length;

                IndentationTracker.Track(length);

                var spanVisitor = new TextAreaVisitor().Inherit(this);
                var start       = context.spanLineStartNoStar();

                if (start != null)
                {
                    foreach (var item in start)
                    {
                        result.Add(spanVisitor.VisitSpanLineStartNoStar(item));
                    }
                }

                var bodyContext = context.span();

                foreach (var atom in bodyContext)
                {
                    result.Add(spanVisitor.VisitSpan(atom));
                }

                var noStar = context.spanNoStar();

                if (noStar != null)
                {
                    foreach (var item in noStar)
                    {
                        result.Add(spanVisitor.VisitSpanNoStar(item));
                    }
                }

                if (result.Last().TypeCode == ElementType.Text)
                {
                    result.Last().Content.Append("\n");
                }
                else
                {
                    result.Add(new TextArea("\n", result.Last().Scope));
                }

                result.First().Indentation = length;
                return(result.ToArray());
            }
            public override ListItem VisitListItemBullet([NotNull] ListItemBulletContext context)
            {
                if (context.special != null)
                {
                    var indentation = context.indentation();
                    int length      = indentation == null ? 0 : indentation.GetText().Length;
                    IndentationTracker.Track(length);
                    return(new ListItem(context.special.Text, null, new List <IElement>(0))
                    {
                        Indentation = length
                    });
                }

                var simple = context.bulletSimple();

                if (simple != null)
                {
                    return(VisitBulletSimple(simple));
                }

                return(VisitBulletCrossLine(context.bulletCrossLine()));
            }
 internal TrackedBaseVisitor <T> Inherit(ITracked item)
 {
     SectionTracker     = item.SectionTracker;
     IndentationTracker = item.IndentationTracker;
     return(this);
 }