From a157f19bf5bcfe6d59a754a0cb28ece30c526848 Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Mon, 1 Mar 2021 16:31:03 +0300 Subject: Fix proc macro TokenStream::from_str token ids --- crates/proc_macro_srv/src/rustc_server.rs | 40 +++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'crates') diff --git a/crates/proc_macro_srv/src/rustc_server.rs b/crates/proc_macro_srv/src/rustc_server.rs index a8504f762..952b4a97f 100644 --- a/crates/proc_macro_srv/src/rustc_server.rs +++ b/crates/proc_macro_srv/src/rustc_server.rs @@ -14,7 +14,6 @@ use std::collections::HashMap; use std::hash::Hash; use std::iter::FromIterator; use std::ops::Bound; -use std::str::FromStr; use std::{ascii, vec::IntoIter}; type Group = tt::Subtree; @@ -278,6 +277,42 @@ impl server::FreeFunctions for Rustc { } } +fn subtree_replace_token_ids_with_unspecified(subtree: tt::Subtree) -> tt::Subtree { + tt::Subtree { + delimiter: subtree.delimiter.map(|d| tt::Delimiter { id: tt::TokenId::unspecified(), ..d }), + token_trees: subtree + .token_trees + .into_iter() + .map(|t| token_tree_replace_token_ids_with_unspecified(t)) + .collect(), + } +} + +fn token_tree_replace_token_ids_with_unspecified(tt: tt::TokenTree) -> tt::TokenTree { + match tt { + tt::TokenTree::Leaf(leaf) => { + tt::TokenTree::Leaf(leaf_replace_token_ids_with_unspecified(leaf)) + } + tt::TokenTree::Subtree(subtree) => { + tt::TokenTree::Subtree(subtree_replace_token_ids_with_unspecified(subtree)) + } + } +} + +fn leaf_replace_token_ids_with_unspecified(leaf: tt::Leaf) -> tt::Leaf { + match leaf { + tt::Leaf::Literal(lit) => { + tt::Leaf::Literal(tt::Literal { id: tt::TokenId::unspecified(), ..lit }) + } + tt::Leaf::Punct(punct) => { + tt::Leaf::Punct(tt::Punct { id: tt::TokenId::unspecified(), ..punct }) + } + tt::Leaf::Ident(ident) => { + tt::Leaf::Ident(tt::Ident { id: tt::TokenId::unspecified(), ..ident }) + } + } +} + impl server::TokenStream for Rustc { fn new(&mut self) -> Self::TokenStream { Self::TokenStream::new() @@ -287,7 +322,8 @@ impl server::TokenStream for Rustc { stream.is_empty() } fn from_str(&mut self, src: &str) -> Self::TokenStream { - Self::TokenStream::from_str(src).expect("cannot parse string") + let (subtree, _) = mbe::parse_to_token_tree(src).expect("cannot parse string"); + TokenStream::with_subtree(subtree_replace_token_ids_with_unspecified(subtree)) } fn to_string(&mut self, stream: &Self::TokenStream) -> String { stream.to_string() -- cgit v1.2.3