@@ -25,17 +25,20 @@ tag scope {
25
25
type env = rec ( list[ scope] scopes ,
26
26
session . session sess) ;
27
27
28
- type import_map = std. map. hashmap [ ast. def_id , def_wrap ] ;
28
+ type import_map = std. map. hashmap [ ast. def_id , def ] ;
29
29
30
30
// A simple wrapper over defs that stores a bit more information about modules
31
31
// and uses so that we can use the regular lookup_name when resolving imports.
32
32
tag def_wrap {
33
33
def_wrap_use( @ast. view_item ) ;
34
+ def_wrap_import ( @ast. view_item ) ;
34
35
def_wrap_mod ( @ast. item ) ;
35
36
def_wrap_other ( def) ;
36
37
}
37
38
38
- fn unwrap_def ( option. t[ def_wrap] d_ ) -> option. t[ def ] {
39
+ fn lookup_name ( & env e, import_map index,
40
+ ast . ident i) -> option. t[ def ] {
41
+ auto d_ = lookup_name_wrapped ( e, i) ;
39
42
alt ( d_) {
40
43
case ( none[ def_wrap] ) {
41
44
ret none[ def] ;
@@ -48,62 +51,93 @@ fn unwrap_def(option.t[def_wrap] d_) -> option.t[def] {
48
51
ret some[ def] ( ast. def_use ( id) ) ;
49
52
}
50
53
}
51
- fail;
54
+ }
55
+ case ( def_wrap_import ( ?it) ) {
56
+ alt ( it. node ) {
57
+ case ( ast. view_item_import ( _, ?id) ) {
58
+ ret index. find ( id) ;
59
+ }
60
+ }
52
61
}
53
62
case ( def_wrap_mod ( ?i) ) {
54
63
alt ( i. node ) {
55
64
case ( ast. item_mod ( _, _, ?id) ) {
56
65
ret some[ def] ( ast. def_mod ( id) ) ;
57
66
}
58
67
}
59
- fail;
60
68
}
61
69
case ( def_wrap_other ( ?d) ) {
62
70
ret some[ def] ( d) ;
63
71
}
64
72
}
65
73
}
66
74
}
67
- fail;
68
75
}
69
76
70
77
// Follow the path of an import and return what it ultimately points to.
71
78
72
- fn find_final_def ( & env e, & span sp, vec[ ident] idents ) -> option. t[ def_wrap ] {
73
- auto len = _vec. len [ ident] ( idents) ;
74
- auto first = idents. ( 0 ) ;
75
- auto d_ = lookup_name ( e, none[ import_map] , first) ;
76
- if ( len == 1 u) {
77
- ret d_;
78
- }
79
- alt ( d_) {
80
- case ( none[ def_wrap] ) {
81
- e. sess . span_err ( sp, "unresolved name: " + first) ;
82
- ret d_;
83
- }
84
- case ( some[ def_wrap] ( ?d) ) {
85
- alt ( d) {
86
- case ( def_wrap_mod ( ?i) ) {
87
- auto new_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
88
- auto tmp_e = rec ( scopes = nil[ scope] ,
89
- sess = e. sess ) ;
90
- auto new_e = update_env_for_item ( tmp_e, i) ;
91
- ret find_final_def ( new_e, sp, new_idents) ;
92
- }
93
- case ( def_wrap_use ( ?c) ) {
94
- e. sess . span_err ( sp, "Crate access is not implemented" ) ;
95
- }
96
- case ( _) {
97
- e. sess . span_err ( sp, first + " is not a module or crate" ) ;
79
+ fn find_final_def ( & env e, & span sp, vec[ ident] idents ) -> def_wrap {
80
+ fn found_something ( & env e, std. map. hashmap[ ast. def_id, bool] pending ,
81
+ & span sp, vec[ ident] idents , def_wrap d) -> def_wrap {
82
+ alt ( d) {
83
+ case ( def_wrap_import ( ?imp) ) {
84
+ alt ( imp. node ) {
85
+ case ( ast. view_item_import ( ?new_idents, ?d) ) {
86
+ if ( pending. contains_key ( d) ) {
87
+ e. sess . span_err ( sp,
88
+ "recursive import" ) ;
89
+ fail;
90
+ }
91
+ pending. insert ( d, true ) ;
92
+ auto x = inner ( e, pending, sp, new_idents) ;
93
+ ret found_something ( e, pending, sp, idents, x) ;
94
+ }
98
95
}
99
96
}
97
+ case ( _) {
98
+ }
99
+ }
100
+ auto len = _vec. len [ ident] ( idents) ;
101
+ if ( len == 1 u) {
102
+ ret d;
103
+ }
104
+ alt ( d) {
105
+ case ( def_wrap_mod ( ?i) ) {
106
+ auto new_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
107
+ auto tmp_e = rec ( scopes = nil[ scope] ,
108
+ sess = e. sess ) ;
109
+ auto new_e = update_env_for_item ( tmp_e, i) ;
110
+ ret inner ( new_e, pending, sp, new_idents) ;
111
+ }
112
+ case ( def_wrap_use ( ?c) ) {
113
+ e. sess . span_err ( sp, "Crate access is not implemented" ) ;
114
+ }
115
+ case ( _) {
116
+ auto first = idents. ( 0 ) ;
117
+ e. sess . span_err ( sp, first + " is not a module or crate" ) ;
118
+ }
119
+ }
120
+ fail;
121
+ }
122
+ fn inner ( & env e, std. map. hashmap[ ast. def_id, bool] pending ,
123
+ & span sp, vec[ ident] idents ) -> def_wrap {
124
+ auto first = idents. ( 0 ) ;
125
+ auto d_ = lookup_name_wrapped ( e, first) ;
126
+ alt ( d_) {
127
+ case ( none[ def_wrap] ) {
128
+ e. sess . span_err ( sp, "unresolved name: " + first) ;
129
+ fail;
130
+ }
131
+ case ( some[ def_wrap] ( ?d) ) {
132
+ ret found_something ( e, pending, sp, idents, d) ;
133
+ }
100
134
}
101
135
}
102
- fail;
136
+ auto pending = new_def_hash[ bool] ( ) ;
137
+ ret inner( e, pending, sp, idents) ;
103
138
}
104
139
105
- fn lookup_name ( & env e, option. t[ import_map] index ,
106
- ast . ident i) -> option. t[ def_wrap ] {
140
+ fn lookup_name_wrapped ( & env e, ast . ident i) -> option. t[ def_wrap ] {
107
141
108
142
// log "resolving name " + i;
109
143
@@ -147,33 +181,24 @@ fn lookup_name(&env e, option.t[import_map] index,
147
181
ret none[ def_wrap] ;
148
182
}
149
183
150
- fn found_def_view ( & env e, option. t[ import_map] index ,
151
- @ast. view_item i ) -> option. t[ def_wrap ] {
184
+ fn found_def_view ( & env e, @ast. view_item i ) -> option. t[ def_wrap ] {
152
185
alt ( i. node ) {
153
186
case ( ast. view_item_use ( _, _, ?id) ) {
154
187
ret some[ def_wrap] ( def_wrap_use ( i) ) ;
155
188
}
156
189
case ( ast. view_item_import ( ?idents, ?d) ) {
157
- alt ( index) {
158
- case ( some[ import_map] ( ?idx) ) {
159
- ret idx. find ( d) ;
160
- }
161
- case ( none[ import_map] ) {
162
- ret find_final_def ( e, i. span , idents) ;
163
- }
164
- }
190
+ ret some[ def_wrap] ( def_wrap_import ( i) ) ;
165
191
}
166
192
}
167
193
fail;
168
194
}
169
195
170
- fn check_mod ( & env e, option. t[ import_map] index , ast . ident i,
171
- ast. _mod m ) -> option. t[ def_wrap ] {
196
+ fn check_mod ( & env e, ast . ident i, ast. _mod m ) -> option. t[ def_wrap ] {
172
197
alt ( m. index . find ( i) ) {
173
198
case ( some[ ast. mod_index_entry ] ( ?ent) ) {
174
199
alt ( ent) {
175
200
case ( ast. mie_view_item ( ?view_item) ) {
176
- ret found_def_view ( e, index , view_item) ;
201
+ ret found_def_view ( e, view_item) ;
177
202
}
178
203
case ( ast. mie_item ( ?item) ) {
179
204
ret found_def_item ( item) ;
@@ -199,12 +224,11 @@ fn lookup_name(&env e, option.t[import_map] index,
199
224
}
200
225
201
226
202
- fn in_scope ( ast . ident i, env e, option. t[ import_map] index ,
203
- & scope s) -> option. t[ def_wrap ] {
227
+ fn in_scope ( ast . ident i, env e, & scope s) -> option. t[ def_wrap ] {
204
228
alt ( s) {
205
229
206
230
case ( scope_crate ( ?c) ) {
207
- ret check_mod ( e, index , i, c. node . module ) ;
231
+ ret check_mod ( e, i, c. node . module ) ;
208
232
}
209
233
210
234
case ( scope_item ( ?it) ) {
@@ -238,7 +262,7 @@ fn lookup_name(&env e, option.t[import_map] index,
238
262
}
239
263
}
240
264
case ( ast. item_mod ( _, ?m, _) ) {
241
- ret check_mod ( e, index , i, m) ;
265
+ ret check_mod ( e, i, m) ;
242
266
}
243
267
case ( _) { /* fall through */ }
244
268
}
@@ -267,14 +291,14 @@ fn lookup_name(&env e, option.t[import_map] index,
267
291
}
268
292
269
293
ret std. list . find [ scope, def_wrap] ( e. scopes ,
270
- bind in_scope ( i, e, index , _) ) ;
294
+ bind in_scope ( i, e, _) ) ;
271
295
}
272
296
273
297
fn fold_pat_tag ( & env e, & span sp, import_map index, ident i,
274
298
vec[ @ast. pat] args, option. t[ ast. variant_def] old_def ,
275
299
ann a) -> @ast . pat {
276
300
auto new_def;
277
- alt ( unwrap_def ( lookup_name ( e, some ( index) , i) ) ) {
301
+ alt ( lookup_name ( e, index, i) ) {
278
302
case ( some[ def] ( ?d) ) {
279
303
alt ( d) {
280
304
case ( ast. def_variant ( ?did, ?vid) ) {
@@ -327,7 +351,7 @@ fn fold_expr_path(&env e, &span sp, import_map index,
327
351
check ( n_idents != 0 u) ;
328
352
auto id0 = p. node . idents . ( 0 ) ;
329
353
330
- auto d_ = unwrap_def ( lookup_name ( e, some ( index) , id0) ) ;
354
+ auto d_ = lookup_name ( e, index, id0) ;
331
355
332
356
alt ( d_) {
333
357
case ( some[ def] ( _) ) {
@@ -362,11 +386,15 @@ fn fold_view_item_import(&env e, &span sp,
362
386
auto last_id = is. ( len - 1 u) ;
363
387
auto d = find_final_def ( e, sp, is) ;
364
388
alt ( d) {
365
- case ( none[ def_wrap] ) {
366
- e. sess . span_err ( sp, "unresolved name: " + last_id) ;
389
+ case ( def_wrap_mod ( ?m) ) {
390
+ alt ( m. node ) {
391
+ case ( ast. item_mod ( _, _, ?id) ) {
392
+ index. insert ( id, ast. def_mod ( id) ) ;
393
+ }
394
+ }
367
395
}
368
- case ( some [ def_wrap ] ( ?d2 ) ) {
369
- index. insert ( id, d2 ) ;
396
+ case ( def_wrap_other ( ?target_def ) ) {
397
+ index. insert ( id, target_def ) ;
370
398
}
371
399
}
372
400
@@ -387,7 +415,7 @@ fn fold_ty_path(&env e, &span sp, import_map index, ast.path p,
387
415
e. sess . unimpl ( "resolving path ty with ty params" ) ;
388
416
}
389
417
390
- auto d_ = unwrap_def ( lookup_name ( e, some ( index) , p. node . idents . ( 0 ) ) ) ;
418
+ auto d_ = lookup_name ( e, index, p. node . idents . ( 0 ) ) ;
391
419
392
420
alt ( d_) {
393
421
case ( some[ def] ( ?d) ) {
@@ -421,7 +449,7 @@ fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate {
421
449
422
450
let fold. ast_fold[ env] fld = fold. new_identity_fold [ env] ( ) ;
423
451
424
- auto import_index = new_def_hash[ def_wrap ] ( ) ;
452
+ auto import_index = new_def_hash[ def ] ( ) ;
425
453
fld = @rec ( fold_pat_tag = bind fold_pat_tag ( _, _, import_index, _, _, _, _) ,
426
454
fold_expr_path = bind fold_expr_path ( _, _, import_index, _, _, _) ,
427
455
fold_view_item_import
0 commit comments