From 466fb7fe4d5a3aae896444ab718dfdee8b24fbcb Mon Sep 17 00:00:00 2001 From: Marceline Cramer Date: Thu, 30 Apr 2026 19:57:47 -0600 Subject: [PATCH] Assert tree-sitter validity in each AST test --- crates/frontend/src/workspace.rs | 16 ++++++++++++++++ crates/frontend/tests/ast.rs | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/crates/frontend/src/workspace.rs b/crates/frontend/src/workspace.rs index fc59a44..8797577 100644 --- a/crates/frontend/src/workspace.rs +++ b/crates/frontend/src/workspace.rs @@ -321,3 +321,19 @@ pub fn ast_syntax_errors(db: &dyn Database, ast: AstNode) { .for_each(|child| ast_syntax_errors(db, *child)); } } + +#[salsa::tracked] +pub fn file_has_syntax_error(db: &dyn Database, file: File) -> bool { + ast_has_syntax_error(db, file.ast(db)) +} + +#[salsa::tracked] +pub fn ast_has_syntax_error(db: &dyn Database, ast: AstNode) -> bool { + if ast.symbol(db) == "ERROR" { + true + } else { + ast.children(db) + .iter() + .any(|ast| ast_has_syntax_error(db, *ast)) + } +} diff --git a/crates/frontend/tests/ast.rs b/crates/frontend/tests/ast.rs index 0659e3a..193d8c2 100644 --- a/crates/frontend/tests/ast.rs +++ b/crates/frontend/tests/ast.rs @@ -38,6 +38,12 @@ fn test_ast(path: &Path) -> datatest_stable::Result<()> { let uri = lsp_types::Url::from_file_path(&path).unwrap(); let ed = Editor::new(&mut db, workspace, uri, &src); + // ensure tree-sitter has fully parsed + assert!( + !workspace::file_has_syntax_error(&db, ed.get_file()), + "test has syntax error" + ); + // list and parse top-level items ast::items(&db, ed.get_file()).into_iter().for_each(|meta| { ast::item(&db, meta);