summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien d'Herbais de Thun <sebastien.d.herbais@gmail.com>2024-09-02 15:27:33 +0200
committerGitHub <noreply@github.com>2024-09-02 13:27:33 +0000
commit1997db00f3908967dc381d9a84c0b246700e7112 (patch)
tree255c7da88d19d9f2da9decee5301c52d0be05bde
parentecad396cc8e6a0c5742314907181c939f61ab96d (diff)
Parenthesized imports (#4869)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
-rw-r--r--crates/typst-syntax/src/parser.rs18
-rw-r--r--tests/suite/scripting/import.typ43
2 files changed, 59 insertions, 2 deletions
diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs
index 4ce3917e..aa0431e9 100644
--- a/crates/typst-syntax/src/parser.rs
+++ b/crates/typst-syntax/src/parser.rs
@@ -989,9 +989,22 @@ fn module_import(p: &mut Parser) {
// imported at the same time.
p.expect(SyntaxKind::Ident);
}
- if p.eat_if(SyntaxKind::Colon) && !p.eat_if(SyntaxKind::Star) {
- import_items(p);
+
+ if p.eat_if(SyntaxKind::Colon) {
+ if p.at(SyntaxKind::LeftParen) {
+ let m1 = p.marker();
+ p.enter_newline_mode(NewlineMode::Continue);
+ p.assert(SyntaxKind::LeftParen);
+
+ import_items(p);
+
+ p.expect_closing_delimiter(m1, SyntaxKind::RightParen);
+ p.exit_newline_mode();
+ } else if !p.eat_if(SyntaxKind::Star) {
+ import_items(p);
+ }
}
+
p.wrap(m, SyntaxKind::ModuleImport);
}
@@ -1021,6 +1034,7 @@ fn import_items(p: &mut Parser) {
p.expect(SyntaxKind::Comma);
}
}
+
p.wrap(m, SyntaxKind::ImportItems);
}
diff --git a/tests/suite/scripting/import.typ b/tests/suite/scripting/import.typ
index 8bfa8ca6..8e2bc4b5 100644
--- a/tests/suite/scripting/import.typ
+++ b/tests/suite/scripting/import.typ
@@ -55,6 +55,49 @@
#test(name, "Klaus")
#test(othername, "Klaus")
+--- import-items-parenthesized ---
+#import "module.typ": ()
+#import "module.typ": (a)
+#import "module.typ": (a, b)
+#import "module.typ": (a, b, c, d)
+
+#test(a, none)
+#test(b, 1)
+#test(c, 2)
+#test(d, 3)
+
+--- import-items-parenthesized-multiline ---
+#import "module.typ": (
+ a
+)
+#import "module.typ": (
+ a, b as e,
+ c,
+
+
+ d,
+)
+
+#test(a, none)
+#test(e, 1)
+#test(c, 2)
+#test(d, 3)
+
+--- import-items-parenthesized-invalid ---
+// Error: 23-24 unclosed delimiter
+#import "module.typ": (a, b, c
+
+--- import-items-parenthesized-invalid-2 ---
+// Error: 23-24 unclosed delimiter
+#import "module.typ": (
+
+--- import-items-parenthesized-invalid-3 ---
+// Error: 23-24 unclosed delimiter
+#import "module.typ": (
+ a, b,
+ c,
+
+
--- import-from-function-scope ---
// Test importing from function scopes.