From 9f8052ee667667a250e73ba310d8507ffa8c2446 Mon Sep 17 00:00:00 2001 From: Myriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com> Date: Thu, 28 Dec 2023 15:25:16 +0800 Subject: [PATCH] fix(lexer): test number of macro arguments before reading them (#85) * fix(lexer): test num of macro arguments before reading them * fix: env definition changed --- crates/mitex-lexer/src/macro_engine.rs | 5 +++++ crates/mitex-lexer/tests/expand_macro.rs | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/crates/mitex-lexer/src/macro_engine.rs b/crates/mitex-lexer/src/macro_engine.rs index 54bd5a3..8bbe96a 100644 --- a/crates/mitex-lexer/src/macro_engine.rs +++ b/crates/mitex-lexer/src/macro_engine.rs @@ -768,6 +768,7 @@ impl<'a> MacroEngine<'a> { Some((name, action, m)) } + // todo: insufficient macro arguments fn read_macro_args( ctx: &mut StreamContext<'a>, num_args: u8, @@ -775,6 +776,10 @@ impl<'a> MacroEngine<'a> { ) -> Option>>> { let mut args = Vec::with_capacity(num_args as usize); + if num_args == 0 { + return Some(args); + } + let mut num_of_read: u8 = 0; loop { match ctx.peek_not_trivia() { diff --git a/crates/mitex-lexer/tests/expand_macro.rs b/crates/mitex-lexer/tests/expand_macro.rs index 7479cb4..70d51aa 100644 --- a/crates/mitex-lexer/tests/expand_macro.rs +++ b/crates/mitex-lexer/tests/expand_macro.rs @@ -85,7 +85,12 @@ fn get_macro(input: &str, macro_name: &str) -> String { #[test] fn ignoring_unimplemented() { - assert_snapshot!(r#"\AtEndOfClass{code}"#, @r###"\AtEndOfClass{code}"###); + assert_snapshot!(tokens(r#"\AtEndOfClass{code}"#), @r###" + CommandName(Generic)("\\AtEndOfClass") + Left(Curly)("{") + Word("code") + Right(Curly)("}") + "###); } #[test] @@ -166,6 +171,9 @@ fn declare_macro() { #[test] fn subst_macro() { + // Description: zero arguments + assert_snapshot!(tokens(r#"\newcommand{\f}{f}\f"#), @r###"Word("f")"###); + // Description: reversed order of tokens assert_snapshot!(tokens(r#"\newcommand{\f}[2]{#1f(#2)}\f\hat xy"#), @r###" CommandName(Generic)("\\hat") Word("f") @@ -174,9 +182,10 @@ fn subst_macro() { Right(Paren)(")") Word("y") "###); - assert_snapshot!(tokens(r#"\newenvironment{f}[2]{begin}{end}\begin{f}test\end{f}"#), @r###" + // Description: environment with macro + assert_snapshot!(tokens(r#"\newenvironment{f}{begin}{end}\begin{f}test\end{f}"#), @r###" Word("begin") - Word("st") + Word("test") Word("end") "###); }