aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2020-07-10 20:24:12 -0700
committerHaibo Huang <hhb@google.com>2020-07-10 20:24:12 -0700
commitebd269220e400c04811dc5dfe9af4b8ae97c237f (patch)
tree79fdc5ca1a7a1d8cbb5a14ad6da010dab6e0b47a
parentf6c26ee7ca6b50742ed1925d9ce1e9e3b5d465e7 (diff)
downloadplatform_external_rust_crates_quote-ebd269220e400c04811dc5dfe9af4b8ae97c237f.tar.gz
platform_external_rust_crates_quote-ebd269220e400c04811dc5dfe9af4b8ae97c237f.tar.bz2
platform_external_rust_crates_quote-ebd269220e400c04811dc5dfe9af4b8ae97c237f.zip
Upgrade rust/crates/quote to 1.0.7
Change-Id: I6207c5dd2c118a71e231970e0b07e7d809bb19e8
-rw-r--r--.cargo_vcs_info.json2
-rw-r--r--Cargo.toml2
-rw-r--r--Cargo.toml.orig2
-rw-r--r--METADATA6
-rw-r--r--src/lib.rs464
-rw-r--r--src/runtime.rs150
-rw-r--r--tests/test.rs26
7 files changed, 509 insertions, 143 deletions
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 067bf7b..e5a01fc 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
{
"git": {
- "sha1": "d67d687aebbc7d6f1692951a15ffff5cb2c33673"
+ "sha1": "9de44cd86e7feae4abba33c3392a2c37725527f9"
}
}
diff --git a/Cargo.toml b/Cargo.toml
index 6a004f9..c6dc281 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@
[package]
edition = "2018"
name = "quote"
-version = "1.0.6"
+version = "1.0.7"
authors = ["David Tolnay <dtolnay@gmail.com>"]
include = ["Cargo.toml", "src/**/*.rs", "tests/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
description = "Quasi-quoting macro quote!(...)"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 793de24..6c418fe 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
[package]
name = "quote"
-version = "1.0.6" # don't forget to update html_root_url, version in readme for breaking changes
+version = "1.0.7" # don't forget to update html_root_url, version in readme for breaking changes
authors = ["David Tolnay <dtolnay@gmail.com>"]
license = "MIT OR Apache-2.0"
description = "Quasi-quoting macro quote!(...)"
diff --git a/METADATA b/METADATA
index 6cef131..d23a56e 100644
--- a/METADATA
+++ b/METADATA
@@ -9,11 +9,11 @@ third_party {
type: GIT
value: "https://github.com/dtolnay/quote"
}
- version: "1.0.6"
+ version: "1.0.7"
license_type: NOTICE
last_upgrade_date {
year: 2020
- month: 5
- day: 18
+ month: 7
+ day: 10
}
}
diff --git a/src/lib.rs b/src/lib.rs
index dd7ef3c..6242909 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -81,9 +81,8 @@
//! ```
#![forbid(unsafe_code)]
-
// Quote types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/quote/1.0.6")]
+#![doc(html_root_url = "https://docs.rs/quote/1.0.7")]
#[cfg(all(
not(all(target_arch = "wasm32", target_os = "unknown")),
@@ -472,9 +471,14 @@ pub mod spanned;
/// ```
#[macro_export]
macro_rules! quote {
- ($($tt:tt)*) => {
- $crate::quote_spanned!($crate::__private::Span::call_site()=> $($tt)*)
+ () => {
+ $crate::__private::TokenStream::new()
};
+ ($($tt:tt)*) => {{
+ let mut _s = $crate::__private::TokenStream::new();
+ $crate::quote_each_token!(_s $($tt)*);
+ _s
+ }};
}
/// Same as `quote!`, but applies a given span to all tokens originating within
@@ -575,10 +579,14 @@ macro_rules! quote {
/// placed appropriately by the compiler.
#[macro_export]
macro_rules! quote_spanned {
+ ($span:expr=>) => {{
+ let _: $crate::__private::Span = $span;
+ $crate::__private::TokenStream::new()
+ }};
($span:expr=> $($tt:tt)*) => {{
let mut _s = $crate::__private::TokenStream::new();
let _span: $crate::__private::Span = $span;
- $crate::quote_each_token!(_s _span $($tt)*);
+ $crate::quote_each_token_spanned!(_s _span $($tt)*);
_s
}};
}
@@ -657,8 +665,24 @@ macro_rules! quote_bind_next_or_break {
#[macro_export]
#[doc(hidden)]
macro_rules! quote_each_token {
+ ($tokens:ident $($tts:tt)*) => {
+ $crate::quote_tokens_with_context!($tokens
+ (@ @ @ @ @ @ $($tts)*)
+ (@ @ @ @ @ $($tts)* @)
+ (@ @ @ @ $($tts)* @ @)
+ (@ @ @ $(($tts))* @ @ @)
+ (@ @ $($tts)* @ @ @ @)
+ (@ $($tts)* @ @ @ @ @)
+ ($($tts)* @ @ @ @ @ @)
+ );
+ };
+}
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! quote_each_token_spanned {
($tokens:ident $span:ident $($tts:tt)*) => {
- $crate::quote_tokens_with_context!($tokens $span
+ $crate::quote_tokens_with_context_spanned!($tokens $span
(@ @ @ @ @ @ $($tts)*)
(@ @ @ @ @ $($tts)* @)
(@ @ @ @ $($tts)* @ @)
@@ -673,13 +697,27 @@ macro_rules! quote_each_token {
#[macro_export]
#[doc(hidden)]
macro_rules! quote_tokens_with_context {
+ ($tokens:ident
+ ($($b3:tt)*) ($($b2:tt)*) ($($b1:tt)*)
+ ($($curr:tt)*)
+ ($($a1:tt)*) ($($a2:tt)*) ($($a3:tt)*)
+ ) => {
+ $(
+ $crate::quote_token_with_context!($tokens $b3 $b2 $b1 $curr $a1 $a2 $a3);
+ )*
+ };
+}
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! quote_tokens_with_context_spanned {
($tokens:ident $span:ident
($($b3:tt)*) ($($b2:tt)*) ($($b1:tt)*)
($($curr:tt)*)
($($a1:tt)*) ($($a2:tt)*) ($($a3:tt)*)
) => {
$(
- $crate::quote_token_with_context!($tokens $span $b3 $b2 $b1 $curr $a1 $a2 $a3);
+ $crate::quote_token_with_context_spanned!($tokens $span $b3 $b2 $b1 $curr $a1 $a2 $a3);
)*
};
}
@@ -687,6 +725,62 @@ macro_rules! quote_tokens_with_context {
#[macro_export]
#[doc(hidden)]
macro_rules! quote_token_with_context {
+ ($tokens:ident $b3:tt $b2:tt $b1:tt @ $a1:tt $a2:tt $a3:tt) => {};
+
+ ($tokens:ident $b3:tt $b2:tt $b1:tt (#) ( $($inner:tt)* ) * $a3:tt) => {{
+ use $crate::__private::ext::*;
+ let has_iter = $crate::__private::ThereIsNoIteratorInRepetition;
+ $crate::pounded_var_names!(quote_bind_into_iter!(has_iter) () $($inner)*);
+ let _: $crate::__private::HasIterator = has_iter;
+ // This is `while true` instead of `loop` because if there are no
+ // iterators used inside of this repetition then the body would not
+ // contain any `break`, so the compiler would emit unreachable code
+ // warnings on anything below the loop. We use has_iter to detect and
+ // fail to compile when there are no iterators, so here we just work
+ // around the unneeded extra warning.
+ while true {
+ $crate::pounded_var_names!(quote_bind_next_or_break!() () $($inner)*);
+ $crate::quote_each_token!($tokens $($inner)*);
+ }
+ }};
+ ($tokens:ident $b3:tt $b2:tt # (( $($inner:tt)* )) * $a2:tt $a3:tt) => {};
+ ($tokens:ident $b3:tt # ( $($inner:tt)* ) (*) $a1:tt $a2:tt $a3:tt) => {};
+
+ ($tokens:ident $b3:tt $b2:tt $b1:tt (#) ( $($inner:tt)* ) $sep:tt *) => {{
+ use $crate::__private::ext::*;
+ let mut _i = 0usize;
+ let has_iter = $crate::__private::ThereIsNoIteratorInRepetition;
+ $crate::pounded_var_names!(quote_bind_into_iter!(has_iter) () $($inner)*);
+ let _: $crate::__private::HasIterator = has_iter;
+ while true {
+ $crate::pounded_var_names!(quote_bind_next_or_break!() () $($inner)*);
+ if _i > 0 {
+ $crate::quote_token!($tokens $sep);
+ }
+ _i += 1;
+ $crate::quote_each_token!($tokens $($inner)*);
+ }
+ }};
+ ($tokens:ident $b3:tt $b2:tt # (( $($inner:tt)* )) $sep:tt * $a3:tt) => {};
+ ($tokens:ident $b3:tt # ( $($inner:tt)* ) ($sep:tt) * $a2:tt $a3:tt) => {};
+ ($tokens:ident # ( $($inner:tt)* ) * (*) $a1:tt $a2:tt $a3:tt) => {
+ // https://github.com/dtolnay/quote/issues/130
+ $crate::quote_token!($tokens *);
+ };
+ ($tokens:ident # ( $($inner:tt)* ) $sep:tt (*) $a1:tt $a2:tt $a3:tt) => {};
+
+ ($tokens:ident $b3:tt $b2:tt $b1:tt (#) $var:ident $a2:tt $a3:tt) => {
+ $crate::ToTokens::to_tokens(&$var, &mut $tokens);
+ };
+ ($tokens:ident $b3:tt $b2:tt # ($var:ident) $a1:tt $a2:tt $a3:tt) => {};
+ ($tokens:ident $b3:tt $b2:tt $b1:tt ($curr:tt) $a1:tt $a2:tt $a3:tt) => {
+ $crate::quote_token!($tokens $curr);
+ };
+}
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! quote_token_with_context_spanned {
($tokens:ident $span:ident $b3:tt $b2:tt $b1:tt @ $a1:tt $a2:tt $a3:tt) => {};
($tokens:ident $span:ident $b3:tt $b2:tt $b1:tt (#) ( $($inner:tt)* ) * $a3:tt) => {{
@@ -702,7 +796,7 @@ macro_rules! quote_token_with_context {
// around the unneeded extra warning.
while true {
$crate::pounded_var_names!(quote_bind_next_or_break!() () $($inner)*);
- $crate::quote_each_token!($tokens $span $($inner)*);
+ $crate::quote_each_token_spanned!($tokens $span $($inner)*);
}
}};
($tokens:ident $span:ident $b3:tt $b2:tt # (( $($inner:tt)* )) * $a2:tt $a3:tt) => {};
@@ -717,17 +811,17 @@ macro_rules! quote_token_with_context {
while true {
$crate::pounded_var_names!(quote_bind_next_or_break!() () $($inner)*);
if _i > 0 {
- $crate::quote_token!($tokens $span $sep);
+ $crate::quote_token_spanned!($tokens $span $sep);
}
_i += 1;
- $crate::quote_each_token!($tokens $span $($inner)*);
+ $crate::quote_each_token_spanned!($tokens $span $($inner)*);
}
}};
($tokens:ident $span:ident $b3:tt $b2:tt # (( $($inner:tt)* )) $sep:tt * $a3:tt) => {};
($tokens:ident $span:ident $b3:tt # ( $($inner:tt)* ) ($sep:tt) * $a2:tt $a3:tt) => {};
($tokens:ident $span:ident # ( $($inner:tt)* ) * (*) $a1:tt $a2:tt $a3:tt) => {
// https://github.com/dtolnay/quote/issues/130
- $crate::quote_token!($tokens $span *);
+ $crate::quote_token_spanned!($tokens $span *);
};
($tokens:ident $span:ident # ( $($inner:tt)* ) $sep:tt (*) $a1:tt $a2:tt $a3:tt) => {};
@@ -736,227 +830,433 @@ macro_rules! quote_token_with_context {
};
($tokens:ident $span:ident $b3:tt $b2:tt # ($var:ident) $a1:tt $a2:tt $a3:tt) => {};
($tokens:ident $span:ident $b3:tt $b2:tt $b1:tt ($curr:tt) $a1:tt $a2:tt $a3:tt) => {
- $crate::quote_token!($tokens $span $curr);
+ $crate::quote_token_spanned!($tokens $span $curr);
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! quote_token {
+ ($tokens:ident ( $($inner:tt)* )) => {
+ $crate::__private::push_group(
+ &mut $tokens,
+ $crate::__private::Delimiter::Parenthesis,
+ $crate::quote!($($inner)*),
+ );
+ };
+
+ ($tokens:ident [ $($inner:tt)* ]) => {
+ $crate::__private::push_group(
+ &mut $tokens,
+ $crate::__private::Delimiter::Bracket,
+ $crate::quote!($($inner)*),
+ );
+ };
+
+ ($tokens:ident { $($inner:tt)* }) => {
+ $crate::__private::push_group(
+ &mut $tokens,
+ $crate::__private::Delimiter::Brace,
+ $crate::quote!($($inner)*),
+ );
+ };
+
+ ($tokens:ident +) => {
+ $crate::__private::push_add(&mut $tokens);
+ };
+
+ ($tokens:ident +=) => {
+ $crate::__private::push_add_eq(&mut $tokens);
+ };
+
+ ($tokens:ident &) => {
+ $crate::__private::push_and(&mut $tokens);
+ };
+
+ ($tokens:ident &&) => {
+ $crate::__private::push_and_and(&mut $tokens);
+ };
+
+ ($tokens:ident &=) => {
+ $crate::__private::push_and_eq(&mut $tokens);
+ };
+
+ ($tokens:ident @) => {
+ $crate::__private::push_at(&mut $tokens);
+ };
+
+ ($tokens:ident !) => {
+ $crate::__private::push_bang(&mut $tokens);
+ };
+
+ ($tokens:ident ^) => {
+ $crate::__private::push_caret(&mut $tokens);
+ };
+
+ ($tokens:ident ^=) => {
+ $crate::__private::push_caret_eq(&mut $tokens);
+ };
+
+ ($tokens:ident :) => {
+ $crate::__private::push_colon(&mut $tokens);
+ };
+
+ ($tokens:ident ::) => {
+ $crate::__private::push_colon2(&mut $tokens);
+ };
+
+ ($tokens:ident ,) => {
+ $crate::__private::push_comma(&mut $tokens);
+ };
+
+ ($tokens:ident /) => {
+ $crate::__private::push_div(&mut $tokens);
+ };
+
+ ($tokens:ident /=) => {
+ $crate::__private::push_div_eq(&mut $tokens);
+ };
+
+ ($tokens:ident .) => {
+ $crate::__private::push_dot(&mut $tokens);
+ };
+
+ ($tokens:ident ..) => {
+ $crate::__private::push_dot2(&mut $tokens);
+ };
+
+ ($tokens:ident ...) => {
+ $crate::__private::push_dot3(&mut $tokens);
+ };
+
+ ($tokens:ident ..=) => {
+ $crate::__private::push_dot_dot_eq(&mut $tokens);
+ };
+
+ ($tokens:ident =) => {
+ $crate::__private::push_eq(&mut $tokens);
+ };
+
+ ($tokens:ident ==) => {
+ $crate::__private::push_eq_eq(&mut $tokens);
+ };
+
+ ($tokens:ident >=) => {
+ $crate::__private::push_ge(&mut $tokens);
+ };
+
+ ($tokens:ident >) => {
+ $crate::__private::push_gt(&mut $tokens);
+ };
+
+ ($tokens:ident <=) => {
+ $crate::__private::push_le(&mut $tokens);
+ };
+
+ ($tokens:ident <) => {
+ $crate::__private::push_lt(&mut $tokens);
+ };
+
+ ($tokens:ident *=) => {
+ $crate::__private::push_mul_eq(&mut $tokens);
+ };
+
+ ($tokens:ident !=) => {
+ $crate::__private::push_ne(&mut $tokens);
+ };
+
+ ($tokens:ident |) => {
+ $crate::__private::push_or(&mut $tokens);
+ };
+
+ ($tokens:ident |=) => {
+ $crate::__private::push_or_eq(&mut $tokens);
+ };
+
+ ($tokens:ident ||) => {
+ $crate::__private::push_or_or(&mut $tokens);
+ };
+
+ ($tokens:ident #) => {
+ $crate::__private::push_pound(&mut $tokens);
+ };
+
+ ($tokens:ident ?) => {
+ $crate::__private::push_question(&mut $tokens);
+ };
+
+ ($tokens:ident ->) => {
+ $crate::__private::push_rarrow(&mut $tokens);
+ };
+
+ ($tokens:ident <-) => {
+ $crate::__private::push_larrow(&mut $tokens);
+ };
+
+ ($tokens:ident %) => {
+ $crate::__private::push_rem(&mut $tokens);
+ };
+
+ ($tokens:ident %=) => {
+ $crate::__private::push_rem_eq(&mut $tokens);
+ };
+
+ ($tokens:ident =>) => {
+ $crate::__private::push_fat_arrow(&mut $tokens);
+ };
+
+ ($tokens:ident ;) => {
+ $crate::__private::push_semi(&mut $tokens);
+ };
+
+ ($tokens:ident <<) => {
+ $crate::__private::push_shl(&mut $tokens);
+ };
+
+ ($tokens:ident <<=) => {
+ $crate::__private::push_shl_eq(&mut $tokens);
+ };
+
+ ($tokens:ident >>) => {
+ $crate::__private::push_shr(&mut $tokens);
+ };
+
+ ($tokens:ident >>=) => {
+ $crate::__private::push_shr_eq(&mut $tokens);
+ };
+
+ ($tokens:ident *) => {
+ $crate::__private::push_star(&mut $tokens);
+ };
+
+ ($tokens:ident -) => {
+ $crate::__private::push_sub(&mut $tokens);
+ };
+
+ ($tokens:ident -=) => {
+ $crate::__private::push_sub_eq(&mut $tokens);
+ };
+
+ ($tokens:ident $ident:ident) => {
+ $crate::__private::push_ident(&mut $tokens, stringify!($ident));
+ };
+
+ ($tokens:ident $other:tt) => {
+ $crate::__private::parse(&mut $tokens, stringify!($other));
+ };
+}
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! quote_token_spanned {
($tokens:ident $span:ident ( $($inner:tt)* )) => {
- $tokens.extend({
- let mut g = $crate::__private::Group::new(
- $crate::__private::Delimiter::Parenthesis,
- $crate::quote_spanned!($span=> $($inner)*),
- );
- g.set_span($span);
- Some($crate::__private::TokenTree::from(g))
- });
+ $crate::__private::push_group_spanned(
+ &mut $tokens,
+ $span,
+ $crate::__private::Delimiter::Parenthesis,
+ $crate::quote_spanned!($span=> $($inner)*),
+ );
};
($tokens:ident $span:ident [ $($inner:tt)* ]) => {
- $tokens.extend({
- let mut g = $crate::__private::Group::new(
- $crate::__private::Delimiter::Bracket,
- $crate::quote_spanned!($span=> $($inner)*),
- );
- g.set_span($span);
- Some($crate::__private::TokenTree::from(g))
- });
+ $crate::__private::push_group_spanned(
+ &mut $tokens,
+ $span,
+ $crate::__private::Delimiter::Bracket,
+ $crate::quote_spanned!($span=> $($inner)*),
+ );
};
($tokens:ident $span:ident { $($inner:tt)* }) => {
- $tokens.extend({
- let mut g = $crate::__private::Group::new(
- $crate::__private::Delimiter::Brace,
- $crate::quote_spanned!($span=> $($inner)*),
- );
- g.set_span($span);
- Some($crate::__private::TokenTree::from(g))
- });
+ $crate::__private::push_group_spanned(
+ &mut $tokens,
+ $span,
+ $crate::__private::Delimiter::Brace,
+ $crate::quote_spanned!($span=> $($inner)*),
+ );
};
($tokens:ident $span:ident +) => {
- $crate::__private::push_add(&mut $tokens, $span);
+ $crate::__private::push_add_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident +=) => {
- $crate::__private::push_add_eq(&mut $tokens, $span);
+ $crate::__private::push_add_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident &) => {
- $crate::__private::push_and(&mut $tokens, $span);
+ $crate::__private::push_and_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident &&) => {
- $crate::__private::push_and_and(&mut $tokens, $span);
+ $crate::__private::push_and_and_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident &=) => {
- $crate::__private::push_and_eq(&mut $tokens, $span);
+ $crate::__private::push_and_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident @) => {
- $crate::__private::push_at(&mut $tokens, $span);
+ $crate::__private::push_at_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident !) => {
- $crate::__private::push_bang(&mut $tokens, $span);
+ $crate::__private::push_bang_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ^) => {
- $crate::__private::push_caret(&mut $tokens, $span);
+ $crate::__private::push_caret_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ^=) => {
- $crate::__private::push_caret_eq(&mut $tokens, $span);
+ $crate::__private::push_caret_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident :) => {
- $crate::__private::push_colon(&mut $tokens, $span);
+ $crate::__private::push_colon_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ::) => {
- $crate::__private::push_colon2(&mut $tokens, $span);
+ $crate::__private::push_colon2_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ,) => {
- $crate::__private::push_comma(&mut $tokens, $span);
+ $crate::__private::push_comma_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident /) => {
- $crate::__private::push_div(&mut $tokens, $span);
+ $crate::__private::push_div_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident /=) => {
- $crate::__private::push_div_eq(&mut $tokens, $span);
+ $crate::__private::push_div_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident .) => {
- $crate::__private::push_dot(&mut $tokens, $span);
+ $crate::__private::push_dot_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ..) => {
- $crate::__private::push_dot2(&mut $tokens, $span);
+ $crate::__private::push_dot2_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ...) => {
- $crate::__private::push_dot3(&mut $tokens, $span);
+ $crate::__private::push_dot3_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ..=) => {
- $crate::__private::push_dot_dot_eq(&mut $tokens, $span);
+ $crate::__private::push_dot_dot_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident =) => {
- $crate::__private::push_eq(&mut $tokens, $span);
+ $crate::__private::push_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ==) => {
- $crate::__private::push_eq_eq(&mut $tokens, $span);
+ $crate::__private::push_eq_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident >=) => {
- $crate::__private::push_ge(&mut $tokens, $span);
+ $crate::__private::push_ge_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident >) => {
- $crate::__private::push_gt(&mut $tokens, $span);
+ $crate::__private::push_gt_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident <=) => {
- $crate::__private::push_le(&mut $tokens, $span);
+ $crate::__private::push_le_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident <) => {
- $crate::__private::push_lt(&mut $tokens, $span);
+ $crate::__private::push_lt_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident *=) => {
- $crate::__private::push_mul_eq(&mut $tokens, $span);
+ $crate::__private::push_mul_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident !=) => {
- $crate::__private::push_ne(&mut $tokens, $span);
+ $crate::__private::push_ne_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident |) => {
- $crate::__private::push_or(&mut $tokens, $span);
+ $crate::__private::push_or_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident |=) => {
- $crate::__private::push_or_eq(&mut $tokens, $span);
+ $crate::__private::push_or_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ||) => {
- $crate::__private::push_or_or(&mut $tokens, $span);
+ $crate::__private::push_or_or_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident #) => {
- $crate::__private::push_pound(&mut $tokens, $span);
+ $crate::__private::push_pound_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ?) => {
- $crate::__private::push_question(&mut $tokens, $span);
+ $crate::__private::push_question_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ->) => {
- $crate::__private::push_rarrow(&mut $tokens, $span);
+ $crate::__private::push_rarrow_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident <-) => {
- $crate::__private::push_larrow(&mut $tokens, $span);
+ $crate::__private::push_larrow_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident %) => {
- $crate::__private::push_rem(&mut $tokens, $span);
+ $crate::__private::push_rem_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident %=) => {
- $crate::__private::push_rem_eq(&mut $tokens, $span);
+ $crate::__private::push_rem_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident =>) => {
- $crate::__private::push_fat_arrow(&mut $tokens, $span);
+ $crate::__private::push_fat_arrow_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident ;) => {
- $crate::__private::push_semi(&mut $tokens, $span);
+ $crate::__private::push_semi_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident <<) => {
- $crate::__private::push_shl(&mut $tokens, $span);
+ $crate::__private::push_shl_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident <<=) => {
- $crate::__private::push_shl_eq(&mut $tokens, $span);
+ $crate::__private::push_shl_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident >>) => {
- $crate::__private::push_shr(&mut $tokens, $span);
+ $crate::__private::push_shr_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident >>=) => {
- $crate::__private::push_shr_eq(&mut $tokens, $span);
+ $crate::__private::push_shr_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident *) => {
- $crate::__private::push_star(&mut $tokens, $span);
+ $crate::__private::push_star_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident -) => {
- $crate::__private::push_sub(&mut $tokens, $span);
+ $crate::__private::push_sub_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident -=) => {
- $crate::__private::push_sub_eq(&mut $tokens, $span);
+ $crate::__private::push_sub_eq_spanned(&mut $tokens, $span);
};
($tokens:ident $span:ident $ident:ident) => {
- $crate::__private::push_ident(&mut $tokens, $span, stringify!($ident));
+ $crate::__private::push_ident_spanned(&mut $tokens, $span, stringify!($ident));
};
($tokens:ident $span:ident $other:tt) => {
- $crate::__private::parse(&mut $tokens, $span, stringify!($other));
+ $crate::__private::parse_spanned(&mut $tokens, $span, stringify!($other));
};
}
diff --git a/src/runtime.rs b/src/runtime.rs
index bbdeb61..fe72687 100644
--- a/src/runtime.rs
+++ b/src/runtime.rs
@@ -180,7 +180,27 @@ impl<T: ToTokens> ToTokens for RepInterp<T> {
}
}
-pub fn parse(tokens: &mut TokenStream, span: Span, s: &str) {
+pub fn push_group(tokens: &mut TokenStream, delimiter: Delimiter, inner: TokenStream) {
+ tokens.append(Group::new(delimiter, inner));
+}
+
+pub fn push_group_spanned(
+ tokens: &mut TokenStream,
+ span: Span,
+ delimiter: Delimiter,
+ inner: TokenStream,
+) {
+ let mut g = Group::new(delimiter, inner);
+ g.set_span(span);
+ tokens.append(g);
+}
+
+pub fn parse(tokens: &mut TokenStream, s: &str) {
+ let s: TokenStream = s.parse().expect("invalid token stream");
+ tokens.extend(s);
+}
+
+pub fn parse_spanned(tokens: &mut TokenStream, span: Span, s: &str) {
let s: TokenStream = s.parse().expect("invalid token stream");
tokens.extend(s.into_iter().map(|mut t| {
t.set_span(span);
@@ -188,28 +208,47 @@ pub fn parse(tokens: &mut TokenStream, span: Span, s: &str) {
}));
}
-pub fn push_ident(tokens: &mut TokenStream, span: Span, s: &str) {
+pub fn push_ident(tokens: &mut TokenStream, s: &str) {
// Optimization over `mk_ident`, as `s` is guaranteed to be a valid ident.
//
// FIXME: When `Ident::new_raw` becomes stable, this method should be
// updated to call it when available.
if s.starts_with("r#") {
- parse(tokens, span, s);
+ parse(tokens, s);
+ } else {
+ tokens.append(Ident::new(s, Span::call_site()));
+ }
+}
+
+pub fn push_ident_spanned(tokens: &mut TokenStream, span: Span, s: &str) {
+ // Optimization over `mk_ident`, as `s` is guaranteed to be a valid ident.
+ //
+ // FIXME: When `Ident::new_raw` becomes stable, this method should be
+ // updated to call it when available.
+ if s.starts_with("r#") {
+ parse_spanned(tokens, span, s);
} else {
tokens.append(Ident::new(s, span));
}
}
macro_rules! push_punct {
- ($name:ident $char1:tt) => {
- pub fn $name(tokens: &mut TokenStream, span: Span) {
+ ($name:ident $spanned:ident $char1:tt) => {
+ pub fn $name(tokens: &mut TokenStream) {
+ tokens.append(Punct::new($char1, Spacing::Alone));
+ }
+ pub fn $spanned(tokens: &mut TokenStream, span: Span) {
let mut punct = Punct::new($char1, Spacing::Alone);
punct.set_span(span);
tokens.append(punct);
}
};
- ($name:ident $char1:tt $char2:tt) => {
- pub fn $name(tokens: &mut TokenStream, span: Span) {
+ ($name:ident $spanned:ident $char1:tt $char2:tt) => {
+ pub fn $name(tokens: &mut TokenStream) {
+ tokens.append(Punct::new($char1, Spacing::Joint));
+ tokens.append(Punct::new($char2, Spacing::Alone));
+ }
+ pub fn $spanned(tokens: &mut TokenStream, span: Span) {
let mut punct = Punct::new($char1, Spacing::Joint);
punct.set_span(span);
tokens.append(punct);
@@ -218,8 +257,13 @@ macro_rules! push_punct {
tokens.append(punct);
}
};
- ($name:ident $char1:tt $char2:tt $char3:tt) => {
- pub fn $name(tokens: &mut TokenStream, span: Span) {
+ ($name:ident $spanned:ident $char1:tt $char2:tt $char3:tt) => {
+ pub fn $name(tokens: &mut TokenStream) {
+ tokens.append(Punct::new($char1, Spacing::Joint));
+ tokens.append(Punct::new($char2, Spacing::Joint));
+ tokens.append(Punct::new($char3, Spacing::Alone));
+ }
+ pub fn $spanned(tokens: &mut TokenStream, span: Span) {
let mut punct = Punct::new($char1, Spacing::Joint);
punct.set_span(span);
tokens.append(punct);
@@ -233,50 +277,50 @@ macro_rules! push_punct {
};
}
-push_punct!(push_add '+');
-push_punct!(push_add_eq '+' '=');
-push_punct!(push_and '&');
-push_punct!(push_and_and '&' '&');
-push_punct!(push_and_eq '&' '=');
-push_punct!(push_at '@');
-push_punct!(push_bang '!');
-push_punct!(push_caret '^');
-push_punct!(push_caret_eq '^' '=');
-push_punct!(push_colon ':');
-push_punct!(push_colon2 ':' ':');
-push_punct!(push_comma ',');
-push_punct!(push_div '/');
-push_punct!(push_div_eq '/' '=');
-push_punct!(push_dot '.');
-push_punct!(push_dot2 '.' '.');
-push_punct!(push_dot3 '.' '.' '.');
-push_punct!(push_dot_dot_eq '.' '.' '=');
-push_punct!(push_eq '=');
-push_punct!(push_eq_eq '=' '=');
-push_punct!(push_ge '>' '=');
-push_punct!(push_gt '>');
-push_punct!(push_le '<' '=');
-push_punct!(push_lt '<');
-push_punct!(push_mul_eq '*' '=');
-push_punct!(push_ne '!' '=');
-push_punct!(push_or '|');
-push_punct!(push_or_eq '|' '=');
-push_punct!(push_or_or '|' '|');
-push_punct!(push_pound '#');
-push_punct!(push_question '?');
-push_punct!(push_rarrow '-' '>');
-push_punct!(push_larrow '<' '-');
-push_punct!(push_rem '%');
-push_punct!(push_rem_eq '%' '=');
-push_punct!(push_fat_arrow '=' '>');
-push_punct!(push_semi ';');
-push_punct!(push_shl '<' '<');
-push_punct!(push_shl_eq '<' '<' '=');
-push_punct!(push_shr '>' '>');
-push_punct!(push_shr_eq '>' '>' '=');
-push_punct!(push_star '*');
-push_punct!(push_sub '-');
-push_punct!(push_sub_eq '-' '=');
+push_punct!(push_add push_add_spanned '+');
+push_punct!(push_add_eq push_add_eq_spanned '+' '=');
+push_punct!(push_and push_and_spanned '&');
+push_punct!(push_and_and push_and_and_spanned '&' '&');
+push_punct!(push_and_eq push_and_eq_spanned '&' '=');
+push_punct!(push_at push_at_spanned '@');
+push_punct!(push_bang push_bang_spanned '!');
+push_punct!(push_caret push_caret_spanned '^');
+push_punct!(push_caret_eq push_caret_eq_spanned '^' '=');
+push_punct!(push_colon push_colon_spanned ':');
+push_punct!(push_colon2 push_colon2_spanned ':' ':');
+push_punct!(push_comma push_comma_spanned ',');
+push_punct!(push_div push_div_spanned '/');
+push_punct!(push_div_eq push_div_eq_spanned '/' '=');
+push_punct!(push_dot push_dot_spanned '.');
+push_punct!(push_dot2 push_dot2_spanned '.' '.');
+push_punct!(push_dot3 push_dot3_spanned '.' '.' '.');
+push_punct!(push_dot_dot_eq push_dot_dot_eq_spanned '.' '.' '=');
+push_punct!(push_eq push_eq_spanned '=');
+push_punct!(push_eq_eq push_eq_eq_spanned '=' '=');
+push_punct!(push_ge push_ge_spanned '>' '=');
+push_punct!(push_gt push_gt_spanned '>');
+push_punct!(push_le push_le_spanned '<' '=');
+push_punct!(push_lt push_lt_spanned '<');
+push_punct!(push_mul_eq push_mul_eq_spanned '*' '=');
+push_punct!(push_ne push_ne_spanned '!' '=');
+push_punct!(push_or push_or_spanned '|');
+push_punct!(push_or_eq push_or_eq_spanned '|' '=');
+push_punct!(push_or_or push_or_or_spanned '|' '|');
+push_punct!(push_pound push_pound_spanned '#');
+push_punct!(push_question push_question_spanned '?');
+push_punct!(push_rarrow push_rarrow_spanned '-' '>');
+push_punct!(push_larrow push_larrow_spanned '<' '-');
+push_punct!(push_rem push_rem_spanned '%');
+push_punct!(push_rem_eq push_rem_eq_spanned '%' '=');
+push_punct!(push_fat_arrow push_fat_arrow_spanned '=' '>');
+push_punct!(push_semi push_semi_spanned ';');
+push_punct!(push_shl push_shl_spanned '<' '<');
+push_punct!(push_shl_eq push_shl_eq_spanned '<' '<' '=');
+push_punct!(push_shr push_shr_spanned '>' '>');
+push_punct!(push_shr_eq push_shr_eq_spanned '>' '>' '=');
+push_punct!(push_star push_star_spanned '*');
+push_punct!(push_sub push_sub_spanned '-');
+push_punct!(push_sub_eq push_sub_eq_spanned '-' '=');
// Helper method for constructing identifiers from the `format_ident!` macro,
// handling `r#` prefixes.
diff --git a/tests/test.rs b/tests/test.rs
index df857fd..6580bcd 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -4,7 +4,7 @@ use std::borrow::Cow;
use std::collections::BTreeSet;
use proc_macro2::{Ident, Span, TokenStream};
-use quote::{format_ident, quote, TokenStreamExt};
+use quote::{format_ident, quote, quote_spanned, TokenStreamExt};
struct X;
@@ -36,6 +36,28 @@ fn test_quote_impl() {
}
#[test]
+fn test_quote_spanned_impl() {
+ let span = Span::call_site();
+ let tokens = quote_spanned! {span=>
+ impl<'a, T: ToTokens> ToTokens for &'a T {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ (**self).to_tokens(tokens)
+ }
+ }
+ };
+
+ let expected = concat!(
+ "impl < 'a , T : ToTokens > ToTokens for & 'a T { ",
+ "fn to_tokens ( & self , tokens : & mut TokenStream ) { ",
+ "( * * self ) . to_tokens ( tokens ) ",
+ "} ",
+ "}"
+ );
+
+ assert_eq!(expected, tokens.to_string());
+}
+
+#[test]
fn test_substitution() {
let x = X;
let tokens = quote!(#x <#x> (#x) [#x] {#x});
@@ -130,7 +152,7 @@ fn test_integer() {
#ii8 #ii16 #ii32 #ii64 #ii128 #iisize
#uu8 #uu16 #uu32 #uu64 #uu128 #uusize
};
- let expected = "-1i8 -1i16 -1i32 -1i64 -1i128 -1isize 1u8 1u16 1u32 1u64 1u128 1usize";
+ let expected = "- 1i8 - 1i16 - 1i32 - 1i64 - 1i128 - 1isize 1u8 1u16 1u32 1u64 1u128 1usize";
assert_eq!(expected, tokens.to_string());
}