aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2019-12-14 17:20:07 +0000
committerEdwin Cheng <[email protected]>2019-12-14 17:24:51 +0000
commit61360fdfec981eadef1eefb595c8b32c951771e8 (patch)
tree08e89aa372dd4680569ee4a7788019196d65b375 /crates/ra_hir_expand
parent7238037de42a2fd88434930c521b926d7b0026da (diff)
Fix original_source find order
Diffstat (limited to 'crates/ra_hir_expand')
-rw-r--r--crates/ra_hir_expand/src/lib.rs29
1 files changed, 22 insertions, 7 deletions
diff --git a/crates/ra_hir_expand/src/lib.rs b/crates/ra_hir_expand/src/lib.rs
index 94e1e466a..d1a43fe6c 100644
--- a/crates/ra_hir_expand/src/lib.rs
+++ b/crates/ra_hir_expand/src/lib.rs
@@ -214,7 +214,17 @@ pub struct ExpansionInfo {
214 exp_map: Arc<mbe::TokenMap>, 214 exp_map: Arc<mbe::TokenMap>,
215} 215}
216 216
217#[derive(Debug, Clone, PartialEq, Eq)]
218pub enum ExpansionOrigin {
219 Call,
220 Def,
221}
222
217impl ExpansionInfo { 223impl ExpansionInfo {
224 pub fn call_node(&self) -> Option<InFile<SyntaxNode>> {
225 Some(self.arg.with_value(self.arg.value.parent()?))
226 }
227
218 pub fn map_token_down(&self, token: InFile<&SyntaxToken>) -> Option<InFile<SyntaxToken>> { 228 pub fn map_token_down(&self, token: InFile<&SyntaxToken>) -> Option<InFile<SyntaxToken>> {
219 assert_eq!(token.file_id, self.arg.file_id); 229 assert_eq!(token.file_id, self.arg.file_id);
220 let range = token.value.text_range().checked_sub(self.arg.value.text_range().start())?; 230 let range = token.value.text_range().checked_sub(self.arg.value.text_range().start())?;
@@ -228,21 +238,26 @@ impl ExpansionInfo {
228 Some(self.expanded.with_value(token)) 238 Some(self.expanded.with_value(token))
229 } 239 }
230 240
231 pub fn map_token_up(&self, token: InFile<&SyntaxToken>) -> Option<InFile<SyntaxToken>> { 241 pub fn map_token_up(
242 &self,
243 token: InFile<&SyntaxToken>,
244 ) -> Option<(InFile<SyntaxToken>, ExpansionOrigin)> {
232 let token_id = self.exp_map.token_by_range(token.value.text_range())?; 245 let token_id = self.exp_map.token_by_range(token.value.text_range())?;
233 246
234 let (token_id, origin) = self.macro_def.0.map_id_up(token_id); 247 let (token_id, origin) = self.macro_def.0.map_id_up(token_id);
235 let (token_map, tt) = match origin { 248 let (token_map, tt, origin) = match origin {
236 mbe::Origin::Call => (&self.macro_arg.1, self.arg.clone()), 249 mbe::Origin::Call => (&self.macro_arg.1, self.arg.clone(), ExpansionOrigin::Call),
237 mbe::Origin::Def => { 250 mbe::Origin::Def => (
238 (&self.macro_def.1, self.def.as_ref().map(|tt| tt.syntax().clone())) 251 &self.macro_def.1,
239 } 252 self.def.as_ref().map(|tt| tt.syntax().clone()),
253 ExpansionOrigin::Def,
254 ),
240 }; 255 };
241 256
242 let range = token_map.range_by_token(token_id)?; 257 let range = token_map.range_by_token(token_id)?;
243 let token = algo::find_covering_element(&tt.value, range + tt.value.text_range().start()) 258 let token = algo::find_covering_element(&tt.value, range + tt.value.text_range().start())
244 .into_token()?; 259 .into_token()?;
245 Some(tt.with_value(token)) 260 Some((tt.with_value(token), origin))
246 } 261 }
247} 262}
248 263