ShaderTools.Hlsl.Parser.MacroArgumentsParser.ParseArgumentList C# (CSharp) Method

ParseArgumentList() public method

public ParseArgumentList ( ) : MacroArgumentListSyntax
return MacroArgumentListSyntax
        public MacroArgumentListSyntax ParseArgumentList()
        {
            var openParen = Match(SyntaxKind.OpenParenToken);

            var arguments = new List<SyntaxNode>();

            CommaIsSeparatorStack.Push(true);

            try
            {
                var currentArg = new List<SyntaxToken>();
                var parenStack = 0;
                while ((Current.Kind != SyntaxKind.CloseParenToken || parenStack > 0) && Current.Kind != SyntaxKind.EndOfFileToken)
                {
                    switch (Current.Kind)
                    {
                        case SyntaxKind.OpenParenToken:
                            CommaIsSeparatorStack.Push(false);
                            parenStack++;
                            currentArg.Add(NextToken());
                            break;
                        case SyntaxKind.CloseParenToken:
                            CommaIsSeparatorStack.Pop();
                            parenStack--;
                            currentArg.Add(NextToken());
                            break;
                        case SyntaxKind.CommaToken:
                            if (CommaIsSeparatorStack.Peek() == false)
                                goto default;
                            arguments.Add(new MacroArgumentSyntax(currentArg));
                            currentArg = new List<SyntaxToken>();
                            arguments.Add(Match(SyntaxKind.CommaToken));
                            break;
                        default:
                            currentArg.Add(NextToken());
                            break;
                    }
                }

                if (currentArg.Any())
                    arguments.Add(new MacroArgumentSyntax(currentArg));
            }
            finally
            {
                CommaIsSeparatorStack.Pop();
            }

            var argumentList = new SeparatedSyntaxList<MacroArgumentSyntax>(arguments);

            var closeParen = Match(SyntaxKind.CloseParenToken);

            return new MacroArgumentListSyntax(openParen, argumentList, closeParen);
        }
    }