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