@@ -3,6 +3,7 @@ import front.ast.ident;
3
3
import front. ast . def ;
4
4
import front. ast . ann ;
5
5
import driver. session ;
6
+ import util. common . new_def_hash ;
6
7
import util. common . span ;
7
8
import std. map . hashmap ;
8
9
import std. list . list ;
@@ -24,6 +25,8 @@ tag scope {
24
25
type env = rec ( list[ scope] scopes ,
25
26
session . session sess) ;
26
27
28
+ type import_map = std. map. hashmap [ ast. def_id , def_wrap] ;
29
+
27
30
// A simple wrapper over defs that stores a bit more information about modules
28
31
// and uses so that we can use the regular lookup_name when resolving imports.
29
32
tag def_wrap {
@@ -69,7 +72,7 @@ fn unwrap_def(option.t[def_wrap] d_) -> option.t[def] {
69
72
fn find_final_def ( & env e, & span sp, vec[ ident] idents ) -> option. t[ def_wrap ] {
70
73
auto len = _vec. len [ ident] ( idents) ;
71
74
auto first = idents. ( 0 ) ;
72
- auto d_ = lookup_name ( e, first) ;
75
+ auto d_ = lookup_name ( e, none [ import_map ] , first) ;
73
76
if ( len == 1 u) {
74
77
ret d_;
75
78
}
@@ -93,7 +96,8 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> option.t[def_wrap] {
93
96
fail;
94
97
}
95
98
96
- fn lookup_name ( & env e, ast . ident i) -> option. t[ def_wrap ] {
99
+ fn lookup_name ( & env e, option. t[ import_map] index ,
100
+ ast . ident i) -> option. t[ def_wrap ] {
97
101
98
102
// log "resolving name " + i;
99
103
@@ -137,24 +141,33 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def_wrap] {
137
141
ret none[ def_wrap] ;
138
142
}
139
143
140
- fn found_def_view ( & env e, @ast. view_item i ) -> option. t[ def_wrap ] {
144
+ fn found_def_view ( & env e, option. t[ import_map] index ,
145
+ @ast. view_item i ) -> option. t[ def_wrap ] {
141
146
alt ( i. node ) {
142
147
case ( ast. view_item_use ( _, _, ?id) ) {
143
148
ret some[ def_wrap] ( def_wrap_use ( i) ) ;
144
149
}
145
- case ( ast. view_item_import ( ?idents, _) ) {
146
- ret find_final_def ( e, i. span , idents) ;
150
+ case ( ast. view_item_import ( ?idents, ?d) ) {
151
+ alt ( index) {
152
+ case ( some[ import_map] ( ?idx) ) {
153
+ ret idx. find ( d) ;
154
+ }
155
+ case ( none[ import_map] ) {
156
+ ret find_final_def ( e, i. span , idents) ;
157
+ }
158
+ }
147
159
}
148
160
}
149
161
fail;
150
162
}
151
163
152
- fn check_mod ( & env e, ast . ident i, ast. _mod m ) -> option. t[ def_wrap ] {
164
+ fn check_mod ( & env e, option. t[ import_map] index , ast . ident i,
165
+ ast. _mod m ) -> option. t[ def_wrap ] {
153
166
alt ( m. index . find ( i) ) {
154
167
case ( some[ ast. mod_index_entry ] ( ?ent) ) {
155
168
alt ( ent) {
156
169
case ( ast. mie_view_item ( ?ix) ) {
157
- ret found_def_view ( e, m. view_items . ( ix) ) ;
170
+ ret found_def_view ( e, index , m. view_items . ( ix) ) ;
158
171
}
159
172
case ( ast. mie_item ( ?ix) ) {
160
173
ret found_def_item ( m. items . ( ix) ) ;
@@ -180,11 +193,12 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def_wrap] {
180
193
}
181
194
182
195
183
- fn in_scope ( ast . ident i, env e, & scope s) -> option. t[ def_wrap ] {
196
+ fn in_scope ( ast . ident i, env e, option. t[ import_map] index ,
197
+ & scope s) -> option. t[ def_wrap ] {
184
198
alt ( s) {
185
199
186
200
case ( scope_crate ( ?c) ) {
187
- ret check_mod ( e, i, c. node . module ) ;
201
+ ret check_mod ( e, index , i, c. node . module ) ;
188
202
}
189
203
190
204
case ( scope_item ( ?it) ) {
@@ -218,7 +232,7 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def_wrap] {
218
232
}
219
233
}
220
234
case ( ast. item_mod ( _, ?m, _) ) {
221
- ret check_mod ( e, i, m) ;
235
+ ret check_mod ( e, index , i, m) ;
222
236
}
223
237
case ( _) { /* fall through */ }
224
238
}
@@ -246,13 +260,15 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def_wrap] {
246
260
ret none[ def_wrap] ;
247
261
}
248
262
249
- ret std. list . find [ scope, def_wrap] ( e. scopes , bind in_scope ( i, e, _) ) ;
263
+ ret std. list . find [ scope, def_wrap] ( e. scopes ,
264
+ bind in_scope ( i, e, index, _) ) ;
250
265
}
251
266
252
- fn fold_pat_tag ( & env e, & span sp, ident i, vec[ @ast. pat] args,
253
- option. t[ ast. variant_def] old_def , ann a) -> @ast . pat {
267
+ fn fold_pat_tag ( & env e, & span sp, import_map index, ident i,
268
+ vec[ @ast. pat] args, option. t[ ast. variant_def] old_def ,
269
+ ann a) -> @ast . pat {
254
270
auto new_def;
255
- alt ( unwrap_def ( lookup_name ( e, i) ) ) {
271
+ alt ( unwrap_def ( lookup_name ( e, some ( index ) , i) ) ) {
256
272
case ( some[ def] ( ?d) ) {
257
273
alt ( d) {
258
274
case ( ast. def_variant ( ?did, ?vid) ) {
@@ -273,14 +289,14 @@ fn fold_pat_tag(&env e, &span sp, ident i, vec[@ast.pat] args,
273
289
ret @fold. respan [ ast. pat_ ] ( sp, ast. pat_tag ( i, args, new_def, a) ) ;
274
290
}
275
291
276
- fn fold_expr_name ( & env e, & span sp, & ast . name n ,
277
- & option. t[ def] d , ann a) -> @ast . expr {
292
+ fn fold_expr_name ( & env e, & span sp, import_map index ,
293
+ & ast . name n , & option. t[ def] d , ann a) -> @ast . expr {
278
294
279
295
if ( _vec. len [ @ast. ty ] ( n. node . types ) > 0 u) {
280
296
e. sess . unimpl ( "resolving name expr with ty params" ) ;
281
297
}
282
298
283
- auto d_ = unwrap_def ( lookup_name ( e, n. node . ident ) ) ;
299
+ auto d_ = unwrap_def ( lookup_name ( e, some ( index ) , n. node . ident ) ) ;
284
300
285
301
alt ( d_) {
286
302
case ( some[ def] ( _) ) {
@@ -294,25 +310,27 @@ fn fold_expr_name(&env e, &span sp, &ast.name n,
294
310
ret @fold. respan [ ast. expr_ ] ( sp, ast. expr_name ( n, d_, a) ) ;
295
311
}
296
312
297
- fn fold_view_item_import ( & env e, & span sp, vec[ ident] is ,
298
- ast. def_id id ) -> @ast. view_item {
313
+ fn fold_view_item_import ( & env e, & span sp,
314
+ import_map index,
315
+ vec[ ident] is , ast. def_id id ) -> @ast. view_item {
299
316
// Produce errors for invalid imports
300
317
auto len = _vec. len [ ast. ident ] ( is) ;
301
318
auto last_id = is. ( len - 1 u) ;
302
- auto d = lookup_name ( e, last_id) ;
319
+ auto d = lookup_name ( e, none [ import_map ] , last_id) ;
303
320
alt ( d) {
304
321
case ( none[ def_wrap] ) {
305
322
e. sess . span_err ( sp, "unresolved name: " + last_id) ;
306
323
}
307
- case ( some[ def_wrap] ( _) ) {
324
+ case ( some[ def_wrap] ( ?d2) ) {
325
+ index. insert ( id, d2) ;
308
326
}
309
327
}
310
328
311
329
ret @fold. respan [ ast. view_item_ ] ( sp, ast. view_item_import ( is, id) ) ;
312
330
}
313
331
314
332
315
- fn fold_ty_path ( & env e, & span sp, ast . path p,
333
+ fn fold_ty_path ( & env e, & span sp, import_map index , ast . path p,
316
334
& option. t[ def] d ) -> @ast . ty {
317
335
318
336
let uint len = _vec. len [ ast. name ] ( p) ;
@@ -327,7 +345,7 @@ fn fold_ty_path(&env e, &span sp, ast.path p,
327
345
e. sess . unimpl ( "resolving path ty with ty params" ) ;
328
346
}
329
347
330
- auto d_ = unwrap_def ( lookup_name ( e, n. node . ident ) ) ;
348
+ auto d_ = unwrap_def ( lookup_name ( e, some ( index ) , n. node . ident ) ) ;
331
349
332
350
alt ( d_) {
333
351
case ( some[ def] ( _) ) {
@@ -361,10 +379,12 @@ fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate {
361
379
362
380
let fold. ast_fold[ env] fld = fold. new_identity_fold [ env] ( ) ;
363
381
364
- fld = @rec ( fold_pat_tag = bind fold_pat_tag ( _, _, _, _, _, _) ,
365
- fold_expr_name = bind fold_expr_name ( _, _, _, _, _) ,
366
- fold_view_item_import = bind fold_view_item_import ( _, _, _, _) ,
367
- fold_ty_path = bind fold_ty_path ( _, _, _, _) ,
382
+ auto import_index = new_def_hash[ def_wrap] ( ) ;
383
+ fld = @rec ( fold_pat_tag = bind fold_pat_tag ( _, _, import_index, _, _, _, _) ,
384
+ fold_expr_name = bind fold_expr_name ( _, _, import_index, _, _, _) ,
385
+ fold_view_item_import
386
+ = bind fold_view_item_import ( _, _, import_index, _, _) ,
387
+ fold_ty_path = bind fold_ty_path ( _, _, import_index, _, _) ,
368
388
update_env_for_crate = bind update_env_for_crate ( _, _) ,
369
389
update_env_for_item = bind update_env_for_item ( _, _) ,
370
390
update_env_for_block = bind update_env_for_block ( _, _) ,
0 commit comments