aboutsummaryrefslogtreecommitdiff
path: root/src/doc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/doc.rs')
-rw-r--r--src/doc.rs90
1 files changed, 0 insertions, 90 deletions
diff --git a/src/doc.rs b/src/doc.rs
deleted file mode 100644
index 5fa2ad9..0000000
--- a/src/doc.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-use crate::error::Result;
-use crate::segment::{self, Segment};
-use proc_macro::{Delimiter, Span, TokenStream, TokenTree};
-use std::iter;
-use std::mem;
-use std::str::FromStr;
-
-pub fn is_pasted_doc(input: &TokenStream) -> bool {
- #[derive(PartialEq)]
- enum State {
- Init,
- Doc,
- Equal,
- First,
- Rest,
- }
-
- let mut state = State::Init;
- for tt in input.clone() {
- state = match (state, &tt) {
- (State::Init, TokenTree::Ident(ident)) if ident.to_string() == "doc" => State::Doc,
- (State::Doc, TokenTree::Punct(punct)) if punct.as_char() == '=' => State::Equal,
- (State::Equal, tt) if is_stringlike(tt) => State::First,
- (State::First, tt) | (State::Rest, tt) if is_stringlike(tt) => State::Rest,
- _ => return false,
- };
- }
-
- state == State::Rest
-}
-
-pub fn do_paste_doc(attr: &TokenStream, span: Span) -> Result<TokenStream> {
- let mut expanded = TokenStream::new();
- let mut tokens = attr.clone().into_iter().peekable();
- expanded.extend(tokens.by_ref().take(2)); // `doc =`
-
- let mut segments = segment::parse(&mut tokens)?;
-
- for segment in &mut segments {
- if let Segment::String(string) = segment {
- if let Some(open_quote) = string.value.find('"') {
- if open_quote == 0 {
- string.value.truncate(string.value.len() - 1);
- string.value.remove(0);
- } else {
- let begin = open_quote + 1;
- let end = string.value.rfind('"').unwrap();
- let raw_string = mem::replace(&mut string.value, String::new());
- for ch in raw_string[begin..end].chars() {
- string.value.extend(ch.escape_default());
- }
- }
- }
- }
- }
-
- let mut lit = segment::paste(&segments)?;
- lit.insert(0, '"');
- lit.push('"');
-
- let mut lit = TokenStream::from_str(&lit)
- .unwrap()
- .into_iter()
- .next()
- .unwrap();
- lit.set_span(span);
- expanded.extend(iter::once(lit));
- Ok(expanded)
-}
-
-fn is_stringlike(token: &TokenTree) -> bool {
- match token {
- TokenTree::Ident(_) => true,
- TokenTree::Literal(literal) => {
- let repr = literal.to_string();
- !repr.starts_with('b') && !repr.starts_with('\'')
- }
- TokenTree::Group(group) => {
- if group.delimiter() != Delimiter::None {
- return false;
- }
- let mut inner = group.stream().into_iter();
- match inner.next() {
- Some(first) => inner.next().is_none() && is_stringlike(&first),
- None => false,
- }
- }
- TokenTree::Punct(punct) => punct.as_char() == '\'' || punct.as_char() == ':',
- }
-}