public void ArrayPeekEnumerator_ShouldWorkForTwoElements() { var data = new int[] { 1, 2 }; var enumerator = new ArrayPeekEnumerator <int>(data); Assert.IsTrue(enumerator.TryPeek(out var first)); Assert.AreEqual(1, first); Assert.IsTrue(enumerator.TryPeek2(out first, out var second)); Assert.AreEqual(1, first); Assert.AreEqual(2, second); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(1, enumerator.Current); Assert.IsTrue(enumerator.TryPeek(out second)); Assert.IsFalse(enumerator.TryPeek2(out _, out _)); Assert.AreEqual(2, second); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(2, enumerator.Current); Assert.IsFalse(enumerator.TryPeek(out _)); Assert.IsFalse(enumerator.MoveNext()); }
public void ArrayPeekEnumerator_ShouldWorkForEmptyEnumerator() { var data = new int[0]; var enumerator = new ArrayPeekEnumerator <int>(data); Assert.IsFalse(enumerator.TryPeek(out _)); Assert.IsFalse(enumerator.TryPeek2(out _, out _)); Assert.IsFalse(enumerator.MoveNext()); Assert.IsFalse(enumerator.TryPeek(out _)); Assert.IsFalse(enumerator.TryPeek2(out _, out _)); }
protected void Recover(Action code, TokenKind syncTokenKind, string syncTokenText = null) { recoveryScopes_.Push(new ErrorRecoveryScope(syncTokenKind, syncTokenText)); try { code(); } catch (ErrorRecoveryException e) when(e.Scope == recoveryScopes_.Peek()) { } catch (NotImplementedException e) { EmitError(string.Format(Errors.NotImplemented, e.Message)); while (enumerator_.TryPeek(out var token)) { if (CanRecoverInParentScope(token.Kind, token.Text, out var scope)) { if (scope == recoveryScopes_.Peek()) { return; } else { throw new ErrorRecoveryException(scope); } } enumerator_.MoveNext(); } throw new ParsingException(Errors.UnexpectedEndOfFile, Span.Empty); } finally { recoveryScopes_.Pop(); } }