test_parse_buffer.rs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #![allow(clippy::non_ascii_literal)]
  2. use proc_macro2::{Delimiter, Group, Punct, Spacing, TokenStream, TokenTree};
  3. use std::iter::FromIterator;
  4. use syn::parse::{discouraged::Speculative, Parse, ParseStream, Parser, Result};
  5. use syn::{parenthesized, Token};
  6. #[test]
  7. #[should_panic(expected = "Fork was not derived from the advancing parse stream")]
  8. fn smuggled_speculative_cursor_between_sources() {
  9. struct BreakRules;
  10. impl Parse for BreakRules {
  11. fn parse(input1: ParseStream) -> Result<Self> {
  12. let nested = |input2: ParseStream| {
  13. input1.advance_to(input2);
  14. Ok(Self)
  15. };
  16. nested.parse_str("")
  17. }
  18. }
  19. syn::parse_str::<BreakRules>("").unwrap();
  20. }
  21. #[test]
  22. #[should_panic(expected = "Fork was not derived from the advancing parse stream")]
  23. fn smuggled_speculative_cursor_between_brackets() {
  24. struct BreakRules;
  25. impl Parse for BreakRules {
  26. fn parse(input: ParseStream) -> Result<Self> {
  27. let a;
  28. let b;
  29. parenthesized!(a in input);
  30. parenthesized!(b in input);
  31. a.advance_to(&b);
  32. Ok(Self)
  33. }
  34. }
  35. syn::parse_str::<BreakRules>("()()").unwrap();
  36. }
  37. #[test]
  38. #[should_panic(expected = "Fork was not derived from the advancing parse stream")]
  39. fn smuggled_speculative_cursor_into_brackets() {
  40. struct BreakRules;
  41. impl Parse for BreakRules {
  42. fn parse(input: ParseStream) -> Result<Self> {
  43. let a;
  44. parenthesized!(a in input);
  45. input.advance_to(&a);
  46. Ok(Self)
  47. }
  48. }
  49. syn::parse_str::<BreakRules>("()").unwrap();
  50. }
  51. #[test]
  52. fn trailing_empty_none_group() {
  53. fn parse(input: ParseStream) -> Result<()> {
  54. input.parse::<Token![+]>()?;
  55. let content;
  56. parenthesized!(content in input);
  57. content.parse::<Token![+]>()?;
  58. Ok(())
  59. }
  60. // `+ ( + <Ø Ø> ) <Ø <Ø Ø> Ø>`
  61. let tokens = TokenStream::from_iter(vec![
  62. TokenTree::Punct(Punct::new('+', Spacing::Alone)),
  63. TokenTree::Group(Group::new(
  64. Delimiter::Parenthesis,
  65. TokenStream::from_iter(vec![
  66. TokenTree::Punct(Punct::new('+', Spacing::Alone)),
  67. TokenTree::Group(Group::new(Delimiter::None, TokenStream::new())),
  68. ]),
  69. )),
  70. TokenTree::Group(Group::new(Delimiter::None, TokenStream::new())),
  71. TokenTree::Group(Group::new(
  72. Delimiter::None,
  73. TokenStream::from_iter(vec![TokenTree::Group(Group::new(
  74. Delimiter::None,
  75. TokenStream::new(),
  76. ))]),
  77. )),
  78. ]);
  79. parse.parse2(tokens).unwrap();
  80. }