Exemplo n.º 1
0
        private FunctionLikeDefineDirectiveTriviaSyntax ParseFunctionLikeDefineDirective(SyntaxToken hash, SyntaxToken keyword, SyntaxToken name, bool isActive)
        {
            var openParen = Match(SyntaxKind.OpenParenToken);

            var paramList = new List <SyntaxNode>();

            if (Current.Kind != SyntaxKind.CloseParenToken)
            {
                paramList.Add(Match(SyntaxKind.IdentifierToken));

                while (Current.Kind == SyntaxKind.CommaToken)
                {
                    paramList.Add(Match(SyntaxKind.CommaToken));
                    paramList.Add(Match(SyntaxKind.IdentifierToken));
                }
            }

            var closeParen = Match(SyntaxKind.CloseParenToken);

            var parameters = new FunctionLikeDefineDirectiveParameterListSyntax(openParen, new SeparatedSyntaxList <SyntaxToken>(paramList), closeParen);

            var body = new List <SyntaxToken>();

            while (Current.Kind != SyntaxKind.EndOfDirectiveToken)
            {
                body.Add(NextToken());
            }

            var eod = ParseEndOfDirective(name.IsMissing);

            return(new FunctionLikeDefineDirectiveTriviaSyntax(hash, keyword, name, parameters, body, eod, isActive));
        }
Exemplo n.º 2
0
        private FunctionLikeDefineDirectiveTriviaSyntax ParseFunctionLikeDefineDirective(SyntaxToken hash, SyntaxToken keyword, SyntaxToken name, bool isActive)
        {
            var openParen = Match(SyntaxKind.OpenParenToken);

            var paramList = new List<SyntaxNode>();
            if (Current.Kind != SyntaxKind.CloseParenToken)
            {
                paramList.Add(Match(SyntaxKind.IdentifierToken));

                while (Current.Kind == SyntaxKind.CommaToken)
                {
                    paramList.Add(Match(SyntaxKind.CommaToken));

                    switch (Current.Kind)
                    {
                        case SyntaxKind.IdentifierToken:
                            paramList.Add(Match(SyntaxKind.IdentifierToken));
                            break;

                        default:
                            if (Current.Kind.IsKeyword())
                            {
                                paramList.Add(NextToken().WithKind(SyntaxKind.IdentifierToken));
                                break;
                            }
                            goto case SyntaxKind.IdentifierToken;
                    }
                }
            }

            var closeParen = Match(SyntaxKind.CloseParenToken);

            var parameters = new FunctionLikeDefineDirectiveParameterListSyntax(openParen, new SeparatedSyntaxList<SyntaxToken>(paramList), closeParen);

            var body = new List<SyntaxToken>();
            while (Current.Kind != SyntaxKind.EndOfDirectiveToken)
                body.Add(NextToken());

            var eod = ParseEndOfDirective(name.IsMissing);

            return new FunctionLikeDefineDirectiveTriviaSyntax(hash, keyword, name, parameters, body, eod, isActive);
        }
Exemplo n.º 3
0
 public virtual void VisitFunctionLikeDefineDirectiveParameterList(FunctionLikeDefineDirectiveParameterListSyntax node)
 {
     DefaultVisit(node);
 }
Exemplo n.º 4
0
        private static List <SyntaxToken> ReplaceParameters(
            List <MacroArgumentSyntax> originalArguments,
            List <List <SyntaxToken> > expandedArguments,
            FunctionLikeDefineDirectiveParameterListSyntax parameterList,
            List <SyntaxToken> macroBody)
        {
            var parameters = parameterList.Parameters;

            var result = new List <SyntaxToken>();

            for (var i = 0; i < macroBody.Count; i++)
            {
                var token = macroBody[i];

                // Do token pasting (##).
                if (i < macroBody.Count - 2 &&
                    macroBody[i + 1].Kind == SyntaxKind.HashHashToken &&
                    macroBody[i + 2].Kind != SyntaxKind.EndOfFileToken &&
                    macroBody[i + 2].Kind != SyntaxKind.HashHashToken)
                {
                    var parameterIndexLeft = FindParameterIndex(parameters, token);
                    var pastedText         = (parameterIndexLeft != -1) ? originalArguments[parameterIndexLeft].ToString(true) : token.Text;

                    while (i < macroBody.Count - 2 &&
                           macroBody[i + 1].Kind == SyntaxKind.HashHashToken &&
                           macroBody[i + 2].Kind != SyntaxKind.EndOfFileToken &&
                           macroBody[i + 2].Kind != SyntaxKind.HashHashToken)
                    {
                        var parameterIndexRight = FindParameterIndex(parameters, macroBody[i + 2]);
                        var textRight           = (parameterIndexRight != -1) ? originalArguments[parameterIndexRight].ToString(true) : macroBody[i + 2].Text;
                        pastedText += textRight;
                        i          += 2;
                    }
                    result.AddRange(SyntaxFactory.ParseAllTokens(new StringText(pastedText)).TakeWhile(t => t.Kind != SyntaxKind.EndOfFileToken));
                    continue;
                }

                switch (token.Kind)
                {
                // Potentially stringify.
                case SyntaxKind.HashToken:
                {
                    if (i < macroBody.Count - 1 && macroBody[i + 1].Kind.IsIdentifierOrKeyword())
                    {
                        var parameterIndex = FindParameterIndex(parameters, macroBody[i + 1]);
                        if (parameterIndex != -1)
                        {
                            var stringifiedText = "\"" + originalArguments[parameterIndex].ToString(true) + "\"";
                            result.Add(SyntaxFactory.ParseToken(stringifiedText));
                            i++;
                            break;
                        }
                    }
                    goto default;
                }

                // Potentially replacement parameter with argument tokens.
                case SyntaxKind.IdentifierToken:
                {
                    var parameterIndex = FindParameterIndex(parameters, token);
                    if (parameterIndex != -1)
                    {
                        result.AddRange(expandedArguments[parameterIndex]);
                    }
                    else
                    {
                        result.Add(token);
                    }
                    break;
                }

                default:
                {
                    if (token.Kind.IsKeyword())
                    {
                        goto case SyntaxKind.IdentifierToken;
                    }
                    result.Add(token);
                    break;
                }
                }
            }

            return(result);
        }
