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)); } } }
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); }
private static bool IsTypeOf(this IDocumentTokenizer tokenizer, int tokenType, RadAsmTokenType targetTokenType) => tokenizer.GetTokenType(tokenType) == targetTokenType;