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)); }
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)); }
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)); }