Exemplo n.º 5
0
 public virtual void VisitFunctionLikeDefineDirectiveParameterList(FunctionLikeDefineDirectiveParameterListSyntax node)
 {
     DefaultVisit(node);
 }
Exemplo n.º 6
0
        private static List<SyntaxToken> ReplaceParameters(
            List<MacroArgumentSyntax> originalArguments,
            List<List<SyntaxToken>> expandedArguments,
            FunctionLikeDefineDirectiveParameterListSyntax parameterList,
            List<SyntaxToken> macroBody)
        {
            var parameters = parameterList.Parameters;

            var result = new List<SyntaxToken>();

            for (var i = 0; i < macroBody.Count; i++)
            {
                var token = macroBody[i];

                // Do token pasting (##).
                if (i < macroBody.Count - 2
                    && macroBody[i + 1].Kind == SyntaxKind.HashHashToken
                    && macroBody[i + 2].Kind != SyntaxKind.EndOfFileToken
                    && macroBody[i + 2].Kind != SyntaxKind.HashHashToken)
                {
                    var parameterIndexLeft = FindParameterIndex(parameters, token);
                    var pastedText = (parameterIndexLeft != -1) ? originalArguments[parameterIndexLeft].ToString(true) : token.Text;

                    while (i < macroBody.Count - 2
                        && macroBody[i + 1].Kind == SyntaxKind.HashHashToken
                        && macroBody[i + 2].Kind != SyntaxKind.EndOfFileToken
                        && macroBody[i + 2].Kind != SyntaxKind.HashHashToken)
                    {
                        var parameterIndexRight = FindParameterIndex(parameters, macroBody[i + 2]);
                        var textRight = (parameterIndexRight != -1) ? originalArguments[parameterIndexRight].ToString(true) : macroBody[i + 2].Text;
                        pastedText += textRight;
                        i += 2;
                    }
                    result.AddRange(SyntaxFactory.ParseAllTokens(new StringText(pastedText)).TakeWhile(t => t.Kind != SyntaxKind.EndOfFileToken));
                    continue;
                }

                switch (token.Kind)
                {
                    // Potentially stringify.
                    case SyntaxKind.HashToken:
                    {
                        if (i < macroBody.Count - 1 && macroBody[i + 1].Kind.IsIdentifierOrKeyword())
                        {
                            var parameterIndex = FindParameterIndex(parameters, macroBody[i + 1]);
                            if (parameterIndex != -1)
                            {
                                var stringifiedText = "\"" + originalArguments[parameterIndex].ToString(true) + "\"";
                                result.Add(SyntaxFactory.ParseToken(stringifiedText));
                                i++;
                                break;
                            }
                        }
                        goto default;
                    }

                    // Potentially replacement parameter with argument tokens.
                    case SyntaxKind.IdentifierToken:
                    {
                        var parameterIndex = FindParameterIndex(parameters, token);
                        if (parameterIndex != -1)
                            result.AddRange(expandedArguments[parameterIndex]);
                        else
                            result.Add(token);
                        break;
                    }

                    default:
                    {
                        if (token.Kind.IsKeyword())
                            goto case SyntaxKind.IdentifierToken;
                        result.Add(token);
                        break;
                    }
                }
            }

            return result;
        }