private static SyntaxNode ArgumentList(RParser.SublistContext args, Func<ParserRuleContext, Scope, SyntaxNode> transform, Scope scope) { var nodes = new List<ArgumentSyntax>(); foreach (var arg in args.sub()) { var argName = null as string; var value = null as ExpressionSyntax; if (arg is RParser.SubExpressionContext) value = (ExpressionSyntax)transform((arg as RParser.SubExpressionContext).expr(), scope); else if (arg is RParser.SubAssignmentContext) { var paramName = (arg as RParser.SubAssignmentContext); argName = paramName.ID().ToString(); value = (ExpressionSyntax)transform(paramName.expr(), scope); } else if (arg is RParser.SubStringAssignmentContext) { var paramName = (arg as RParser.SubStringAssignmentContext); argName = paramName.STRING().ToString(); value = (ExpressionSyntax)transform(paramName.expr(), scope); } else if (arg is RParser.SubIncompleteNullContext || arg is RParser.SubNullAssignmentContext) { throw new NotImplementedException(); } else if (arg is RParser.SubEllipsisContext) { throw new NotImplementedException(); } else if (arg is RParser.SubIncompleteAssignmentContext || arg is RParser.SubIncompleteStringContext || arg is RParser.SubIncompleteStringContext) { throw new NotImplementedException(); } else if (arg is RParser.SubEmptyContext) { continue; } else Debug.Assert(false); Debug.Assert(value != null); var result = CSharp.Argument(value); if (argName != null) result = result .WithNameColon(CSharp .NameColon(argName)); nodes.Add(result); } return CSharp .ArgumentList() .WithArguments(CSharp .SeparatedList(nodes)); }