diff options
Diffstat (limited to 'crates/ra_hir/src/ids.rs')
-rw-r--r-- | crates/ra_hir/src/ids.rs | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index ff4a81e59..357ef2a80 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs | |||
@@ -39,8 +39,8 @@ impl HirFileId { | |||
39 | pub fn original_file(self, db: &impl DefDatabase) -> FileId { | 39 | pub fn original_file(self, db: &impl DefDatabase) -> FileId { |
40 | match self.0 { | 40 | match self.0 { |
41 | HirFileIdRepr::File(file_id) => file_id, | 41 | HirFileIdRepr::File(file_id) => file_id, |
42 | HirFileIdRepr::Macro(macro_call_id) => { | 42 | HirFileIdRepr::Macro(macro_file) => { |
43 | let loc = macro_call_id.loc(db); | 43 | let loc = macro_file.macro_call_id.loc(db); |
44 | loc.ast_id.file_id().original_file(db) | 44 | loc.ast_id.file_id().original_file(db) |
45 | } | 45 | } |
46 | } | 46 | } |
@@ -62,9 +62,10 @@ impl HirFileId { | |||
62 | ) -> TreeArc<SourceFile> { | 62 | ) -> TreeArc<SourceFile> { |
63 | match file_id.0 { | 63 | match file_id.0 { |
64 | HirFileIdRepr::File(file_id) => db.parse(file_id), | 64 | HirFileIdRepr::File(file_id) => db.parse(file_id), |
65 | HirFileIdRepr::Macro(macro_call_id) => { | 65 | HirFileIdRepr::Macro(macro_file) => { |
66 | match db.macro_expand(macro_call_id) { | 66 | let macro_call_id = macro_file.macro_call_id; |
67 | Ok(tt) => mbe::token_tree_to_ast_item_list(&tt), | 67 | let tt = match db.macro_expand(macro_call_id) { |
68 | Ok(it) => it, | ||
68 | Err(err) => { | 69 | Err(err) => { |
69 | // Note: | 70 | // Note: |
70 | // The final goal we would like to make all parse_macro success, | 71 | // The final goal we would like to make all parse_macro success, |
@@ -74,10 +75,12 @@ impl HirFileId { | |||
74 | err, | 75 | err, |
75 | macro_call_id.debug_dump(db) | 76 | macro_call_id.debug_dump(db) |
76 | ); | 77 | ); |
77 | |||
78 | // returning an empty string looks fishy... | 78 | // returning an empty string looks fishy... |
79 | SourceFile::parse("") | 79 | return SourceFile::parse(""); |
80 | } | 80 | } |
81 | }; | ||
82 | match macro_file.macro_file_kind { | ||
83 | MacroFileKind::Items => mbe::token_tree_to_ast_item_list(&tt), | ||
81 | } | 84 | } |
82 | } | 85 | } |
83 | } | 86 | } |
@@ -87,7 +90,18 @@ impl HirFileId { | |||
87 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 90 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
88 | enum HirFileIdRepr { | 91 | enum HirFileIdRepr { |
89 | File(FileId), | 92 | File(FileId), |
90 | Macro(MacroCallId), | 93 | Macro(MacroFile), |
94 | } | ||
95 | |||
96 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
97 | struct MacroFile { | ||
98 | macro_call_id: MacroCallId, | ||
99 | macro_file_kind: MacroFileKind, | ||
100 | } | ||
101 | |||
102 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
103 | pub(crate) enum MacroFileKind { | ||
104 | Items, | ||
91 | } | 105 | } |
92 | 106 | ||
93 | impl From<FileId> for HirFileId { | 107 | impl From<FileId> for HirFileId { |
@@ -96,12 +110,6 @@ impl From<FileId> for HirFileId { | |||
96 | } | 110 | } |
97 | } | 111 | } |
98 | 112 | ||
99 | impl From<MacroCallId> for HirFileId { | ||
100 | fn from(macro_call_id: MacroCallId) -> HirFileId { | ||
101 | HirFileId(HirFileIdRepr::Macro(macro_call_id)) | ||
102 | } | ||
103 | } | ||
104 | |||
105 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 113 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
106 | pub struct MacroDefId(pub(crate) AstId<ast::MacroCall>); | 114 | pub struct MacroDefId(pub(crate) AstId<ast::MacroCall>); |
107 | 115 | ||
@@ -173,6 +181,11 @@ impl MacroCallId { | |||
173 | pub(crate) fn loc(self, db: &impl DefDatabase) -> MacroCallLoc { | 181 | pub(crate) fn loc(self, db: &impl DefDatabase) -> MacroCallLoc { |
174 | db.lookup_intern_macro(self) | 182 | db.lookup_intern_macro(self) |
175 | } | 183 | } |
184 | |||
185 | pub(crate) fn as_file(self, kind: MacroFileKind) -> HirFileId { | ||
186 | let macro_file = MacroFile { macro_call_id: self, macro_file_kind: kind }; | ||
187 | HirFileId(HirFileIdRepr::Macro(macro_file)) | ||
188 | } | ||
176 | } | 189 | } |
177 | 190 | ||
178 | impl MacroCallLoc { | 191 | impl MacroCallLoc { |
@@ -342,7 +355,7 @@ impl MacroCallId { | |||
342 | let syntax_str = node.syntax().text().chunks().collect::<Vec<_>>().join(" "); | 355 | let syntax_str = node.syntax().text().chunks().collect::<Vec<_>>().join(" "); |
343 | 356 | ||
344 | // dump the file name | 357 | // dump the file name |
345 | let file_id: HirFileId = self.clone().into(); | 358 | let file_id: HirFileId = self.loc(db).ast_id.file_id(); |
346 | let original = file_id.original_file(db); | 359 | let original = file_id.original_file(db); |
347 | let macro_rules = db.macro_def(loc.def); | 360 | let macro_rules = db.macro_def(loc.def); |
348 | 361 | ||