<PackageReference Include="Microsoft.CSharp" Version="4.5.0-rc1" />

ExpressionIterator

namespace Microsoft.CSharp.RuntimeBinder.Semantics { internal class ExpressionIterator { private EXPRLIST _pList; private EXPR _pCurrent; public ExpressionIterator(EXPR pExpr) { Init(pExpr); } public bool AtEnd() { if (_pCurrent == null) return _pList == null; return false; } public EXPR Current() { return _pCurrent; } public void MoveNext() { if (!AtEnd()) { if (_pList == null) _pCurrent = null; else Init(_pList.GetOptionalNextListNode()); } } public static int Count(EXPR pExpr) { int num = 0; ExpressionIterator expressionIterator = new ExpressionIterator(pExpr); while (!expressionIterator.AtEnd()) { num++; expressionIterator.MoveNext(); } return num; } private void Init(EXPR pExpr) { if (pExpr == null) { _pList = null; _pCurrent = null; } else if (pExpr.isLIST()) { _pList = pExpr.asLIST(); _pCurrent = _pList.GetOptionalElement(); } else { _pList = null; _pCurrent = pExpr; } } } }