summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2020-05-27 19:45:19 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-05-27 19:45:19 +0000
commit61061177c7a8c916f042f42ff3d295c7457dde7d (patch)
treea33f77d49a0ca4530c7d4ddd15c1d87520e647c7
parent0f5729924099e9e6df1b89bcfa892b90fcefac7f (diff)
parentdfc35a2c85654d53298514ffc85469e7024a082a (diff)
downloadpaste-impl-61061177c7a8c916f042f42ff3d295c7457dde7d.tar.gz
Upgrade rust/crates/paste-impl to 0.1.14 am: dfc35a2c85
Change-Id: Ic3fd1a9e5d68dafa6317c6290b8309dfe955a833
-rw-r--r--.cargo_vcs_info.json2
-rw-r--r--Cargo.toml2
-rw-r--r--Cargo.toml.orig2
-rw-r--r--METADATA4
-rw-r--r--src/lib.rs62
5 files changed, 49 insertions, 23 deletions
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 326754d..1347e27 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
{
"git": {
- "sha1": "ff47f2f0bbba62fcb2f892f5c488265b3bd7156f"
+ "sha1": "157559c3faf524ae24f8329537d2a763f6e18931"
}
}
diff --git a/Cargo.toml b/Cargo.toml
index 5b7eaad..97a4cab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@
[package]
edition = "2018"
name = "paste-impl"
-version = "0.1.12"
+version = "0.1.14"
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 057e084..80d2071 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
[package]
name = "paste-impl"
-version = "0.1.12"
+version = "0.1.14"
authors = ["David Tolnay <dtolnay@gmail.com>"]
edition = "2018"
license = "MIT OR Apache-2.0"
diff --git a/METADATA b/METADATA
index b2cbadf..2b0d5de 100644
--- a/METADATA
+++ b/METADATA
@@ -9,11 +9,11 @@ third_party {
type: GIT
value: "https://github.com/dtolnay/paste"
}
- version: "0.1.12"
+ version: "0.1.14"
license_type: NOTICE
last_upgrade_date {
year: 2020
month: 5
- day: 4
+ day: 25
}
}
diff --git a/src/lib.rs b/src/lib.rs
index dce8bb0..1c762d9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -40,31 +40,57 @@ struct PasteInput {
impl Parse for PasteInput {
fn parse(input: ParseStream) -> Result<Self> {
- let mut expanded = TokenStream::new();
- while !input.is_empty() {
- match input.parse()? {
- TokenTree::Group(group) => {
- let delimiter = group.delimiter();
- let content = group.stream();
- let span = group.span();
- 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);
- } else if is_none_delimited_single_ident_or_lifetime(delimiter, &content) {
- content.to_tokens(&mut expanded);
- } else {
- let nested = PasteInput::parse.parse2(content)?;
- let mut group = Group::new(delimiter, nested.expanded);
+ let mut contains_paste = false;
+ let expanded = parse(input, &mut contains_paste)?;
+ Ok(PasteInput { expanded })
+ }
+}
+
+fn parse(input: ParseStream, contains_paste: &mut bool) -> Result<TokenStream> {
+ let mut expanded = TokenStream::new();
+ let (mut prev_colons, mut colons) = (false, false);
+ while !input.is_empty() {
+ let save = input.fork();
+ match input.parse()? {
+ TokenTree::Group(group) => {
+ 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) {
+ content.to_tokens(&mut expanded);
+ *contains_paste |= in_path;
+ } else {
+ let mut group_contains_paste = false;
+ let nested = (|input: ParseStream| parse(input, &mut group_contains_paste))
+ .parse2(content)?;
+ let group = if group_contains_paste {
+ let mut group = Group::new(delimiter, nested);
group.set_span(span);
+ *contains_paste = true;
+ group
+ } else {
+ group.clone()
+ };
+ if in_path && delimiter == Delimiter::None {
+ group.stream().to_tokens(&mut expanded);
+ *contains_paste = true;
+ } else {
group.to_tokens(&mut expanded);
}
}
- other => other.to_tokens(&mut expanded),
}
+ other => other.to_tokens(&mut expanded),
}
- Ok(PasteInput { expanded })
+ prev_colons = colons;
+ colons = save.peek(Token![::]);
}
+ Ok(expanded)
}
fn is_paste_operation(input: &TokenStream) -> bool {