aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/attr.rs2
-rw-r--r--src/lib.rs38
2 files changed, 29 insertions, 11 deletions
diff --git a/src/attr.rs b/src/attr.rs
index be64a79..8626d11 100644
--- a/src/attr.rs
+++ b/src/attr.rs
@@ -63,7 +63,7 @@ pub fn expand_attr(
let mut group_contains_paste = false;
let mut expanded = TokenStream::new();
let mut nested_attr = TokenStream::new();
- for tt in group.stream().into_iter() {
+ for tt in group.stream() {
match &tt {
TokenTree::Punct(punct) if punct.as_char() == ',' => {
expanded.extend(expand_attr(
diff --git a/src/lib.rs b/src/lib.rs
index 794ef3b..d066ca0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -132,11 +132,17 @@
//! };
//! }
//!
-//! # struct Paste;
+//! pub struct Paste {}
+//!
//! method_new!(Paste); // expands to #[doc = "Create a new `Paste` object"]
//! ```
-#![allow(clippy::needless_doctest_main)]
+#![allow(
+ clippy::doc_markdown,
+ clippy::module_name_repetitions,
+ clippy::needless_doctest_main,
+ clippy::too_many_lines
+)]
extern crate proc_macro;
@@ -154,7 +160,8 @@ use std::panic;
#[proc_macro]
pub fn paste(input: TokenStream) -> TokenStream {
let mut contains_paste = false;
- match expand(input, &mut contains_paste) {
+ let flatten_single_interpolation = true;
+ match expand(input, &mut contains_paste, flatten_single_interpolation) {
Ok(expanded) => expanded,
Err(err) => err.to_compile_error(),
}
@@ -172,7 +179,11 @@ pub fn expr(input: TokenStream) -> TokenStream {
paste(input)
}
-fn expand(input: TokenStream, contains_paste: &mut bool) -> Result<TokenStream> {
+fn expand(
+ input: TokenStream,
+ contains_paste: &mut bool,
+ flatten_single_interpolation: bool,
+) -> Result<TokenStream> {
let mut expanded = TokenStream::new();
let mut lookbehind = Lookbehind::Other;
let mut prev_none_group = None::<Group>;
@@ -203,15 +214,22 @@ fn expand(input: TokenStream, contains_paste: &mut bool) -> Result<TokenStream>
let tokens = pasted_to_tokens(pasted, span)?;
expanded.extend(tokens);
*contains_paste = true;
- } else if delimiter == Delimiter::None && is_flat_group(&content) {
+ } else if flatten_single_interpolation
+ && delimiter == Delimiter::None
+ && is_single_interpolation_group(&content)
+ {
expanded.extend(content);
*contains_paste = true;
} else {
let mut group_contains_paste = false;
- let mut nested = expand(content, &mut group_contains_paste)?;
- if delimiter == Delimiter::Bracket
- && (lookbehind == Lookbehind::Pound || lookbehind == Lookbehind::PoundBang)
- {
+ let is_attribute = delimiter == Delimiter::Bracket
+ && (lookbehind == Lookbehind::Pound || lookbehind == Lookbehind::PoundBang);
+ let mut nested = expand(
+ content,
+ &mut group_contains_paste,
+ flatten_single_interpolation && !is_attribute,
+ )?;
+ if is_attribute {
nested = expand_attr(nested, span, &mut group_contains_paste)?
}
let group = if group_contains_paste {
@@ -262,7 +280,7 @@ enum Lookbehind {
}
// https://github.com/dtolnay/paste/issues/26
-fn is_flat_group(input: &TokenStream) -> bool {
+fn is_single_interpolation_group(input: &TokenStream) -> bool {
#[derive(PartialEq)]
enum State {
Init,