|
8 | 8 |
|
9 | 9 | #![allow(dead_code)] |
10 | 10 |
|
| 11 | +use proc_macro2::Delimiter; |
| 12 | +use syn::parse::discouraged::AnyDelimiter; |
11 | 13 | use syn::{Ident, LitStr, Token, parse::ParseStream}; |
12 | 14 |
|
13 | 15 | /// Parse a comma-separated list with optional trailing comma. |
@@ -52,8 +54,10 @@ pub fn parse_bracketed_list<T, F>(input: ParseStream, parser: F) -> syn::Result< |
52 | 54 | where |
53 | 55 | F: Fn(ParseStream) -> syn::Result<T>, |
54 | 56 | { |
55 | | - let content; |
56 | | - syn::bracketed!(content in input); |
| 57 | + let (delim, _span, content) = input.parse_any_delimiter()?; |
| 58 | + if delim != Delimiter::Bracket { |
| 59 | + return Err(content.error("expected brackets")); |
| 60 | + } |
57 | 61 | parse_comma_list(&content, parser) |
58 | 62 | } |
59 | 63 |
|
@@ -420,4 +424,50 @@ mod tests { |
420 | 424 | let items: Vec<i32> = result.unwrap(); |
421 | 425 | assert_eq!(items, vec![1, 2, 3]); |
422 | 426 | } |
| 427 | + |
| 428 | + #[test] |
| 429 | + fn test_parse_bracketed_list_wrong_delimiter_parens() { |
| 430 | + // Test parse_bracketed_list with parentheses instead of brackets - should error |
| 431 | + let parser = |input: ParseStream| { |
| 432 | + parse_bracketed_list(input, |input| { |
| 433 | + input.parse::<LitStr>().map(|lit| lit.value()) |
| 434 | + }) |
| 435 | + }; |
| 436 | + |
| 437 | + let tokens = quote::quote!(("a", "b")); |
| 438 | + let result = parser.parse2(tokens); |
| 439 | + assert!(result.is_err()); |
| 440 | + let err = result.unwrap_err(); |
| 441 | + assert!(err.to_string().contains("expected brackets")); |
| 442 | + } |
| 443 | + |
| 444 | + #[test] |
| 445 | + fn test_parse_bracketed_list_wrong_delimiter_braces() { |
| 446 | + // Test parse_bracketed_list with braces instead of brackets - should error |
| 447 | + let parser = |input: ParseStream| { |
| 448 | + parse_bracketed_list(input, |input| { |
| 449 | + input.parse::<LitStr>().map(|lit| lit.value()) |
| 450 | + }) |
| 451 | + }; |
| 452 | + |
| 453 | + let tokens = quote::quote!({"a", "b"}); |
| 454 | + let result = parser.parse2(tokens); |
| 455 | + assert!(result.is_err()); |
| 456 | + let err = result.unwrap_err(); |
| 457 | + assert!(err.to_string().contains("expected brackets")); |
| 458 | + } |
| 459 | + |
| 460 | + #[test] |
| 461 | + fn test_parse_bracketed_list_no_delimiter() { |
| 462 | + // Test parse_bracketed_list with no delimiter at all - should error |
| 463 | + let parser = |input: ParseStream| { |
| 464 | + parse_bracketed_list(input, |input| { |
| 465 | + input.parse::<LitStr>().map(|lit| lit.value()) |
| 466 | + }) |
| 467 | + }; |
| 468 | + |
| 469 | + let tokens = quote::quote!("just_a_string"); |
| 470 | + let result = parser.parse2(tokens); |
| 471 | + assert!(result.is_err()); |
| 472 | + } |
423 | 473 | } |
0 commit comments