From 1997db00f3908967dc381d9a84c0b246700e7112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Mon, 2 Sep 2024 15:27:33 +0200 Subject: [PATCH] Parenthesized imports (#4869) Co-authored-by: Laurenz --- crates/typst-syntax/src/parser.rs | 18 +++++++++++-- tests/suite/scripting/import.typ | 43 +++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs index 4ce3917e0..aa0431e9a 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 8bfa8ca68..8e2bc4b50 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.