Ejemplo n.º 1
0
        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;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }