(
&mut self,
span: &mut Span,
suppress: &FxHashSet<SmolStr>,
)
| 227 | } |
| 228 | |
| 229 | fn substitute_function_define( |
| 230 | &mut self, |
| 231 | span: &mut Span, |
| 232 | suppress: &FxHashSet<SmolStr>, |
| 233 | ) -> Result<bool, Diagnostic> { |
| 234 | let macro_name_token = get_token(&self.tokens[*self.i]); |
| 235 | let macro_name_span = get_span(&self.tokens[*self.i]); |
| 236 | let macro_name: SmolStr = macro_name_token.to_string().into(); |
| 237 | let Some((function_define_params, function_define_body)) = |
| 238 | self.function_defines.get(&*macro_name).cloned() |
| 239 | else { |
| 240 | return Ok(false); |
| 241 | }; |
| 242 | if suppress.contains(&*macro_name) { |
| 243 | return Ok(false); |
| 244 | } |
| 245 | if get_token(&self.tokens[*self.i + 1]) != &Token::LParen { |
| 246 | return Ok(false); |
| 247 | } |
| 248 | self.remove_token(span); |
| 249 | self.remove_token(span); |
| 250 | self.expect_no_eof()?; |
| 251 | let mut token = get_token(&self.tokens[*self.i]).clone(); |
| 252 | let mut args = vec![]; |
| 253 | let mut arg = vec![]; |
| 254 | if token != Token::RParen { |
| 255 | let mut parens = 0; |
| 256 | while parens >= 0 { |
| 257 | match token { |
| 258 | Token::LParen => { |
| 259 | parens += 1; |
| 260 | arg.push(token); |
| 261 | } |
| 262 | Token::RParen => { |
| 263 | parens -= 1; |
| 264 | if parens < 0 { |
| 265 | args.push(arg); |
| 266 | arg = vec![]; |
| 267 | } else { |
| 268 | arg.push(token); |
| 269 | } |
| 270 | } |
| 271 | Token::Comma if parens == 0 => { |
| 272 | args.push(arg); |
| 273 | arg = vec![]; |
| 274 | } |
| 275 | _ => { |
| 276 | arg.push(token); |
| 277 | } |
| 278 | } |
| 279 | self.remove_token(span); |
| 280 | token = get_token(&self.tokens[*self.i]).clone(); |
| 281 | } |
| 282 | } else { |
| 283 | self.remove_token(span); |
| 284 | } |
| 285 | if args.len() != function_define_params.len() { |
| 286 | return Err(Diagnostic { |
no test coverage detected