public static StringSegment ParseJsCallExpression(this StringSegment literal, out JsCallExpression expression, bool filterExpression = false) { literal = literal.ParseIdentifier(out var token); if (!(token is JsIdentifier identifier)) { throw new SyntaxErrorException($"Expected identifier but instead found '{token}'"); } literal = literal.AdvancePastWhitespace(); if (literal.IsNullOrEmpty() || literal.GetChar(0) != '(') { var isWhitespaceSyntax = filterExpression && literal.GetChar(0) == ':'; if (isWhitespaceSyntax) { literal = literal.Advance(1); // replace everything after ':' up till new line and rewrite as single string to method var endStringPos = literal.IndexOf("\n"); var endStatementPos = literal.IndexOf("}}"); if (endStringPos == -1 || (endStatementPos != -1 && endStatementPos < endStringPos)) { endStringPos = endStatementPos; } if (endStringPos == -1) { throw new SyntaxErrorException($"Whitespace sensitive syntax did not find a '\\n' new line to mark the end of the statement, near '{literal.SubstringWithElipsis(0,50)}'"); } var originalArg = literal.Subsegment(0, endStringPos).Trim().ToString(); var rewrittenArgs = originalArg.Replace("{", "{{").Replace("}", "}}"); var strArg = new JsLiteral(rewrittenArgs); expression = new JsCallExpression(identifier, strArg); return(literal.Subsegment(endStringPos)); } expression = new JsCallExpression(identifier); return(literal); } literal.Advance(1); literal = literal.ParseArguments(out var args, termination: ')'); expression = new JsCallExpression(identifier, args.ToArray()); return(literal); }
public static ReadOnlySpan <char> ParseJsCallExpression(this ReadOnlySpan <char> literal, out JsCallExpression expression, bool filterExpression = false) { literal = literal.ParseIdentifier(out var token); if (!(token is JsIdentifier identifier)) { throw new SyntaxErrorException($"Expected identifier but instead found {token.DebugToken()}"); } literal = literal.AdvancePastWhitespace(); if (literal.FirstCharEquals(WhitespaceArgument)) { literal = literal.Advance(1); literal = literal.ParseWhitespaceArgument(out var argument); expression = new JsCallExpression(identifier, argument); return(literal); } if (literal.StartsWith("=>")) { literal = literal.ParseArrowExpressionBody(new[] { new JsIdentifier("it") }, out var arrowExpr); expression = new JsCallExpression(identifier, arrowExpr); return(literal); } if (!literal.FirstCharEquals('(')) { expression = new JsCallExpression(identifier); return(literal); } literal = literal.Advance(1); literal = literal.ParseArguments(out var args, termination: ')'); expression = new JsCallExpression(identifier, args.ToArray()); return(literal); }