aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ids.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ids.rs')
-rw-r--r--crates/ra_hir/src/ids.rs43
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)]
88enum HirFileIdRepr { 91enum HirFileIdRepr {
89 File(FileId), 92 File(FileId),
90 Macro(MacroCallId), 93 Macro(MacroFile),
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
97struct MacroFile {
98 macro_call_id: MacroCallId,
99 macro_file_kind: MacroFileKind,
100}
101
102#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
103pub(crate) enum MacroFileKind {
104 Items,
91} 105}
92 106
93impl From<FileId> for HirFileId { 107impl From<FileId> for HirFileId {
@@ -96,12 +110,6 @@ impl From<FileId> for HirFileId {
96 } 110 }
97} 111}
98 112
99impl 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)]
106pub struct MacroDefId(pub(crate) AstId<ast::MacroCall>); 114pub 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
178impl MacroCallLoc { 191impl 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