Skip to content

Commit

Permalink
fix handling of trailing lambdas in matchexpr
Browse files Browse the repository at this point in the history
  • Loading branch information
mtoohey31 committed Jan 22, 2024
1 parent 88ab23c commit 96d070c
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/scanner.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tree_sitter/parser.h>
Expand All @@ -14,6 +13,7 @@ enum TokenType {

struct scanner {
int close_braces_to_insert;
bool insert_open_brace;
int semis_to_insert;
bool no_final_semi_insert;
bool eof_semi_inserted;
Expand All @@ -25,6 +25,7 @@ struct scanner {

void scanner_reset(struct scanner *scanner) {
scanner->close_braces_to_insert = 0;
scanner->insert_open_brace = false;
scanner->semis_to_insert = 0;
scanner->no_final_semi_insert = false;
scanner->eof_semi_inserted = false;
Expand Down Expand Up @@ -191,6 +192,12 @@ bool tree_sitter_koka_external_scanner_scan(void *payload, TSLexer *lexer,
lexer->result_symbol = Semi;
return true;
}
if (scanner->insert_open_brace) {
scanner->insert_open_brace = false;
if (valid_symbols[OpenBrace])
lexer->result_symbol = OpenBrace;
return true;
}

lexer->mark_end(lexer);

Expand Down Expand Up @@ -302,6 +309,15 @@ bool tree_sitter_koka_external_scanner_scan(void *payload, TSLexer *lexer,
scanner->no_final_semi_insert = true;
}
lexer->result_symbol = Semi;

prev_indent_length =
scanner->stack_len != 0 ? scanner->stack[scanner->stack_len - 1] : 0;
if (prev_indent_length < indent_length) {
scanner->insert_open_brace = true;
scanner_push_indent(scanner, indent_length);
scanner->no_final_semi_insert = true;
}

return true;
}
}
Expand Down
70 changes: 70 additions & 0 deletions test/corpus/corpus.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3074,3 +3074,73 @@ fun foo()
(atom
(literal
(int))))))))))))))))))))))))

=========================
block argument with mask
=========================

fun foo() {
match mask<bar>
baz
Quux -> 32

---

(program
(moduledecl)
(modulebody
(topdecl
(puredecl
(funid
(identifier
(varid
(id))))
(funbody
(bodyexpr
(blockexpr
(expr
(block
(statements
(statement
(basicexpr
(matchexpr
(expr
(basicexpr
(opexpr
(prefixexpr
(appexpr
(appexpr
(atom
(mask
(tbasic
(typeapp
(typecon
(varid
(id))))))))
(block
(statements
(statement
(basicexpr
(opexpr
(prefixexpr
(appexpr
(atom
(qidentifier
(identifier
(varid
(id)))))))))))))))))
(matchrules
(matchrule
(patterns
(pattern
(qconstructor
(conid))))
(blockexpr
(expr
(basicexpr
(opexpr
(prefixexpr
(appexpr
(atom
(literal
(int))))))))))))))))))))))))

0 comments on commit 96d070c

Please sign in to comment.