protected static ArgumentBuilder CreateArgumentBuilder(Type type, ParameterInfo parameterInfo, ParserEntryData flatEntryData) { var parserEntry = flatEntryData.ParserEntry; return(parserEntry switch { IParserPredicate parserPredicateEntry => CreatePredicateArgumentBuilder(type, parserPredicateEntry), ParserSetMatchEntry parserSetMatchEntry => CreateLexerArgumentBuilder(type, null, parserSetMatchEntry), ParserSingleMatchEntry parserSingleMatchEntry => CreateLexerArgumentBuilder(type, null, parserSingleMatchEntry), ParserStateEntry parserStateEntry => CreateParserArgumentBuilder(type), _ => throw new ArgumentOutOfRangeException(nameof(parserEntry)) });
private static ArgumentBuilder CreatePredicateArgumentBuilder(Type type, IParserPredicate parserPredicateEntry) { if (parserPredicateEntry.PredicateKind == ParserPredicateKind.SubParser) { return(CreateParserArgumentBuilder(type)); } if (parserPredicateEntry.PredicateKind == ParserPredicateKind.SubLexer) { var tokenType = parserPredicateEntry.GetType().GetGenericArguments().Last().GetGenericArguments().Single(); return(CreateSubLexerArgumentBuilder(tokenType, type)); } throw new ArgumentOutOfRangeException(); }