diff --git a/src/scanner.cc b/src/scanner.cc index 9f38a52bb..a14bcee79 100644 --- a/src/scanner.cc +++ b/src/scanner.cc @@ -844,8 +844,11 @@ struct Scanner { } // Open delimiters for literals - if (valid_symbols[IDENTIFIER_HASH_KEY] && iswalpha(lexer->lookahead)) { - while (iswalpha(lexer->lookahead)) advance(lexer); + if (valid_symbols[IDENTIFIER_HASH_KEY] + && (iswalpha(lexer->lookahead) || lexer->lookahead == '_')) { + while (iswalnum(lexer->lookahead) || lexer->lookahead == '_') { + advance(lexer); + } lexer->mark_end(lexer); if (lexer->lookahead == ':') { diff --git a/test/corpus/expressions.txt b/test/corpus/expressions.txt index 8c17d47c6..e195ab817 100644 --- a/test/corpus/expressions.txt +++ b/test/corpus/expressions.txt @@ -642,6 +642,25 @@ foo(bar(a),) (method_call (identifier) (argument_list (identifier) (identifier))) (method_call (identifier) (argument_list (method_call (identifier) (argument_list (identifier)))))) +============================================== +keyword arguments, no space, trailing comma +============================================== + +foo(a:b) +foo(a_:b) +foo(a2:b) +foo(a_:b,) +foo(a2:b,) + +--- + +(program + (method_call (identifier) (argument_list (pair (symbol) (identifier)))) + (method_call (identifier) (argument_list (pair (symbol) (identifier)))) + (method_call (identifier) (argument_list (pair (symbol) (identifier)))) + (method_call (identifier) (argument_list (pair (symbol) (identifier)))) + (method_call (identifier) (argument_list (pair (symbol) (identifier))))) + =============================== method call with receiver ===============================