Exemplo n.º 1
0
        private TokenTagCollection MatchSquareBrackets(SnapshotSpan span)
        {
            var tokenTags = new TokenTagCollection(span);

            tokenTags.SetClassifierTag(GLSLTokenTypes.SquareBracket);

            int start = span.Start;

            if (!_squareBracketBuilder.Start.HasValue)
            {
                _squareBracketBuilder.Start = start;
                string text = span.Snapshot.GetText();

                int end = GetClosingPosition(text, start, '[', ']', _squareBracketBuilder);
                if (end >= 0)
                {
                    _squareBracketBuilder.End = end + 1;
                    var bracketSpan = _squareBracketBuilder.ToSpan();
                    _squareBracketBuilder.Clear();

                    int outlineEnd = _squareBracketBuilder.ConsumeUntil(text, start, "\r", "\n");
                    if (outlineEnd >= 0 && outlineEnd < end)
                    {
                        var collapseText = text.Substring(start, outlineEnd - start) + "...]";

                        var tagSpan = new TagSpan <GLSLOutlineTag>(bracketSpan, new GLSLOutlineTag(SQUARE_TOKEN_TYPE, collapseText));
                        tokenTags.AddOutlineTagSpan(tagSpan);
                        _squareBracketSpans.Add(tagSpan);
                    }
                }
            }

            return(tokenTags);
        }
Exemplo n.º 2
0
        private TokenTagCollection MatchParentheses(SnapshotSpan span)
        {
            var tokenTags = new TokenTagCollection(span);

            tokenTags.SetClassifierTag(GLSLTokenTypes.Parenthesis);

            int start = span.Start;

            if (!_parenthesisBuilder.Start.HasValue)
            {
                _parenthesisBuilder.Start = start;
                string text = span.Snapshot.GetText();

                int end = GetClosingPosition(text, start, '(', ')', _parenthesisBuilder);
                if (end >= 0)
                {
                    _parenthesisBuilder.End = end + 1;
                    var parenthesisSpan = _parenthesisBuilder.ToSpan();
                    _parenthesisBuilder.Clear();

                    int outlineEnd = _parenthesisBuilder.ConsumeUntil(text, start, "\r", "\n");
                    if (outlineEnd >= 0 && outlineEnd < end)
                    {
                        var collapseText = text.Substring(start, outlineEnd - start) + "...)";

                        var tagSpan = new TagSpan <GLSLOutlineTag>(parenthesisSpan, new GLSLOutlineTag(PARENTHESIS_TOKEN_TYPE, collapseText));
                        tokenTags.AddOutlineTagSpan(tagSpan);
                        _parenthesisSpans.Add(tagSpan);
                    }
                }
            }

            return(tokenTags);
        }
        public TokenTagCollection Match(SnapshotSpan span)
        {
            _builder.Snapshot = span.Snapshot;

            var    tokenTags = new TokenTagCollection(span);
            string token     = span.GetText();
            int    position  = span.Start + token.Length;

            if (token.StartsWith("#"))
            {
                int start = position - token.Length;

                if (!_builder.Start.HasValue)
                {
                    _builder.Start = start;
                    string text = span.Snapshot.GetText();

                    int nConsumed = _builder.ConsumeUntil(text, start, "\r", "\n");
                    if (nConsumed >= 0)
                    {
                        _builder.End = _builder.Start + nConsumed;
                        var preprocessorSpan = _builder.ToSpan();

                        _builder.Clear();
                        _spans.Add(preprocessorSpan);

                        tokenTags.Consumed          = preprocessorSpan.Length - token.Length;
                        tokenTags.ClassifierTagSpan = new TagSpan <GLSLClassifierTag>(preprocessorSpan, new GLSLClassifierTag(TOKEN_TYPE));
                    }
                }
            }

            return(tokenTags);
        }
