private void SetNextExpectedArg( IItem item, ParserResult pr, ref IArgument expectedArg, ref IItem expectedArgItem) { List <IArgument> argList = item?.Arguments.ToList( ) ?? _spec.Arguments.ToList( ); if (item != null && expectedArg != null && _spec.Arguments.Contains(expectedArg)) { expectedArg = null; } if (expectedArg != null && expectedArg.IsDynamicArgument) { return; } IArgument arg, prevArg = null; while (true) { if (argList.Count == 0) { if (expectedArgItem != null) { expectedArg = expectedArgItem?.Arguments.FirstOrDefault(a => !pr.IsSet(a)) ?? expectedArgItem?.DynamicArgument; if (expectedArg == null) { expectedArgItem = null; } } if (expectedArg == null) { expectedArg = _spec.Arguments.FirstOrDefault(a => !pr.IsSet(a)); } return; } arg = argList[0]; if (expectedArg == null || prevArg == expectedArg) { expectedArg = arg; return; } argList.RemoveAt(0); prevArg = arg; } }