Example #1
0
        private MemberSyntax ParseFunctionDeclaration(List <SyntaxToken> prefixes)
        {
            var isPublic   = false;
            var isVirtual  = false;
            var isOverride = false;

            foreach (SyntaxToken s in prefixes)
            {
                switch (s.Kind)
                {
                case SyntaxKind.SetKeyword:
                    if (!isPublic)
                    {
                        isPublic = true;
                    }
                    else
                    {
                        _diagnostics.ReportMemberAlreadyRecieved(s.Location, s.Text);
                    }
                    break;

                case SyntaxKind.VirtualKeyword:
                    if (!isVirtual)
                    {
                        isVirtual = true;
                    }
                    else
                    {
                        _diagnostics.ReportMemberAlreadyRecieved(s.Location, s.Text);
                    }
                    break;

                case SyntaxKind.OverrideKeyword:
                    if (!isOverride)
                    {
                        isOverride = true;
                    }
                    else
                    {
                        _diagnostics.ReportMemberAlreadyRecieved(s.Location, s.Text);
                    }
                    break;

                case SyntaxKind.AbstractKeyword:
                    _diagnostics.ReportFunctionCantBeAbstract(s.Location);
                    break;

                default:
                    _diagnostics.ReportMemberCantUseModifier(s.Location, "Class", s.Text);
                    break;
                }
            }

            var functionKeyword       = MatchToken(SyntaxKind.FunctionKeyword);
            var identifier            = MatchToken(SyntaxKind.IdentifierToken);
            var openParenthesisToken  = MatchToken(SyntaxKind.OpenParenthesisToken);
            var parameters            = ParseParameterList();
            var closeParenthesisToken = MatchToken(SyntaxKind.CloseParenthesisToken);
            var type = ParseOptionalTypeClause();
            var body = ParseBlockStatement();

            return(new FunctionDeclarationSyntax(_syntaxTree, functionKeyword, identifier, openParenthesisToken, parameters, closeParenthesisToken, type, body, isPublic, isVirtual, isOverride));
        }