protected void Reset(ref ResetPoint point) { var offset = point.Position - _firstToken; RoslynDebug.Assert(offset >= 0); if (offset >= _tokenCount) { // Re-fetch tokens to the position in the reset point PeekToken(offset - _tokenOffset); // Re-calculate new offset in case tokens got shifted to the left while we were peeking. offset = point.Position - _firstToken; } RoslynDebug.Assert(offset >= 0 && offset < _tokenCount); _tokenOffset = offset; _currentToken = null; _currentNode = default(BlendedNode); _prevTokenTrailingTrivia = point.PrevTokenTrailingTrivia; if (_blendedTokens != null) { // look forward for slots not holding a token for (var i = _tokenOffset; i < _tokenCount; i++) { if (_blendedTokens[i].Token == null) { // forget anything after and including any slot not holding a token _tokenCount = i; if (_tokenCount == _tokenOffset) { FetchCurrentToken(); } break; } } } }
protected GreenNode EatNode() { // we will fail anyways. Assert is just to catch that earlier. RoslynDebug.Assert(_blendedTokens != null); // remember result var result = CurrentNode.Green; // store possible non-token in token sequence if (_tokenOffset >= _blendedTokens.Length) { AddTokenSlot(); } _blendedTokens[_tokenOffset++] = _currentNode; _tokenCount = _tokenOffset; // forget anything after this slot // erase current state _currentNode = default(BlendedNode); _currentToken = null; return(result); }