summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMyriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com>2024-12-16 22:09:38 +0800
committerGitHub <noreply@github.com>2024-12-16 14:09:38 +0000
commit1b10d19d76e2ddf09a63d00a6fc56556d2bbfe08 (patch)
tree0363a1b552d296f9d0e9a1c15d7304435dec01c2
parentd3620df4c63b5856832b23b26eba71aecd9f543e (diff)
Consider parameters when iterating items in scope (#5517)
-rw-r--r--crates/typst-ide/src/matchers.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/crates/typst-ide/src/matchers.rs b/crates/typst-ide/src/matchers.rs
index 4aeba29b..18262f70 100644
--- a/crates/typst-ide/src/matchers.rs
+++ b/crates/typst-ide/src/matchers.rs
@@ -123,6 +123,36 @@ pub fn named_items<T>(
}
}
+ if let Some(v) = parent.cast::<ast::Closure>().filter(|v| {
+ // Check if the node is in the body of the closure.
+ let body = parent.find(v.body().span());
+ body.is_some_and(|n| n.find(node.span()).is_some())
+ }) {
+ for param in v.params().children() {
+ match param {
+ ast::Param::Pos(pattern) => {
+ for ident in pattern.bindings() {
+ if let Some(t) = recv(NamedItem::Var(ident)) {
+ return Some(t);
+ }
+ }
+ }
+ ast::Param::Named(n) => {
+ if let Some(t) = recv(NamedItem::Var(n.name())) {
+ return Some(t);
+ }
+ }
+ ast::Param::Spread(s) => {
+ if let Some(sink_ident) = s.sink_ident() {
+ if let Some(t) = recv(NamedItem::Var(sink_ident)) {
+ return Some(t);
+ }
+ }
+ }
+ }
+ }
+ }
+
ancestor = Some(parent.clone());
continue;
}
@@ -270,6 +300,17 @@ mod tests {
}
#[test]
+ fn test_param_named_items() {
+ // Has named items
+ assert!(has_named_items(r#"#let f(a) = 1;#let b = 2;"#, 12, "a"));
+ assert!(has_named_items(r#"#let f(a: b) = 1;#let b = 2;"#, 15, "a"));
+
+ // Doesn't have named items
+ assert!(!has_named_items(r#"#let f(a) = 1;#let b = 2;"#, 19, "a"));
+ assert!(!has_named_items(r#"#let f(a: b) = 1;#let b = 2;"#, 15, "b"));
+ }
+
+ #[test]
fn test_import_named_items() {
// Cannot test much.
assert!(has_named_items(r#"#import "foo.typ": a; #(a);"#, 24, "a"));