diff options
Diffstat (limited to 'crates/ra_mbe/src/syntax_bridge.rs')
-rw-r--r-- | crates/ra_mbe/src/syntax_bridge.rs | 36 |
1 files changed, 9 insertions, 27 deletions
diff --git a/crates/ra_mbe/src/syntax_bridge.rs b/crates/ra_mbe/src/syntax_bridge.rs index a380b1cfd..2d035307b 100644 --- a/crates/ra_mbe/src/syntax_bridge.rs +++ b/crates/ra_mbe/src/syntax_bridge.rs | |||
@@ -46,31 +46,19 @@ pub fn syntax_node_to_token_tree(node: &SyntaxNode) -> Option<(tt::Subtree, Toke | |||
46 | // * TraitItems(SmallVec<[ast::TraitItem; 1]>) | 46 | // * TraitItems(SmallVec<[ast::TraitItem; 1]>) |
47 | // * ImplItems(SmallVec<[ast::ImplItem; 1]>) | 47 | // * ImplItems(SmallVec<[ast::ImplItem; 1]>) |
48 | // * ForeignItems(SmallVec<[ast::ForeignItem; 1]> | 48 | // * ForeignItems(SmallVec<[ast::ForeignItem; 1]> |
49 | // | ||
50 | // | ||
51 | |||
52 | fn token_tree_to_syntax_node<F>(tt: &tt::Subtree, f: F) -> Result<Parse<SyntaxNode>, ExpandError> | ||
53 | where | ||
54 | F: Fn(&mut dyn ra_parser::TokenSource, &mut dyn ra_parser::TreeSink), | ||
55 | { | ||
56 | let tokens = [tt.clone().into()]; | ||
57 | let buffer = TokenBuffer::new(&tokens); | ||
58 | let mut token_source = SubtreeTokenSource::new(&buffer); | ||
59 | let mut tree_sink = TtTreeSink::new(buffer.begin()); | ||
60 | f(&mut token_source, &mut tree_sink); | ||
61 | if tree_sink.roots.len() != 1 { | ||
62 | return Err(ExpandError::ConversionError); | ||
63 | } | ||
64 | //FIXME: would be cool to report errors | ||
65 | let parse = tree_sink.inner.finish(); | ||
66 | Ok(parse) | ||
67 | } | ||
68 | 49 | ||
69 | fn fragment_to_syntax_node( | 50 | fn fragment_to_syntax_node( |
70 | tt: &tt::Subtree, | 51 | tt: &tt::Subtree, |
71 | fragment_kind: FragmentKind, | 52 | fragment_kind: FragmentKind, |
72 | ) -> Result<Parse<SyntaxNode>, ExpandError> { | 53 | ) -> Result<Parse<SyntaxNode>, ExpandError> { |
73 | let tokens = [tt.clone().into()]; | 54 | let tmp; |
55 | let tokens = match tt { | ||
56 | tt::Subtree { delimiter: tt::Delimiter::None, token_trees } => token_trees.as_slice(), | ||
57 | _ => { | ||
58 | tmp = [tt.clone().into()]; | ||
59 | &tmp[..] | ||
60 | } | ||
61 | }; | ||
74 | let buffer = TokenBuffer::new(&tokens); | 62 | let buffer = TokenBuffer::new(&tokens); |
75 | let mut token_source = SubtreeTokenSource::new(&buffer); | 63 | let mut token_source = SubtreeTokenSource::new(&buffer); |
76 | let mut tree_sink = TtTreeSink::new(buffer.begin()); | 64 | let mut tree_sink = TtTreeSink::new(buffer.begin()); |
@@ -108,17 +96,11 @@ pub fn token_tree_to_macro_stmts(tt: &tt::Subtree) -> Result<Parse<ast::MacroStm | |||
108 | } | 96 | } |
109 | 97 | ||
110 | /// Parses the token tree (result of macro expansion) as a sequence of items | 98 | /// Parses the token tree (result of macro expansion) as a sequence of items |
111 | pub fn token_tree_to_macro_items(tt: &tt::Subtree) -> Result<Parse<ast::MacroItems>, ExpandError> { | 99 | pub fn token_tree_to_items(tt: &tt::Subtree) -> Result<Parse<ast::MacroItems>, ExpandError> { |
112 | let parse = fragment_to_syntax_node(tt, Items)?; | 100 | let parse = fragment_to_syntax_node(tt, Items)?; |
113 | parse.cast().ok_or_else(|| crate::ExpandError::ConversionError) | 101 | parse.cast().ok_or_else(|| crate::ExpandError::ConversionError) |
114 | } | 102 | } |
115 | 103 | ||
116 | /// Parses the token tree (result of macro expansion) as a sequence of items | ||
117 | pub fn token_tree_to_ast_item_list(tt: &tt::Subtree) -> Parse<ast::SourceFile> { | ||
118 | let parse = token_tree_to_syntax_node(tt, ra_parser::parse).unwrap(); | ||
119 | parse.cast().unwrap() | ||
120 | } | ||
121 | |||
122 | impl TokenMap { | 104 | impl TokenMap { |
123 | pub fn relative_range_of(&self, tt: tt::TokenId) -> Option<TextRange> { | 105 | pub fn relative_range_of(&self, tt: tt::TokenId) -> Option<TextRange> { |
124 | let idx = tt.0 as usize; | 106 | let idx = tt.0 as usize; |