aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_mbe')
-rw-r--r--crates/ra_mbe/src/syntax_bridge.rs32
1 files changed, 1 insertions, 31 deletions
diff --git a/crates/ra_mbe/src/syntax_bridge.rs b/crates/ra_mbe/src/syntax_bridge.rs
index a49e63ace..9653f7fef 100644
--- a/crates/ra_mbe/src/syntax_bridge.rs
+++ b/crates/ra_mbe/src/syntax_bridge.rs
@@ -23,7 +23,7 @@ pub struct TokenMap {
23/// Maps relative range of the expanded syntax node to `tt::TokenId` 23/// Maps relative range of the expanded syntax node to `tt::TokenId`
24#[derive(Debug, PartialEq, Eq, Default)] 24#[derive(Debug, PartialEq, Eq, Default)]
25pub struct RevTokenMap { 25pub struct RevTokenMap {
26 ranges: Vec<(TextRange, tt::TokenId)>, 26 pub ranges: Vec<(TextRange, tt::TokenId)>,
27} 27}
28 28
29/// Convert the syntax tree (what user has written) to a `TokenTree` (what macro 29/// Convert the syntax tree (what user has written) to a `TokenTree` (what macro
@@ -121,36 +121,6 @@ impl RevTokenMap {
121 fn add(&mut self, relative_range: TextRange, token_id: tt::TokenId) { 121 fn add(&mut self, relative_range: TextRange, token_id: tt::TokenId) {
122 self.ranges.push((relative_range, token_id.clone())) 122 self.ranges.push((relative_range, token_id.clone()))
123 } 123 }
124
125 /// Map a given token map to (Expanded syntax node, Input tokens) text-ranges pair
126 ///
127 /// This function do the following things:
128 ///
129 /// 1. Undo the increment of token-id `shift`:
130 /// When we output a token from from macro argument, we increased its id
131 /// by `shift` (so it's guaranteed to not to collide with anything from the definition)
132 /// We undo the increment here to rollback to its original token id.
133 /// 2. Offset the input tokens (`to`) by `parent` text-range:
134 /// We transforms the input tokens text-ranges from relative to original first token
135 /// to parent text-range
136 /// 3. Maps expanded tokens text-ranges to parent text-ranges
137 ///
138 pub fn map_ranges(
139 &self,
140 to: &TokenMap,
141 parent: TextRange,
142 shift: u32,
143 ) -> Vec<(TextRange, TextRange)> {
144 self.ranges
145 .iter()
146 .filter_map(|(r, tid)| {
147 let adjusted_id = tt::TokenId(tid.0.checked_sub(shift)?);
148 let to_range = to.relative_range_of(adjusted_id)?;
149
150 Some((*r, TextRange::offset_len(to_range.start() + parent.start(), to_range.len())))
151 })
152 .collect()
153 }
154} 124}
155 125
156/// Returns the textual content of a doc comment block as a quoted string 126/// Returns the textual content of a doc comment block as a quoted string