diff options
-rw-r--r-- | .cargo_vcs_info.json | 2 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | Cargo.toml.orig | 2 | ||||
-rw-r--r-- | METADATA | 4 | ||||
-rw-r--r-- | src/lib.rs | 26 |
5 files changed, 26 insertions, 10 deletions
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json index 1347e27..40fcd29 100644 --- a/.cargo_vcs_info.json +++ b/.cargo_vcs_info.json @@ -1,5 +1,5 @@ { "git": { - "sha1": "157559c3faf524ae24f8329537d2a763f6e18931" + "sha1": "b5ce9a40b201ffe985e13260f6b0fa9ef5330fd7" } } @@ -13,7 +13,7 @@ [package] edition = "2018" name = "paste-impl" -version = "0.1.14" +version = "0.1.15" authors = ["David Tolnay <dtolnay@gmail.com>"] description = "Implementation detail of the `paste` crate" license = "MIT OR Apache-2.0" diff --git a/Cargo.toml.orig b/Cargo.toml.orig index 80d2071..72a12ad 100644 --- a/Cargo.toml.orig +++ b/Cargo.toml.orig @@ -1,6 +1,6 @@ [package] name = "paste-impl" -version = "0.1.14" +version = "0.1.15" authors = ["David Tolnay <dtolnay@gmail.com>"] edition = "2018" license = "MIT OR Apache-2.0" @@ -9,11 +9,11 @@ third_party { type: GIT value: "https://github.com/dtolnay/paste" } - version: "0.1.14" + version: "0.1.15" license_type: NOTICE last_upgrade_date { year: 2020 month: 5 - day: 25 + day: 29 } } @@ -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 { |