diff --git a/corpus/expressions.txt b/corpus/expressions.txt index 56e26694..e971fbc8 100644 --- a/corpus/expressions.txt +++ b/corpus/expressions.txt @@ -474,3 +474,39 @@ def f() = { (assignment_expression (identifier) (infix_expression (identifier) (operator_identifier) (identifier))) (enumerator (identifier) (call_expression (identifier) (arguments)) (guard (identifier)))) (block (call_expression (identifier) (arguments (identifier) (identifier)))))))) + +=============================== +Chained expressions +=============================== + +def main() { + val myList = List(1, 2, 3) + + myList.map(_ * 2) + + myList + .map(_ * 2) + + myList + .length +} + +--- + +(compilation_unit + (function_definition + (identifier) + (parameters) + (block + (val_definition (identifier) (call_expression + (identifier) + (arguments (integer_literal) (integer_literal) (integer_literal)))) + (call_expression + (field_expression (identifier) (identifier)) + (arguments (infix_expression + (identifier) (operator_identifier) (integer_literal)))) + (call_expression + (field_expression (identifier) (identifier)) + (arguments (infix_expression + (identifier) (operator_identifier) (integer_literal)))) + (field_expression (identifier) (identifier))))) diff --git a/src/scanner.c b/src/scanner.c index 85c8712a..16389b70 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -76,6 +76,10 @@ bool tree_sitter_scala_external_scanner_scan(void *payload, TSLexer *lexer, } if (valid_symbols[AUTOMATIC_SEMICOLON] && newline_count > 0) { + // NOTE: When there's a dot after a new line it could be a multi-line field + // expression, in which case we don't recognize it as an automatic semicolon. + if (lexer->lookahead == '.') return false; + lexer->mark_end(lexer); lexer->result_symbol = AUTOMATIC_SEMICOLON;