resharper/resharper-json/src/Json/Psi/Parsing/JsonNewLexer.cs (96 lines of code) (raw):

using System; using System.Text.RegularExpressions; using JetBrains.ReSharper.Psi.Parsing; using JetBrains.Text; using JetBrains.Util; namespace JetBrains.ReSharper.Plugins.Json.Psi.Parsing { public partial class JsonNewLexerGenerated { // ReSharper disable once InconsistentNaming private TokenNodeType currentTokenType; private struct TokenPosition { public TokenNodeType CurrentTokenType; public int YyBufferIndex; public int YyBufferStart; public int YyBufferEnd; public int YyLexicalState; } public void Start() { Start(0, yy_buffer.Length, YYINITIAL); } public void Start(int startOffset, int endOffset, uint state) { yy_buffer_index = yy_buffer_start = yy_buffer_end = startOffset; yy_eof_pos = endOffset; yy_lexical_state = (int) state; currentTokenType = null; } public void Advance() { LocateToken(); currentTokenType = null; } public object CurrentPosition { get { TokenPosition tokenPosition; tokenPosition.CurrentTokenType = currentTokenType; tokenPosition.YyBufferIndex = yy_buffer_index; tokenPosition.YyBufferStart = yy_buffer_start; tokenPosition.YyBufferEnd = yy_buffer_end; tokenPosition.YyLexicalState = yy_lexical_state; return tokenPosition; } set { var tokenPosition = (TokenPosition) value; currentTokenType = tokenPosition.CurrentTokenType; yy_buffer_index = tokenPosition.YyBufferIndex; yy_buffer_start = tokenPosition.YyBufferStart; yy_buffer_end = tokenPosition.YyBufferEnd; yy_lexical_state = tokenPosition.YyLexicalState; } } public TokenNodeType TokenType => LocateToken(); public int TokenStart { get { LocateToken(); return yy_buffer_start; } } public int TokenEnd { get { LocateToken(); return yy_buffer_end; } } public IBuffer Buffer => yy_buffer; public int EOFPos => yy_eof_pos; public int LexemIndent => 7; // No, I don't know why public uint LexerStateEx => (uint) yy_lexical_state; private TokenNodeType LocateToken() { if (currentTokenType == null) { try { currentTokenType = _locateToken(); } catch (Exception e) { e.AddDataSafe("TokenType", currentTokenType); e.AddDataSafe("LexerState", LexerStateEx); e.AddDataSafe("TokenStart", yy_buffer_start); e.AddDataSafe("TokenPos", yy_buffer_index); e.AddData("Buffer", () => { var start = Math.Max(0, yy_buffer_end); var tokenText = yy_buffer.GetText(new TextRange(start, yy_buffer_index)); tokenText = Regex.Replace(tokenText, @"\p{Cc}", a => string.Format("[{0:X2}]", (byte)a.Value[0])); return tokenText; }); throw; } } return currentTokenType; } } }