public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state) { if (_lexer == null) { return(false); } ScanTokenInfo info = _lexer.GetToken((ScanState)state); if (info == null) { return(false); } state = (int)info.State; _lastColor = (TokenColor)info.Color; _colorizeEnd = info.ColorizeEnd; tokenInfo.Color = _lastColor; tokenInfo.Type = (TokenType)info.Type; tokenInfo.Trigger = (TokenTriggers)info.Triggers; if (info.Token == null) { return(false); } tokenInfo.StartIndex = info.Token.Location.Column - 1; tokenInfo.EndIndex = info.Token.Location.EndColumn - 2; return(!info.IsEndOfLine); }
public BracketFinder(NemerleSource source, int startLine, int startCol, NemerleScanner scanner, IVsTextColorState colorState) { #region Init fields Scanner = scanner; Source = source; StartLine = startLine; Lex = scanner.GetNewLexer(); Lex.SetFileName(source.GetFilePath()); ColorState = colorState; _lineCount = source.GetLineCount(); var line = startLine - 1; _buffer = new string[1] { source.GetText(line, 0, line, source.GetLineLength(line)) }; _startBufferLine = line; #endregion #region 2. Determine that it is a paired token. 3. Determine paired token. // Get tokens of line under text carret into dynamic array. List <ScanTokenInfo> lineToks = GetLineTokens(startLine, true); // Find index of token which located under text carret. int index = FindIndex(lineToks, x => x.Token.Location.Contains(startLine, startCol)); if (index < 0) { return; } // If index is corret get corresponding token. ScanTokenInfo startBraceInfo = lineToks[index]; // Remember it, if token have paired token. if (IsPairedToken(startBraceInfo.Token)) { StartBraceInfo = startBraceInfo; } else { // otherwise try get right-hand token... startBraceInfo = RightHand(lineToks, index); // Remember it, if token have paired token. if (IsPairedToken(startBraceInfo.Token)) { StartBraceInfo = startBraceInfo; } } #endregion }
/// <summary> /// Implementation of<c>GetLineTokens</c>(). Don't use this method directly! /// </summary> IEnumerable <ScanTokenInfo> GetLineTokens(ScanLexer lex, ScanState scanState) { ScanTokenInfo info = lex.GetToken(scanState); scanState = info.State; while (!info.IsEndOfLine) { yield return(info); info = lex.GetToken(scanState); scanState = info.State; } }