17ac06127Sopenharmony_ci#![allow(clippy::assertions_on_result_states)] 27ac06127Sopenharmony_ci 37ac06127Sopenharmony_ciuse proc_macro2::{Delimiter, Literal, Spacing, TokenStream, TokenTree}; 47ac06127Sopenharmony_ci 57ac06127Sopenharmony_ci// #[doc = "..."] -> "..." 67ac06127Sopenharmony_cifn lit_of_outer_doc_comment(tokens: &TokenStream) -> Literal { 77ac06127Sopenharmony_ci lit_of_doc_comment(tokens, false) 87ac06127Sopenharmony_ci} 97ac06127Sopenharmony_ci 107ac06127Sopenharmony_ci// #![doc = "..."] -> "..." 117ac06127Sopenharmony_cifn lit_of_inner_doc_comment(tokens: &TokenStream) -> Literal { 127ac06127Sopenharmony_ci lit_of_doc_comment(tokens, true) 137ac06127Sopenharmony_ci} 147ac06127Sopenharmony_ci 157ac06127Sopenharmony_cifn lit_of_doc_comment(tokens: &TokenStream, inner: bool) -> Literal { 167ac06127Sopenharmony_ci let mut iter = tokens.clone().into_iter(); 177ac06127Sopenharmony_ci match iter.next().unwrap() { 187ac06127Sopenharmony_ci TokenTree::Punct(punct) => { 197ac06127Sopenharmony_ci assert_eq!(punct.as_char(), '#'); 207ac06127Sopenharmony_ci assert_eq!(punct.spacing(), Spacing::Alone); 217ac06127Sopenharmony_ci } 227ac06127Sopenharmony_ci _ => panic!("wrong token {:?}", tokens), 237ac06127Sopenharmony_ci } 247ac06127Sopenharmony_ci if inner { 257ac06127Sopenharmony_ci match iter.next().unwrap() { 267ac06127Sopenharmony_ci TokenTree::Punct(punct) => { 277ac06127Sopenharmony_ci assert_eq!(punct.as_char(), '!'); 287ac06127Sopenharmony_ci assert_eq!(punct.spacing(), Spacing::Alone); 297ac06127Sopenharmony_ci } 307ac06127Sopenharmony_ci _ => panic!("wrong token {:?}", tokens), 317ac06127Sopenharmony_ci } 327ac06127Sopenharmony_ci } 337ac06127Sopenharmony_ci iter = match iter.next().unwrap() { 347ac06127Sopenharmony_ci TokenTree::Group(group) => { 357ac06127Sopenharmony_ci assert_eq!(group.delimiter(), Delimiter::Bracket); 367ac06127Sopenharmony_ci assert!(iter.next().is_none(), "unexpected token {:?}", tokens); 377ac06127Sopenharmony_ci group.stream().into_iter() 387ac06127Sopenharmony_ci } 397ac06127Sopenharmony_ci _ => panic!("wrong token {:?}", tokens), 407ac06127Sopenharmony_ci }; 417ac06127Sopenharmony_ci match iter.next().unwrap() { 427ac06127Sopenharmony_ci TokenTree::Ident(ident) => assert_eq!(ident.to_string(), "doc"), 437ac06127Sopenharmony_ci _ => panic!("wrong token {:?}", tokens), 447ac06127Sopenharmony_ci } 457ac06127Sopenharmony_ci match iter.next().unwrap() { 467ac06127Sopenharmony_ci TokenTree::Punct(punct) => { 477ac06127Sopenharmony_ci assert_eq!(punct.as_char(), '='); 487ac06127Sopenharmony_ci assert_eq!(punct.spacing(), Spacing::Alone); 497ac06127Sopenharmony_ci } 507ac06127Sopenharmony_ci _ => panic!("wrong token {:?}", tokens), 517ac06127Sopenharmony_ci } 527ac06127Sopenharmony_ci match iter.next().unwrap() { 537ac06127Sopenharmony_ci TokenTree::Literal(literal) => { 547ac06127Sopenharmony_ci assert!(iter.next().is_none(), "unexpected token {:?}", tokens); 557ac06127Sopenharmony_ci literal 567ac06127Sopenharmony_ci } 577ac06127Sopenharmony_ci _ => panic!("wrong token {:?}", tokens), 587ac06127Sopenharmony_ci } 597ac06127Sopenharmony_ci} 607ac06127Sopenharmony_ci 617ac06127Sopenharmony_ci#[test] 627ac06127Sopenharmony_cifn closed_immediately() { 637ac06127Sopenharmony_ci let stream = "/**/".parse::<TokenStream>().unwrap(); 647ac06127Sopenharmony_ci let tokens = stream.into_iter().collect::<Vec<_>>(); 657ac06127Sopenharmony_ci assert!(tokens.is_empty(), "not empty -- {:?}", tokens); 667ac06127Sopenharmony_ci} 677ac06127Sopenharmony_ci 687ac06127Sopenharmony_ci#[test] 697ac06127Sopenharmony_cifn incomplete() { 707ac06127Sopenharmony_ci assert!("/*/".parse::<TokenStream>().is_err()); 717ac06127Sopenharmony_ci} 727ac06127Sopenharmony_ci 737ac06127Sopenharmony_ci#[test] 747ac06127Sopenharmony_cifn lit() { 757ac06127Sopenharmony_ci let stream = "/// doc".parse::<TokenStream>().unwrap(); 767ac06127Sopenharmony_ci let lit = lit_of_outer_doc_comment(&stream); 777ac06127Sopenharmony_ci assert_eq!(lit.to_string(), "\" doc\""); 787ac06127Sopenharmony_ci 797ac06127Sopenharmony_ci let stream = "//! doc".parse::<TokenStream>().unwrap(); 807ac06127Sopenharmony_ci let lit = lit_of_inner_doc_comment(&stream); 817ac06127Sopenharmony_ci assert_eq!(lit.to_string(), "\" doc\""); 827ac06127Sopenharmony_ci 837ac06127Sopenharmony_ci let stream = "/** doc */".parse::<TokenStream>().unwrap(); 847ac06127Sopenharmony_ci let lit = lit_of_outer_doc_comment(&stream); 857ac06127Sopenharmony_ci assert_eq!(lit.to_string(), "\" doc \""); 867ac06127Sopenharmony_ci 877ac06127Sopenharmony_ci let stream = "/*! doc */".parse::<TokenStream>().unwrap(); 887ac06127Sopenharmony_ci let lit = lit_of_inner_doc_comment(&stream); 897ac06127Sopenharmony_ci assert_eq!(lit.to_string(), "\" doc \""); 907ac06127Sopenharmony_ci} 917ac06127Sopenharmony_ci 927ac06127Sopenharmony_ci#[test] 937ac06127Sopenharmony_cifn carriage_return() { 947ac06127Sopenharmony_ci let stream = "///\r\n".parse::<TokenStream>().unwrap(); 957ac06127Sopenharmony_ci let lit = lit_of_outer_doc_comment(&stream); 967ac06127Sopenharmony_ci assert_eq!(lit.to_string(), "\"\""); 977ac06127Sopenharmony_ci 987ac06127Sopenharmony_ci let stream = "/**\r\n*/".parse::<TokenStream>().unwrap(); 997ac06127Sopenharmony_ci let lit = lit_of_outer_doc_comment(&stream); 1007ac06127Sopenharmony_ci assert_eq!(lit.to_string(), "\"\\r\\n\""); 1017ac06127Sopenharmony_ci 1027ac06127Sopenharmony_ci "///\r".parse::<TokenStream>().unwrap_err(); 1037ac06127Sopenharmony_ci "///\r \n".parse::<TokenStream>().unwrap_err(); 1047ac06127Sopenharmony_ci "/**\r \n*/".parse::<TokenStream>().unwrap_err(); 1057ac06127Sopenharmony_ci} 106