Skip to content
This repository was archived by the owner on Oct 6, 2024. It is now read-only.

Commit e4b1f66

Browse files
committed
Simplify signature of paste_segments to share with doc codepath
1 parent fe7898b commit e4b1f66

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

src/lib.rs

+25-12
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ use crate::doc::{do_paste_doc, is_pasted_doc};
148148
use crate::error::{Error, Result};
149149
use crate::segment::Segment;
150150
use proc_macro::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
151-
use std::iter::{self, FromIterator};
151+
use std::iter;
152152
use std::panic;
153153

154154
#[proc_macro]
@@ -199,8 +199,9 @@ fn expand(input: TokenStream, contains_paste: &mut bool) -> Result<TokenStream>
199199
let span = group.span();
200200
if delimiter == Delimiter::Bracket && is_paste_operation(&content) {
201201
let segments = parse_bracket_as_segments(content, span)?;
202-
let pasted = paste_segments(span, &segments)?;
203-
expanded.extend(pasted);
202+
let pasted = paste_segments(&segments)?;
203+
let tokens = pasted_to_tokens(pasted, span)?;
204+
expanded.extend(tokens);
204205
*contains_paste = true;
205206
} else if delimiter == Delimiter::None && is_flat_group(&content) {
206207
expanded.extend(content);
@@ -348,7 +349,7 @@ fn parse_bracket_as_segments(input: TokenStream, scope: Span) -> Result<Vec<Segm
348349
}
349350
}
350351

351-
fn paste_segments(span: Span, segments: &[Segment]) -> Result<TokenStream> {
352+
fn paste_segments(segments: &[Segment]) -> Result<String> {
352353
let mut evaluated = Vec::new();
353354
let mut is_lifetime = false;
354355

@@ -435,7 +436,23 @@ fn paste_segments(span: Span, segments: &[Segment]) -> Result<TokenStream> {
435436
}
436437
}
437438

438-
let pasted = evaluated.into_iter().collect::<String>();
439+
let mut pasted = evaluated.into_iter().collect::<String>();
440+
if is_lifetime {
441+
pasted.insert(0, '\'');
442+
}
443+
Ok(pasted)
444+
}
445+
446+
fn pasted_to_tokens(mut pasted: String, span: Span) -> Result<TokenStream> {
447+
let mut tokens = TokenStream::new();
448+
449+
if pasted.starts_with('\'') {
450+
let mut apostrophe = TokenTree::Punct(Punct::new('\'', Spacing::Joint));
451+
apostrophe.set_span(span);
452+
tokens.extend(iter::once(apostrophe));
453+
pasted.remove(0);
454+
}
455+
439456
let ident = match panic::catch_unwind(|| Ident::new(&pasted, span)) {
440457
Ok(ident) => TokenTree::Ident(ident),
441458
Err(_) => {
@@ -445,11 +462,7 @@ fn paste_segments(span: Span, segments: &[Segment]) -> Result<TokenStream> {
445462
));
446463
}
447464
};
448-
let tokens = if is_lifetime {
449-
let apostrophe = TokenTree::Punct(Punct::new('\'', Spacing::Joint));
450-
vec![apostrophe, ident]
451-
} else {
452-
vec![ident]
453-
};
454-
Ok(TokenStream::from_iter(tokens))
465+
466+
tokens.extend(iter::once(ident));
467+
Ok(tokens)
455468
}

0 commit comments

Comments
 (0)