@@ -203,17 +203,56 @@ impl Definitions {
203
203
}
204
204
}
205
205
206
+ pub fn retrace_path ( & self , path : & DefPath ) -> Option < DefIndex > {
207
+ debug ! ( "retrace_path(path={:?})" , path) ;
208
+
209
+ // we assume that we only want to retrace paths relative to
210
+ // the crate root
211
+ assert ! ( path. is_local( ) ) ;
212
+
213
+ let root_key = DefKey {
214
+ parent : None ,
215
+ disambiguated_data : DisambiguatedDefPathData {
216
+ data : DefPathData :: CrateRoot ,
217
+ disambiguator : 0 ,
218
+ } ,
219
+ } ;
220
+ let root_id = self . key_map [ & root_key] ;
221
+
222
+ debug ! ( "retrace_path: root_id={:?}" , root_id) ;
223
+
224
+ let mut id = root_id;
225
+ for data in & path. data {
226
+ let key = DefKey { parent : Some ( id) , disambiguated_data : data. clone ( ) } ;
227
+ debug ! ( "key = {:?}" , key) ;
228
+ id = match self . key_map . get ( & key) {
229
+ Some ( & id) => id,
230
+ None => return None
231
+ } ;
232
+ }
233
+
234
+ Some ( id)
235
+ }
236
+
206
237
pub fn create_def_with_parent ( & mut self ,
207
238
parent : Option < DefIndex > ,
208
239
node_id : ast:: NodeId ,
209
240
data : DefPathData )
210
241
-> DefIndex {
242
+ debug ! ( "create_def_with_parent(parent={:?}, node_id={:?}, data={:?})" ,
243
+ parent, node_id, data) ;
244
+
211
245
assert ! ( !self . node_map. contains_key( & node_id) ,
212
246
"adding a def'n for node-id {:?} and data {:?} but a previous def'n exists: {:?}" ,
213
247
node_id,
214
248
data,
215
249
self . data[ self . node_map[ & node_id] . as_usize( ) ] ) ;
216
250
251
+ assert ! ( parent. is_some( ) ^ match data {
252
+ DefPathData :: CrateRoot | DefPathData :: InlinedRoot ( _) => true ,
253
+ _ => false ,
254
+ } ) ;
255
+
217
256
// Find a unique DefKey. This basically means incrementing the disambiguator
218
257
// until we get no match.
219
258
let mut key = DefKey {
@@ -228,12 +267,17 @@ impl Definitions {
228
267
key. disambiguated_data . disambiguator += 1 ;
229
268
}
230
269
270
+ debug ! ( "create_def_with_parent: after disambiguation, key = {:?}" , key) ;
271
+
231
272
// Create the definition.
232
273
let index = DefIndex :: new ( self . data . len ( ) ) ;
233
274
self . data . push ( DefData { key : key. clone ( ) , node_id : node_id } ) ;
275
+ debug ! ( "create_def_with_parent: node_map[{:?}] = {:?}" , node_id, index) ;
234
276
self . node_map . insert ( node_id, index) ;
277
+ debug ! ( "create_def_with_parent: key_map[{:?}] = {:?}" , key, index) ;
235
278
self . key_map . insert ( key, index) ;
236
279
280
+
237
281
index
238
282
}
239
283
}
0 commit comments