From b56ba4298465f72edb10a63117a87d33b0711ab0 Mon Sep 17 00:00:00 2001 From: Myriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com> Date: Wed, 16 Apr 2025 18:47:08 +0800 Subject: [PATCH] fix: the block is assumed to be used in expressions (#1668) --- crates/tinymist-lint/src/lib.rs | 7 +++++++ .../tinymist-query/src/fixtures/lint/return_loop3.typ | 10 ++++++++++ .../src/fixtures/lint/return_partial_if.typ | 7 +++++++ .../src/fixtures/lint/snaps/test@return_loop3.typ.snap | 6 ++++++ .../lint/snaps/test@return_partial_if.typ.snap | 6 ++++++ 5 files changed, 36 insertions(+) create mode 100644 crates/tinymist-query/src/fixtures/lint/return_loop3.typ create mode 100644 crates/tinymist-query/src/fixtures/lint/return_partial_if.typ create mode 100644 crates/tinymist-query/src/fixtures/lint/snaps/test@return_loop3.typ.snap create mode 100644 crates/tinymist-query/src/fixtures/lint/snaps/test@return_partial_if.typ.snap diff --git a/crates/tinymist-lint/src/lib.rs b/crates/tinymist-lint/src/lib.rs index a7b76d08..24a4d466 100644 --- a/crates/tinymist-lint/src/lib.rs +++ b/crates/tinymist-lint/src/lib.rs @@ -416,6 +416,10 @@ impl LateFuncLinter<'_, '_> { where F: FnOnce(&mut Self) -> Option<()>, { + let ctx = match ctx { + ExprContext::Block if self.expr_context != ExprContext::Block => ExprContext::BlockExpr, + a => a, + }; let old = std::mem::replace(&mut self.expr_context, ctx); f(self); self.expr_context = old; @@ -565,6 +569,7 @@ impl DataFlowVisitor for LateFuncLinter<'_, '_> { fn value(&mut self, expr: ast::Expr) -> Option<()> { match self.expr_context { ExprContext::Block => {} + ExprContext::BlockExpr => return None, ExprContext::Expr => return None, } @@ -1001,7 +1006,9 @@ impl BuggyBlockLoc<'_> { } } +#[derive(Clone, Copy, PartialEq, Eq)] enum ExprContext { + BlockExpr, Block, Expr, } diff --git a/crates/tinymist-query/src/fixtures/lint/return_loop3.typ b/crates/tinymist-query/src/fixtures/lint/return_loop3.typ new file mode 100644 index 00000000..59a76511 --- /dev/null +++ b/crates/tinymist-query/src/fixtures/lint/return_loop3.typ @@ -0,0 +1,10 @@ +#let mul-mat(..matrices) = { + matrices = matrices.pos() + let out = matrices.remove(0) + for matrix in matrices { + out = for i in range(m) { + (i,) + } + } + return out +} diff --git a/crates/tinymist-query/src/fixtures/lint/return_partial_if.typ b/crates/tinymist-query/src/fixtures/lint/return_partial_if.typ new file mode 100644 index 00000000..0e21d1c9 --- /dev/null +++ b/crates/tinymist-query/src/fixtures/lint/return_partial_if.typ @@ -0,0 +1,7 @@ +#let get-op(offset, op) = { + if op == none { + op = if offset < 0 { "<=" } else { ">=" } + } + + return op +} diff --git a/crates/tinymist-query/src/fixtures/lint/snaps/test@return_loop3.typ.snap b/crates/tinymist-query/src/fixtures/lint/snaps/test@return_loop3.typ.snap new file mode 100644 index 00000000..1262fe89 --- /dev/null +++ b/crates/tinymist-query/src/fixtures/lint/snaps/test@return_loop3.typ.snap @@ -0,0 +1,6 @@ +--- +source: crates/tinymist-query/src/analysis.rs +expression: "JsonRepr::new_redacted(result, &REDACT_LOC)" +input_file: crates/tinymist-query/src/fixtures/lint/return_loop3.typ +--- +{} diff --git a/crates/tinymist-query/src/fixtures/lint/snaps/test@return_partial_if.typ.snap b/crates/tinymist-query/src/fixtures/lint/snaps/test@return_partial_if.typ.snap new file mode 100644 index 00000000..6eb967b6 --- /dev/null +++ b/crates/tinymist-query/src/fixtures/lint/snaps/test@return_partial_if.typ.snap @@ -0,0 +1,6 @@ +--- +source: crates/tinymist-query/src/analysis.rs +expression: "JsonRepr::new_redacted(result, &REDACT_LOC)" +input_file: crates/tinymist-query/src/fixtures/lint/return_partial_if.typ +--- +{}