aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_expand/src/lib.rs')
-rw-r--r--crates/ra_hir_expand/src/lib.rs39
1 files changed, 31 insertions, 8 deletions
diff --git a/crates/ra_hir_expand/src/lib.rs b/crates/ra_hir_expand/src/lib.rs
index 9506f2e1c..3a1c6d2b0 100644
--- a/crates/ra_hir_expand/src/lib.rs
+++ b/crates/ra_hir_expand/src/lib.rs
@@ -70,7 +70,10 @@ impl HirFileId {
70 match self.0 { 70 match self.0 {
71 HirFileIdRepr::FileId(file_id) => file_id, 71 HirFileIdRepr::FileId(file_id) => file_id,
72 HirFileIdRepr::MacroFile(macro_file) => { 72 HirFileIdRepr::MacroFile(macro_file) => {
73 let loc = db.lookup_intern_macro(macro_file.macro_call_id); 73 let lazy_id = match macro_file.macro_call_id {
74 MacroCallId::LazyMacro(id) => id,
75 };
76 let loc = db.lookup_intern_macro(lazy_id);
74 loc.kind.file_id().original_file(db) 77 loc.kind.file_id().original_file(db)
75 } 78 }
76 } 79 }
@@ -81,7 +84,10 @@ impl HirFileId {
81 match self.0 { 84 match self.0 {
82 HirFileIdRepr::FileId(_) => None, 85 HirFileIdRepr::FileId(_) => None,
83 HirFileIdRepr::MacroFile(macro_file) => { 86 HirFileIdRepr::MacroFile(macro_file) => {
84 let loc = db.lookup_intern_macro(macro_file.macro_call_id); 87 let lazy_id = match macro_file.macro_call_id {
88 MacroCallId::LazyMacro(id) => id,
89 };
90 let loc = db.lookup_intern_macro(lazy_id);
85 Some(loc.kind.node(db)) 91 Some(loc.kind.node(db))
86 } 92 }
87 } 93 }
@@ -92,7 +98,10 @@ impl HirFileId {
92 match self.0 { 98 match self.0 {
93 HirFileIdRepr::FileId(_) => None, 99 HirFileIdRepr::FileId(_) => None,
94 HirFileIdRepr::MacroFile(macro_file) => { 100 HirFileIdRepr::MacroFile(macro_file) => {
95 let loc: MacroCallLoc = db.lookup_intern_macro(macro_file.macro_call_id); 101 let lazy_id = match macro_file.macro_call_id {
102 MacroCallId::LazyMacro(id) => id,
103 };
104 let loc: MacroCallLoc = db.lookup_intern_macro(lazy_id);
96 105
97 let arg_tt = loc.kind.arg(db)?; 106 let arg_tt = loc.kind.arg(db)?;
98 let def_tt = loc.def.ast_id?.to_node(db).token_tree()?; 107 let def_tt = loc.def.ast_id?.to_node(db).token_tree()?;
@@ -118,7 +127,10 @@ impl HirFileId {
118 match self.0 { 127 match self.0 {
119 HirFileIdRepr::FileId(_) => None, 128 HirFileIdRepr::FileId(_) => None,
120 HirFileIdRepr::MacroFile(macro_file) => { 129 HirFileIdRepr::MacroFile(macro_file) => {
121 let loc: MacroCallLoc = db.lookup_intern_macro(macro_file.macro_call_id); 130 let lazy_id = match macro_file.macro_call_id {
131 MacroCallId::LazyMacro(id) => id,
132 };
133 let loc: MacroCallLoc = db.lookup_intern_macro(lazy_id);
122 let item = match loc.def.kind { 134 let item = match loc.def.kind {
123 MacroDefKind::BuiltInDerive(_) => loc.kind.node(db), 135 MacroDefKind::BuiltInDerive(_) => loc.kind.node(db),
124 _ => return None, 136 _ => return None,
@@ -137,16 +149,27 @@ pub struct MacroFile {
137/// `MacroCallId` identifies a particular macro invocation, like 149/// `MacroCallId` identifies a particular macro invocation, like
138/// `println!("Hello, {}", world)`. 150/// `println!("Hello, {}", world)`.
139#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 151#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
140pub struct MacroCallId(salsa::InternId); 152pub enum MacroCallId {
141impl salsa::InternKey for MacroCallId { 153 LazyMacro(LazyMacroId),
154}
155
156#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
157pub struct LazyMacroId(salsa::InternId);
158impl salsa::InternKey for LazyMacroId {
142 fn from_intern_id(v: salsa::InternId) -> Self { 159 fn from_intern_id(v: salsa::InternId) -> Self {
143 MacroCallId(v) 160 LazyMacroId(v)
144 } 161 }
145 fn as_intern_id(&self) -> salsa::InternId { 162 fn as_intern_id(&self) -> salsa::InternId {
146 self.0 163 self.0
147 } 164 }
148} 165}
149 166
167impl From<LazyMacroId> for MacroCallId {
168 fn from(it: LazyMacroId) -> Self {
169 MacroCallId::LazyMacro(it)
170 }
171}
172
150#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 173#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
151pub struct MacroDefId { 174pub struct MacroDefId {
152 // FIXME: krate and ast_id are currently optional because we don't have a 175 // FIXME: krate and ast_id are currently optional because we don't have a
@@ -162,7 +185,7 @@ pub struct MacroDefId {
162 185
163impl MacroDefId { 186impl MacroDefId {
164 pub fn as_call_id(self, db: &dyn db::AstDatabase, kind: MacroCallKind) -> MacroCallId { 187 pub fn as_call_id(self, db: &dyn db::AstDatabase, kind: MacroCallKind) -> MacroCallId {
165 db.intern_macro(MacroCallLoc { def: self, kind }) 188 db.intern_macro(MacroCallLoc { def: self, kind }).into()
166 } 189 }
167} 190}
168 191