Exemplo n.º 4
0
        private int GetClosingPosition(string text, int start, char openingCharacter, char closingCharacter, SpanBuilder spanBuilder)
        {
            int position = spanBuilder.ConsumeUntil(text, start, openingCharacter.ToString(), closingCharacter.ToString());

            if (position >= 0)
            {
                if (text[position] == openingCharacter)
                {
                    int end       = GetClosingPosition(text, position, openingCharacter, closingCharacter, spanBuilder);
                    int doubleEnd = GetClosingPosition(text, end, openingCharacter, closingCharacter, spanBuilder);
                    return(doubleEnd);
                }
                else
                {
                    return(position);
                }
            }

            return(-1);
        }
Exemplo n.º 5
0
        private string GetCollapseText(SpanBuilder spanBuilder, string text, int position, char closingChar)
        {
            int spanEnd = spanBuilder.End.Value - 1;

            int outlineEnd = spanBuilder.ConsumeUntil(text, position, "\r", "\n");

            if (outlineEnd >= 0)
            {
                var collapseText = new StringBuilder();
                if (spanEnd > outlineEnd)
                {
                    collapseText.Append(text.Substring(position, outlineEnd - position));
                }
                collapseText.Append("..." + closingChar);

                return(collapseText.ToString());
            }

            return(GLSLOutlineTag.COLLAPSE_TEXT);
        }
Exemplo n.º 6
0
        public TokenTagCollection Match(SnapshotSpan span)
        {
            _singleLineCommentBuilder.Snapshot = span.Snapshot;
            _multiLineCommentBuilder.Snapshot  = span.Snapshot;

            var    tokenTags = new TokenTagCollection(span);
            string token     = span.GetText();
            int    position  = span.Start + token.Length;

            if (token.Contains("//"))
            {
                int tokenIndex = token.IndexOf("//");
                int start      = position - token.Length + tokenIndex;

                if (!_singleLineCommentBuilder.Start.HasValue)
                {
                    _singleLineCommentBuilder.Start = start;
                    string text = span.Snapshot.GetText();

                    int end = _singleLineCommentBuilder.ConsumeUntil(text, start, "\r", "\n");
                    if (end >= 0)
                    {
                        _singleLineCommentBuilder.End = end;
                        var commentSpan = _singleLineCommentBuilder.ToSpan();
                        _singleLineCommentBuilder.Clear();

                        var commentTagSpan = new TagSpan <GLSLClassifierTag>(commentSpan, new GLSLClassifierTag(TOKEN_TYPE));
                        _singleLineComments.Add(commentTagSpan);

                        tokenTags.Consumed = commentSpan.Length - token.Length;
                    }
                }
            }

            if (token.Contains("/*"))
            {
                int tokenIndex = token.IndexOf("/*");
                int start      = position - token.Length + tokenIndex;

                if (!_multiLineCommentBuilder.Start.HasValue)
                {
                    _multiLineCommentBuilder.Start = start;
                    string text = span.Snapshot.GetText();

                    int end = _multiLineCommentBuilder.ConsumeUntil(text, start, "*/");
                    if (end >= 0)
                    {
                        _multiLineCommentBuilder.End = end + 1;
                        var commentSpan = _multiLineCommentBuilder.ToSpan();
                        _multiLineCommentBuilder.Clear();

                        var commentTagSpan = new TagSpan <IGLSLTag>(commentSpan, new GLSLClassifierTag(TOKEN_TYPE));
                        _multiLineComments.Add(commentTagSpan);

                        int outlineEnd = _multiLineCommentBuilder.ConsumeUntil(text, start, "\r", "\n");
                        if (outlineEnd >= 0)
                        {
                            var outlineTagSpan = new TagSpan <IGLSLTag>(commentSpan, new GLSLOutlineTag(TOKEN_TYPE, text.Substring(start, outlineEnd - start) + "...*/"));
                            _multiLineComments.Add(outlineTagSpan);
                        }

                        tokenTags.Consumed = commentSpan.Length - token.Length;
                    }
                }
            }

            tokenTags.SetClassifierTag(_singleLineComments);
            tokenTags.SetClassifierTag(_multiLineComments.OfType <TagSpan <GLSLClassifierTag> >());
            tokenTags.AddOutlineTagSpans(_multiLineComments.OfType <TagSpan <GLSLOutlineTag> >());

            return(tokenTags);
        }