Esempio n. 1
0
        public IEnumerable <ITagSpan <ClassificationTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            var result = _currentResult;

            foreach (var span in spans)
            {
                foreach (var token in result.GetTokens(span))
                {
                    if (token.IsEmpty)
                    {
                        continue;
                    }

                    var tokenType = _tokenizer.GetTokenType(token.Type);
                    if (tokenType == RadAsmTokenType.Identifier)
                    {
                        continue;
                    }

                    var tag = new ClassificationTag(_tokenClassification[tokenType]);
                    yield return(new TagSpan <ClassificationTag>(new SnapshotSpan(result.Snapshot, token.GetSpan(result.Snapshot)), tag));
                }
            }
        }
Esempio n. 2
0
        private void UpdateWordAdornments(SnapshotPoint currentRequest, CancellationToken cancellation)
        {
            var version = currentRequest.Snapshot;

            if (currentRequest == version.Length)
            {
                return;
            }

            var wordSpans    = new List <SnapshotSpan>();
            var bracketType  = BracketType.Lbracket;
            var lbracketType = RadAsmTokenType.Unknown;
            var rbracketType = RadAsmTokenType.Unknown;

            cancellation.ThrowIfCancellationRequested();
            var currentResult = _tokenizer.CurrentResult;
            var currentToken  = currentResult.GetToken(currentRequest);

            if (_tokenizer.GetTokenType(currentToken.Type) == RadAsmTokenType.Comment)
            {
                SynchronousUpdate(new NormalizedSnapshotSpanCollection(), null);
                return;
            }

            var ch = currentRequest.GetChar();

            if (ch == '(')
            {
                lbracketType = RadAsmTokenType.Lparen;
                rbracketType = RadAsmTokenType.Rparen;
            }
            else if (ch == '[')
            {
                lbracketType = RadAsmTokenType.LsquareBracket;
                rbracketType = RadAsmTokenType.RsquareBracket;
            }
            else if (ch == '{')
            {
                lbracketType = RadAsmTokenType.LcurveBracket;
                rbracketType = RadAsmTokenType.RcurveBracket;
            }
            else if (TryGetPreviousChar(currentRequest, out ch))
            {
                if (ch == ')')
                {
                    lbracketType = RadAsmTokenType.Lparen;
                    rbracketType = RadAsmTokenType.Rparen;
                }
                else if (ch == ']')
                {
                    lbracketType = RadAsmTokenType.LsquareBracket;
                    rbracketType = RadAsmTokenType.RsquareBracket;
                }
                else if (ch == '}')
                {
                    lbracketType = RadAsmTokenType.LcurveBracket;
                    rbracketType = RadAsmTokenType.RcurveBracket;
                }

                bracketType     = BracketType.Rbracket;
                currentRequest -= 1;
            }

            if (lbracketType == RadAsmTokenType.Unknown || rbracketType == RadAsmTokenType.Unknown)
            {
                SynchronousUpdate(new NormalizedSnapshotSpanCollection(), null);
                return;
            }

            var currentWord    = new SnapshotSpan(currentRequest, 1);
            var bracketCounter = 1;

            if (bracketType == BracketType.Lbracket)
            {
                var searchTokens = currentResult
                                   .GetTokens(new Span(currentWord.End, currentWord.Snapshot.Length - currentWord.End))
                                   .Where(t => IsLeftOrRightBracket(t.Type, lbracketType, rbracketType));

                foreach (var token in searchTokens)
                {
                    cancellation.ThrowIfCancellationRequested();

                    if (_tokenizer.GetTokenType(token.Type) == lbracketType)
                    {
                        bracketCounter++;
                    }
                    else
                    {
                        if (--bracketCounter == 0)
                        {
                            wordSpans.Add(new SnapshotSpan(version, token.GetSpan(version)));
                            break;
                        }
                    }
                }
            }
            else if (bracketType == BracketType.Rbracket)
            {
                var searchTokens = currentResult
                                   .GetTokens(new Span(0, currentWord.Start))
                                   .Where(t => IsLeftOrRightBracket(t.Type, lbracketType, rbracketType));

                foreach (var token in searchTokens.Reverse())
                {
                    cancellation.ThrowIfCancellationRequested();

                    if (_tokenizer.GetTokenType(token.Type) == rbracketType)
                    {
                        bracketCounter++;
                    }
                    else
                    {
                        if (--bracketCounter == 0)
                        {
                            wordSpans.Add(new SnapshotSpan(version, token.GetSpan(version)));
                            break;
                        }
                    }
                }
            }

            if (bracketCounter != 0)
            {
                SynchronousUpdate(new NormalizedSnapshotSpanCollection(), null);
                return;
            }

            cancellation.ThrowIfCancellationRequested();
            SynchronousUpdate(new NormalizedSnapshotSpanCollection(wordSpans), currentWord);
        }
Esempio n. 3
0
 private static bool IsTypeOf(this IDocumentTokenizer tokenizer, int tokenType,
                              RadAsmTokenType targetTokenType) =>
 tokenizer.GetTokenType(tokenType) == targetTokenType;