From d9dabaff7cd6dd9b7df44b4425000f624bc3da79 Mon Sep 17 00:00:00 2001 From: Myriad-Dreamin Date: Mon, 8 Dec 2025 16:15:27 +0800 Subject: [PATCH] dev: record label ref --- crates/tinymist-analysis/src/syntax/def.rs | 6 ++++-- .../snaps/test@cross_file_ref_label.typ.snap | 1 + .../references/snaps/test@label.typ.snap | 1 + .../references/snaps/test@ref_label.typ.snap | 1 + .../fixtures/rename/snaps/test@label.typ.snap | 5 +++++ .../rename/snaps/test@label_content.typ.snap | 5 +++++ .../rename/snaps/test@label_indir.typ.snap | 5 +++++ .../rename/snaps/test@label_indir2.typ.snap | 5 +++++ crates/tinymist-query/src/syntax/expr.rs | 19 +++++++++++++++---- 9 files changed, 42 insertions(+), 6 deletions(-) diff --git a/crates/tinymist-analysis/src/syntax/def.rs b/crates/tinymist-analysis/src/syntax/def.rs index 041589448..1aac5a33e 100644 --- a/crates/tinymist-analysis/src/syntax/def.rs +++ b/crates/tinymist-analysis/src/syntax/def.rs @@ -122,8 +122,10 @@ impl ExprInfoRepr { self.resolves .iter() .filter(move |(_, r)| match (decl.as_ref(), r.decl.as_ref()) { - (Decl::Label(..), Decl::Label(..)) => r.decl == decl, - (Decl::Label(..), Decl::ContentRef(..)) => r.decl.name() == decl.name(), + (Decl::Label(..), Decl::Label(..)) + | (Decl::Label(..), Decl::ContentRef(..)) + | (Decl::ContentRef(..), Decl::Label(..)) + | (Decl::ContentRef(..), Decl::ContentRef(..)) => r.decl.name() == decl.name(), (Decl::Label(..), _) => false, _ => r.decl == decl || r.root == of, }) diff --git a/crates/tinymist-query/src/fixtures/references/snaps/test@cross_file_ref_label.typ.snap b/crates/tinymist-query/src/fixtures/references/snaps/test@cross_file_ref_label.typ.snap index fa85c975b..e5bc44209 100644 --- a/crates/tinymist-query/src/fixtures/references/snaps/test@cross_file_ref_label.typ.snap +++ b/crates/tinymist-query/src/fixtures/references/snaps/test@cross_file_ref_label.typ.snap @@ -4,6 +4,7 @@ expression: "JsonRepr::new_pure(result)" input_file: crates/tinymist-query/src/fixtures/references/cross_file_ref_label.typ --- [ + "base1.typ@0:11:0:13", "base1.typ@1:11:1:13", "base2.typ@1:11:1:13", "base2.typ@3:11:3:13", diff --git a/crates/tinymist-query/src/fixtures/references/snaps/test@label.typ.snap b/crates/tinymist-query/src/fixtures/references/snaps/test@label.typ.snap index 1d17363e5..bb7f874c5 100644 --- a/crates/tinymist-query/src/fixtures/references/snaps/test@label.typ.snap +++ b/crates/tinymist-query/src/fixtures/references/snaps/test@label.typ.snap @@ -4,5 +4,6 @@ expression: "JsonRepr::new_pure(result)" input_file: crates/tinymist-query/src/fixtures/references/label.typ --- [ + "s0.typ@3:11:3:22", "s0.typ@5:1:5:12" ] diff --git a/crates/tinymist-query/src/fixtures/references/snaps/test@ref_label.typ.snap b/crates/tinymist-query/src/fixtures/references/snaps/test@ref_label.typ.snap index c1e2f4cf9..f3f437fdd 100644 --- a/crates/tinymist-query/src/fixtures/references/snaps/test@ref_label.typ.snap +++ b/crates/tinymist-query/src/fixtures/references/snaps/test@ref_label.typ.snap @@ -4,6 +4,7 @@ expression: "JsonRepr::new_pure(result)" input_file: crates/tinymist-query/src/fixtures/references/ref_label.typ --- [ + "s0.typ@3:11:3:22", "s0.typ@5:1:5:12", "s0.typ@7:22:7:33", "s0.typ@9:1:9:12" diff --git a/crates/tinymist-query/src/fixtures/rename/snaps/test@label.typ.snap b/crates/tinymist-query/src/fixtures/rename/snaps/test@label.typ.snap index 521d58f38..54a05b798 100644 --- a/crates/tinymist-query/src/fixtures/rename/snaps/test@label.typ.snap +++ b/crates/tinymist-query/src/fixtures/rename/snaps/test@label.typ.snap @@ -14,6 +14,11 @@ input_file: crates/tinymist-query/src/fixtures/rename/label.typ "documentChanges": [ { "edits": [ + { + "annotationId": "Typst Rename Labels", + "newText": "new_name", + "range": "4:11:4:22" + }, { "annotationId": "Typst Rename Labels", "newText": "new_name", diff --git a/crates/tinymist-query/src/fixtures/rename/snaps/test@label_content.typ.snap b/crates/tinymist-query/src/fixtures/rename/snaps/test@label_content.typ.snap index 603bea10e..0ca2130ce 100644 --- a/crates/tinymist-query/src/fixtures/rename/snaps/test@label_content.typ.snap +++ b/crates/tinymist-query/src/fixtures/rename/snaps/test@label_content.typ.snap @@ -18,6 +18,11 @@ input_file: crates/tinymist-query/src/fixtures/rename/label_content.typ "annotationId": "Typst Rename Labels", "newText": "new_name", "range": "4:22:4:31" + }, + { + "annotationId": "Typst Rename Labels", + "newText": "new_name", + "range": "3:17:3:26" } ], "textDocument": { diff --git a/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir.typ.snap b/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir.typ.snap index 6e69f309d..068b5b433 100644 --- a/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir.typ.snap +++ b/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir.typ.snap @@ -18,6 +18,11 @@ input_file: crates/tinymist-query/src/fixtures/rename/label_indir.typ "annotationId": "Typst Rename Labels", "newText": "new_name", "range": "4:22:4:31" + }, + { + "annotationId": "Typst Rename Labels", + "newText": "new_name", + "range": "3:17:3:26" } ], "textDocument": { diff --git a/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir2.typ.snap b/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir2.typ.snap index f3953633c..59bbff113 100644 --- a/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir2.typ.snap +++ b/crates/tinymist-query/src/fixtures/rename/snaps/test@label_indir2.typ.snap @@ -18,6 +18,11 @@ input_file: crates/tinymist-query/src/fixtures/rename/label_indir2.typ "annotationId": "Typst Rename Labels", "newText": "new_name", "range": "8:22:8:31" + }, + { + "annotationId": "Typst Rename Labels", + "newText": "new_name", + "range": "7:17:7:26" } ], "textDocument": { diff --git a/crates/tinymist-query/src/syntax/expr.rs b/crates/tinymist-query/src/syntax/expr.rs index fe65df1c1..1746c3b64 100644 --- a/crates/tinymist-query/src/syntax/expr.rs +++ b/crates/tinymist-query/src/syntax/expr.rs @@ -399,10 +399,6 @@ impl ExprWorker<'_> { } } - fn check_label(&mut self, label: ast::Label) -> Expr { - Expr::Decl(Decl::label(label.get(), label.span()).into()) - } - fn check_element(&mut self, content: EcoVec) -> Expr { let elem = Element::of::(); Expr::Element(ElementExpr { elem, content }.into()) @@ -1105,6 +1101,21 @@ impl ExprWorker<'_> { Expr::Block(items.into()) } + fn check_label(&mut self, label: ast::Label) -> Expr { + let decl: Interned = Decl::label(label.get(), label.span()).into(); + + self.resolve_as( + RefExpr { + decl: decl.clone(), + step: None, + root: None, + term: None, + } + .into(), + ); + Expr::Decl(decl) + } + fn check_ref(&mut self, ref_node: ast::Ref) -> Expr { let ident = Interned::new(Decl::ref_(ref_node)); let body = ref_node