Пример #1
0
        private ScriptExpressionStatement ParseLiquidCycleStatement()
        {
            var statement    = Open <ScriptExpressionStatement>();
            var functionCall = Open <ScriptFunctionCall>();

            statement.Expression = functionCall;
            functionCall.Target  = ParseVariable();

            if (Options.LiquidFunctionsToScriban)
            {
                TransformLiquidFunctionCallToScriban(functionCall);
            }

            ScriptArrayInitializerExpression arrayInit = null;

            // Parse cycle without group: cycle "a", "b", "c" => transform to scriban: array.cycle ["a", "b", "c"]
            // Parse cycle with group: cycle "group1": "a", "b", "c" => transform to scriban: array.cycle ["a", "b", "c"] "group1"

            bool isFirst = true;

            while (IsVariableOrLiteral(Current))
            {
                var value = ParseVariableOrLiteral();

                if (isFirst && Current.Type == TokenType.Colon)
                {
                    var namedArg = Open <ScriptNamedArgument>();
                    namedArg.Name = new ScriptVariableGlobal("group");

                    namedArg.ColonToken = ScriptToken.Colon();
                    ExpectAndParseTokenTo(namedArg.ColonToken, TokenType.Colon); // Parse :

                    namedArg.Value = value;
                    Close(namedArg);
                    namedArg.Span = value.Span;

                    isFirst = false;
                    functionCall.Arguments.Add(namedArg);
                    continue;
                }

                if (arrayInit == null)
                {
                    arrayInit = Open <ScriptArrayInitializerExpression>();
                    functionCall.Arguments.Insert(0, arrayInit);
                    arrayInit.Span.Start = value.Span.Start;
                }

                arrayInit.Values.Add(value);
                arrayInit.Span.End = value.Span.End;

                if (Current.Type == TokenType.Comma)
                {
                    NextToken();
                }
                else if (Current.Type == TokenType.LiquidTagExit)
                {
                    break;
                }
                else
                {
                    LogError(Current, $"Unexpected token `{GetAsText(Current)}` after cycle value `{value}`. Expecting a `,`");
                    NextToken();
                    break;
                }
            }

            Close(functionCall);

            ExpectEndOfStatement();
            return(Close(statement));
        }
Пример #2
0
        private ScriptExpressionStatement ParseLiquidCycleStatement()
        {
            ScriptExpressionStatement statement    = Open <ScriptExpressionStatement>();
            ScriptFunctionCall        functionCall = Open <ScriptFunctionCall>();

            statement.Expression = functionCall;
            functionCall.Target  = ParseVariable();

            if (Options.ConvertLiquidFunctions)
            {
                TransformFromLiquidFunctionCall(functionCall);
            }

            ScriptArrayInitializerExpression arrayInit = null;

            // Parse cycle without group: cycle "a", "b", "c" => transform to textscript: array.cycle ["a", "b", "c"]
            // Parse cycle with group: cycle "group1": "a", "b", "c" => transform to textscript: array.cycle ["a", "b", "c"] "group1"

            bool isFirst = true;

            while (IsVariableOrLiteral(Current))
            {
                ScriptExpression value = ParseVariableOrLiteral();

                if (isFirst && Current.Type == TokenType.Colon)
                {
                    NextToken(); // Skip :
                    ScriptNamedArgument namedArg = Open <ScriptNamedArgument>();
                    namedArg.Name  = "group";
                    namedArg.Value = value;
                    Close(namedArg);
                    namedArg.Span = value.Span;

                    isFirst = false;
                    functionCall.Arguments.Add(namedArg);
                    continue;
                }

                if (arrayInit == null)
                {
                    arrayInit = Open <ScriptArrayInitializerExpression>();
                    functionCall.Arguments.Insert(0, arrayInit);
                    arrayInit.Span.Start = value.Span.Start;
                }

                arrayInit.Values.Add(value);
                arrayInit.Span.End = value.Span.End;

                if (Current.Type == TokenType.Comma)
                {
                    NextToken();
                }
                else if (Current.Type == TokenType.LiquidTagExit)
                {
                    break;
                }
                else
                {
                    LogError(Current, string.Format(RS.UnexpectedTokenAfterCycle, GetAsText(Current), value));
                    NextToken();
                    break;
                }
            }

            Close(functionCall);

            ExpectEndOfStatement(statement);
            return(Close(statement));
        }
Пример #3
0
        private ScriptExpression ParseArrayInitializer()
        {
            ScriptArrayInitializerExpression scriptArray = Open <ScriptArrayInitializerExpression>();

            // Should happen before the NextToken to consume any EOL after
            _allowNewLineLevel++;
            NextToken(); // Skip [

            bool expectingEndOfInitializer = false;

            // unit test: 120-array-initializer-accessor.txt
            while (true)
            {
                if (Current.Type == TokenType.CloseBracket)
                {
                    break;
                }

                if (!expectingEndOfInitializer)
                {
                    // unit test: 120-array-initializer-error2.txt
                    ScriptExpression expression = ExpectAndParseExpression(scriptArray);
                    if (expression == null)
                    {
                        break;
                    }

                    scriptArray.Values.Add(expression);

                    if (Current.Type == TokenType.Comma)
                    {
                        // Record trailing Commas
                        if (_isKeepTrivia)
                        {
                            expression.AddTrivia(new ScriptTrivia(CurrentSpan, ScriptTriviaType.Comma, _lexer.Text), false);
                        }

                        NextToken();

                        if (_isKeepTrivia && _trivias.Count > 0)
                        {
                            expression.AddTrivias(_trivias, false);
                            _trivias.Clear();
                        }
                    }
                    else
                    {
                        expectingEndOfInitializer = true;
                    }
                }
                else
                {
                    // unit test: 120-array-initializer-error1.txt
                    LogError(string.Format(RS.ArrayCloseBracketMismatch, Current.Type));
                    break;
                }
            }

            // Should happen before NextToken() to stop on the next EOF
            _allowNewLineLevel--;
            NextToken(); // Skip ]

            return(Close(scriptArray));
        }