@@ -277,12 +277,6 @@ impl ToInternal<rustc_errors::Level> for Level {
277277
278278pub struct FreeFunctions;
279279
280- #[derive(Clone)]
281- pub struct TokenStreamIter {
282- cursor: tokenstream::Cursor,
283- stack: Vec<TokenTree<Group, Punct, Ident, Literal>>,
284- }
285-
286280#[derive(Clone)]
287281pub struct Group {
288282 delimiter: Delimiter,
@@ -382,8 +376,6 @@ impl<'a, 'b> Rustc<'a, 'b> {
382376impl server::Types for Rustc<'_, '_> {
383377 type FreeFunctions = FreeFunctions;
384378 type TokenStream = TokenStream;
385- type TokenStreamBuilder = tokenstream::TokenStreamBuilder;
386- type TokenStreamIter = TokenStreamIter;
387379 type Group = Group;
388380 type Punct = Punct;
389381 type Ident = Ident;
@@ -408,9 +400,6 @@ impl server::FreeFunctions for Rustc<'_, '_> {
408400}
409401
410402impl server::TokenStream for Rustc<'_, '_> {
411- fn new(&mut self) -> Self::TokenStream {
412- TokenStream::default()
413- }
414403 fn is_empty(&mut self, stream: &Self::TokenStream) -> bool {
415404 stream.is_empty()
416405 }
@@ -481,53 +470,74 @@ impl server::TokenStream for Rustc<'_, '_> {
481470 ) -> Self::TokenStream {
482471 tree.to_internal()
483472 }
484- fn into_iter(&mut self, stream: Self::TokenStream) -> Self::TokenStreamIter {
485- TokenStreamIter { cursor: stream.into_trees(), stack: vec![] }
486- }
487- }
488-
489- impl server::TokenStreamBuilder for Rustc<'_, '_> {
490- fn new(&mut self) -> Self::TokenStreamBuilder {
491- tokenstream::TokenStreamBuilder::new()
492- }
493- fn push(&mut self, builder: &mut Self::TokenStreamBuilder, stream: Self::TokenStream) {
494- builder.push(stream);
473+ fn concat_trees(
474+ &mut self,
475+ base: Option<Self::TokenStream>,
476+ trees: Vec<TokenTree<Self::Group, Self::Punct, Self::Ident, Self::Literal>>,
477+ ) -> Self::TokenStream {
478+ let mut builder = tokenstream::TokenStreamBuilder::new();
479+ if let Some(base) = base {
480+ builder.push(base);
481+ }
482+ for tree in trees {
483+ builder.push(tree.to_internal());
484+ }
485+ builder.build()
495486 }
496- fn build(&mut self, builder: Self::TokenStreamBuilder) -> Self::TokenStream {
487+ fn concat_streams(
488+ &mut self,
489+ base: Option<Self::TokenStream>,
490+ streams: Vec<Self::TokenStream>,
491+ ) -> Self::TokenStream {
492+ let mut builder = tokenstream::TokenStreamBuilder::new();
493+ if let Some(base) = base {
494+ builder.push(base);
495+ }
496+ for stream in streams {
497+ builder.push(stream);
498+ }
497499 builder.build()
498500 }
499- }
500-
501- impl server::TokenStreamIter for Rustc<'_, '_> {
502- fn next(
501+ fn into_iter(
503502 &mut self,
504- iter: &mut Self::TokenStreamIter,
505- ) -> Option<TokenTree<Self::Group, Self::Punct, Self::Ident, Self::Literal>> {
503+ stream: Self::TokenStream,
504+ ) -> Vec<TokenTree<Self::Group, Self::Punct, Self::Ident, Self::Literal>> {
505+ // XXX: This is a raw port of the previous approach, and can probably be
506+ // optimized.
507+ let mut cursor = stream.into_trees();
508+ let mut stack = Vec::new();
509+ let mut tts = Vec::new();
506510 loop {
507- let tree = iter.stack.pop().or_else(|| {
508- let next = iter.cursor.next_with_spacing()?;
509- Some(TokenTree::from_internal((next, &mut iter.stack, self)))
510- })?;
511- // A hack used to pass AST fragments to attribute and derive macros
512- // as a single nonterminal token instead of a token stream.
513- // Such token needs to be "unwrapped" and not represented as a delimited group.
514- // FIXME: It needs to be removed, but there are some compatibility issues (see #73345).
515- if let TokenTree::Group(ref group) = tree {
516- if group.flatten {
517- iter.cursor.append(group.stream.clone());
518- continue;
511+ let next = stack.pop().or_else(|| {
512+ let next = cursor.next_with_spacing()?;
513+ Some(TokenTree::from_internal((next, &mut stack, self)))
514+ });
515+ match next {
516+ Some(TokenTree::Group(group)) => {
517+ // A hack used to pass AST fragments to attribute and derive
518+ // macros as a single nonterminal token instead of a token
519+ // stream. Such token needs to be "unwrapped" and not
520+ // represented as a delimited group.
521+ // FIXME: It needs to be removed, but there are some
522+ // compatibility issues (see #73345).
523+ if group.flatten {
524+ cursor.append(group.stream);
525+ continue;
526+ }
527+ tts.push(TokenTree::Group(group));
519528 }
529+ Some(tt) => tts.push(tt),
530+ None => return tts,
520531 }
521- return Some(tree);
522532 }
523533 }
524534}
525535
526536impl server::Group for Rustc<'_, '_> {
527- fn new(&mut self, delimiter: Delimiter, stream: Self::TokenStream) -> Self::Group {
537+ fn new(&mut self, delimiter: Delimiter, stream: Option< Self::TokenStream> ) -> Self::Group {
528538 Group {
529539 delimiter,
530- stream,
540+ stream: stream.unwrap_or_default() ,
531541 span: DelimSpan::from_single(server::Span::call_site(self)),
532542 flatten: false,
533543 }
0 commit comments