summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 1c762d9..2feee4c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -56,15 +56,14 @@ fn parse(input: ParseStream, contains_paste: &mut bool) -> Result<TokenStream> {
let delimiter = group.delimiter();
let content = group.stream();
let span = group.span();
- let in_path = prev_colons || input.peek(Token![::]);
if delimiter == Delimiter::Bracket && is_paste_operation(&content) {
let segments = parse_bracket_as_segments.parse2(content)?;
let pasted = paste_segments(span, &segments)?;
pasted.to_tokens(&mut expanded);
*contains_paste = true;
- } else if is_none_delimited_single_ident_or_lifetime(delimiter, &content) {
+ } else if is_none_delimited_flat_group(delimiter, &content) {
content.to_tokens(&mut expanded);
- *contains_paste |= in_path;
+ *contains_paste = true;
} else {
let mut group_contains_paste = false;
let nested = (|input: ParseStream| parse(input, &mut group_contains_paste))
@@ -77,6 +76,7 @@ fn parse(input: ParseStream, contains_paste: &mut bool) -> Result<TokenStream> {
} else {
group.clone()
};
+ let in_path = prev_colons || input.peek(Token![::]);
if in_path && delimiter == Delimiter::None {
group.stream().to_tokens(&mut expanded);
*contains_paste = true;
@@ -99,7 +99,7 @@ fn is_paste_operation(input: &TokenStream) -> bool {
}
// https://github.com/dtolnay/paste/issues/26
-fn is_none_delimited_single_ident_or_lifetime(delimiter: Delimiter, input: &TokenStream) -> bool {
+fn is_none_delimited_flat_group(delimiter: Delimiter, input: &TokenStream) -> bool {
if delimiter != Delimiter::None {
return false;
}
@@ -108,20 +108,36 @@ fn is_none_delimited_single_ident_or_lifetime(delimiter: Delimiter, input: &Toke
enum State {
Init,
Ident,
+ Literal,
Apostrophe,
Lifetime,
+ Colon1,
+ Colon2,
}
let mut state = State::Init;
for tt in input.clone() {
state = match (state, &tt) {
(State::Init, TokenTree::Ident(_)) => State::Ident,
+ (State::Init, TokenTree::Literal(_)) => State::Literal,
(State::Init, TokenTree::Punct(punct)) if punct.as_char() == '\'' => State::Apostrophe,
(State::Apostrophe, TokenTree::Ident(_)) => State::Lifetime,
+ (State::Ident, TokenTree::Punct(punct))
+ if punct.as_char() == ':' && punct.spacing() == Spacing::Joint =>
+ {
+ State::Colon1
+ }
+ (State::Colon1, TokenTree::Punct(punct))
+ if punct.as_char() == ':' && punct.spacing() == Spacing::Alone =>
+ {
+ State::Colon2
+ }
+ (State::Colon2, TokenTree::Ident(_)) => State::Ident,
_ => return false,
};
}
- state == State::Ident || state == State::Lifetime
+
+ state == State::Ident || state == State::Literal || state == State::Lifetime
}
enum Segment {