Пример #1
0
        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);
        }
Пример #2
0
        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);
        }