diff options
author | Edwin Cheng <[email protected]> | 2019-12-14 17:20:07 +0000 |
---|---|---|
committer | Edwin Cheng <[email protected]> | 2019-12-14 17:24:51 +0000 |
commit | 61360fdfec981eadef1eefb595c8b32c951771e8 (patch) | |
tree | 08e89aa372dd4680569ee4a7788019196d65b375 /crates/ra_hir_expand/src | |
parent | 7238037de42a2fd88434930c521b926d7b0026da (diff) |
Fix original_source find order
Diffstat (limited to 'crates/ra_hir_expand/src')
-rw-r--r-- | crates/ra_hir_expand/src/lib.rs | 29 |
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)] | ||
218 | pub enum ExpansionOrigin { | ||
219 | Call, | ||
220 | Def, | ||
221 | } | ||
222 | |||
217 | impl ExpansionInfo { | 223 | impl 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 | ||