@@ -24,66 +24,139 @@ tag scope {
24
24
type env = rec ( list[ scope] scopes ,
25
25
session . session sess) ;
26
26
27
- fn lookup_name ( & env e, ast . ident i) -> option. t[ def ] {
27
+ // A simple wrapper over defs that stores a bit more information about modules
28
+ // and uses so that we can use the regular lookup_name when resolving imports.
29
+ tag def_wrap {
30
+ def_wrap_use( @ast. view_item ) ;
31
+ def_wrap_mod ( @ast. item ) ;
32
+ def_wrap_other ( def) ;
33
+ }
34
+
35
+ fn unwrap_def ( option. t[ def_wrap] d_ ) -> option. t[ def ] {
36
+ alt ( d_) {
37
+ case ( none[ def_wrap] ) {
38
+ ret none[ def] ;
39
+ }
40
+ case ( some[ def_wrap] ( ?d) ) {
41
+ alt ( d) {
42
+ case ( def_wrap_use ( ?it) ) {
43
+ alt ( it. node ) {
44
+ case ( ast. view_item_use ( _, _, ?id) ) {
45
+ ret some[ def] ( ast. def_use ( id) ) ;
46
+ }
47
+ }
48
+ fail;
49
+ }
50
+ case ( def_wrap_mod ( ?i) ) {
51
+ alt ( i. node ) {
52
+ case ( ast. item_mod ( _, _, ?id) ) {
53
+ ret some[ def] ( ast. def_mod ( id) ) ;
54
+ }
55
+ }
56
+ fail;
57
+ }
58
+ case ( def_wrap_other ( ?d) ) {
59
+ ret some[ def] ( d) ;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ fail;
65
+ }
66
+
67
+ // Follow the path of an import and return what it ultimately points to.
68
+
69
+ fn find_final_def ( & env e, vec[ ident] idents ) -> option. t[ def_wrap ] {
70
+ auto len = _vec. len [ ident] ( idents) ;
71
+ auto first = idents. ( 0 ) ;
72
+ if ( len == 1 u) {
73
+ ret lookup_name ( e, first) ;
74
+ }
75
+ auto d_ = lookup_name ( e, first) ;
76
+ alt ( d_) {
77
+ case ( none[ def_wrap] ) {
78
+ ret d_;
79
+ }
80
+ case ( some[ def_wrap] ( ?d) ) {
81
+ alt ( d) {
82
+ case ( def_wrap_mod ( ?i) ) {
83
+ auto new_env = update_env_for_item ( e, i) ;
84
+ auto new_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
85
+ ret find_final_def ( new_env, new_idents) ;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ fail;
91
+ }
92
+
93
+ fn lookup_name ( & env e, ast . ident i) -> option. t[ def_wrap ] {
28
94
29
95
// log "resolving name " + i;
30
96
31
- fn found_def_item ( @ast. item i ) -> option. t[ def ] {
97
+ fn found_def_item ( @ast. item i ) -> option. t[ def_wrap ] {
32
98
alt ( i. node ) {
33
99
case ( ast. item_const ( _, _, _, ?id, _) ) {
34
- ret some[ def ] ( ast. def_const ( id) ) ;
100
+ ret some[ def_wrap ] ( def_wrap_other ( ast. def_const ( id) ) ) ;
35
101
}
36
102
case ( ast. item_fn ( _, _, _, ?id, _) ) {
37
- ret some[ def ] ( ast. def_fn ( id) ) ;
103
+ ret some[ def_wrap ] ( def_wrap_other ( ast. def_fn ( id) ) ) ;
38
104
}
39
105
case ( ast. item_mod ( _, _, ?id) ) {
40
- ret some[ def ] ( ast . def_mod ( id ) ) ;
106
+ ret some[ def_wrap ] ( def_wrap_mod ( i ) ) ;
41
107
}
42
108
case ( ast. item_ty ( _, _, _, ?id, _) ) {
43
- ret some[ def ] ( ast. def_ty ( id) ) ;
109
+ ret some[ def_wrap ] ( def_wrap_other ( ast. def_ty ( id) ) ) ;
44
110
}
45
111
case ( ast. item_tag ( _, _, _, ?id) ) {
46
- ret some[ def ] ( ast. def_ty ( id) ) ;
112
+ ret some[ def_wrap ] ( def_wrap_other ( ast. def_ty ( id) ) ) ;
47
113
}
48
114
case ( ast. item_obj ( _, _, _, ?id, _) ) {
49
- ret some[ def ] ( ast. def_obj ( id) ) ;
115
+ ret some[ def_wrap ] ( def_wrap_other ( ast. def_obj ( id) ) ) ;
50
116
}
51
117
}
52
118
}
53
119
54
- fn found_decl_stmt ( @ast. stmt s ) -> option. t[ def ] {
120
+ fn found_decl_stmt ( @ast. stmt s ) -> option. t[ def_wrap ] {
55
121
alt ( s. node ) {
56
122
case ( ast. stmt_decl ( ?d) ) {
57
123
alt ( d. node ) {
58
124
case ( ast. decl_local ( ?loc) ) {
59
- ret some[ def] ( ast. def_local ( loc. id ) ) ;
125
+ auto t = ast. def_local ( loc. id ) ;
126
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
60
127
}
61
128
case ( ast. decl_item ( ?it) ) {
62
129
ret found_def_item ( it) ;
63
130
}
64
131
}
65
132
}
66
133
}
67
- ret none[ def ] ;
134
+ ret none[ def_wrap ] ;
68
135
}
69
136
70
- fn found_def_view ( @ast. view_item i ) -> option. t[ def ] {
137
+ fn found_def_view ( & env e , @ast. view_item i ) -> option. t[ def_wrap ] {
71
138
alt ( i. node ) {
72
139
case ( ast. view_item_use ( _, _, ?id) ) {
73
- ret some[ def ] ( ast . def_use ( id ) ) ;
140
+ ret some[ def_wrap ] ( def_wrap_use ( i ) ) ;
74
141
}
75
- case ( ast. view_item_import ( _, ?id) ) {
76
- ret some[ def] ( ast. def_import ( id) ) ;
142
+ case ( ast. view_item_import ( ?idents, _) ) {
143
+ auto d = find_final_def ( e, idents) ;
144
+ alt ( d) {
145
+ case ( some[ def_wrap] ( _) ) {
146
+ ret d;
147
+ }
148
+ }
77
149
}
78
150
}
151
+ fail;
79
152
}
80
153
81
- fn check_mod ( ast . ident i, ast. _mod m ) -> option. t[ def ] {
154
+ fn check_mod ( & env e , ast . ident i, ast. _mod m ) -> option. t[ def_wrap ] {
82
155
alt ( m. index . find ( i) ) {
83
156
case ( some[ ast. mod_index_entry ] ( ?ent) ) {
84
157
alt ( ent) {
85
158
case ( ast. mie_view_item ( ?ix) ) {
86
- ret found_def_view ( m. view_items . ( ix) ) ;
159
+ ret found_def_view ( e , m. view_items . ( ix) ) ;
87
160
}
88
161
case ( ast. mie_item ( ?ix) ) {
89
162
ret found_def_item ( m. items . ( ix) ) ;
@@ -92,7 +165,8 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def] {
92
165
alt ( m. items . ( item_idx) . node ) {
93
166
case ( ast. item_tag ( _, ?variants, _, ?tid) ) {
94
167
auto vid = variants. ( variant_idx) . id ;
95
- ret some[ def] ( ast. def_variant ( tid, vid) ) ;
168
+ auto t = ast. def_variant ( tid, vid) ;
169
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
96
170
}
97
171
case ( _) {
98
172
log "tag item not actually a tag" ;
@@ -104,45 +178,49 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def] {
104
178
}
105
179
case ( none[ ast. mod_index_entry ] ) { /* fall through */ }
106
180
}
107
- ret none[ def ] ;
181
+ ret none[ def_wrap ] ;
108
182
}
109
183
110
184
111
- fn in_scope ( ast . ident i, & scope s) -> option. t[ def ] {
185
+ fn in_scope ( ast . ident i, env e , & scope s) -> option. t[ def_wrap ] {
112
186
alt ( s) {
113
187
114
188
case ( scope_crate ( ?c) ) {
115
- ret check_mod ( i, c. node . module ) ;
189
+ ret check_mod ( e , i, c. node . module ) ;
116
190
}
117
191
118
192
case ( scope_item ( ?it) ) {
119
193
alt ( it. node ) {
120
194
case ( ast. item_fn ( _, ?f, ?ty_params, _, _) ) {
121
195
for ( ast. arg a in f. inputs) {
122
196
if ( _str. eq ( a. ident , i) ) {
123
- ret some[ def] ( ast. def_arg ( a. id ) ) ;
197
+ auto t = ast. def_arg ( a. id ) ;
198
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
124
199
}
125
200
}
126
201
for ( ast. ty_param tp in ty_params) {
127
202
if ( _str. eq ( tp. ident , i) ) {
128
- ret some[ def] ( ast. def_ty_arg ( tp. id ) ) ;
203
+ auto t = ast. def_ty_arg ( tp. id ) ;
204
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
129
205
}
130
206
}
131
207
}
132
208
case ( ast. item_obj ( _, ?ob, ?ty_params, _, _) ) {
133
209
for ( ast. obj_field f in ob. fields) {
134
210
if ( _str. eq ( f. ident , i) ) {
135
- ret some[ def] ( ast. def_obj_field ( f. id ) ) ;
211
+ auto t = ast. def_obj_field ( f. id ) ;
212
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
136
213
}
137
214
}
138
215
for ( ast. ty_param tp in ty_params) {
139
216
if ( _str. eq ( tp. ident , i) ) {
140
- ret some[ def] ( ast. def_ty_arg ( tp. id ) ) ;
217
+ auto t = ast. def_ty_arg ( tp. id ) ;
218
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
141
219
}
142
220
}
143
221
}
144
222
case ( ast. item_mod ( _, ?m, _) ) {
145
- ret check_mod ( i, m) ;
223
+ ret check_mod ( e , i, m) ;
146
224
}
147
225
case ( _) { /* fall through */ }
148
226
}
@@ -160,22 +238,23 @@ fn lookup_name(&env e, ast.ident i) -> option.t[def] {
160
238
case ( scope_arm ( ?a) ) {
161
239
alt ( a. index . find ( i) ) {
162
240
case ( some[ ast. def_id ] ( ?did) ) {
163
- ret some[ def] ( ast. def_binding ( did) ) ;
241
+ auto t = ast. def_binding ( did) ;
242
+ ret some[ def_wrap] ( def_wrap_other ( t) ) ;
164
243
}
165
244
case ( _) { /* fall through */ }
166
245
}
167
246
}
168
247
}
169
- ret none[ def ] ;
248
+ ret none[ def_wrap ] ;
170
249
}
171
250
172
- ret std. list . find [ scope, def ] ( e. scopes , bind in_scope ( i, _) ) ;
251
+ ret std. list . find [ scope, def_wrap ] ( e. scopes , bind in_scope ( i, e , _) ) ;
173
252
}
174
253
175
254
fn fold_pat_tag ( & env e, & span sp, ident i, vec[ @ast. pat] args,
176
255
option. t[ ast. variant_def] old_def , ann a) -> @ast . pat {
177
256
auto new_def;
178
- alt ( lookup_name ( e, i) ) {
257
+ alt ( unwrap_def ( lookup_name ( e, i) ) ) {
179
258
case ( some[ def] ( ?d) ) {
180
259
alt ( d) {
181
260
case ( ast. def_variant ( ?did, ?vid) ) {
@@ -203,7 +282,7 @@ fn fold_expr_name(&env e, &span sp, &ast.name n,
203
282
e. sess . unimpl ( "resolving name expr with ty params" ) ;
204
283
}
205
284
206
- auto d_ = lookup_name ( e, n. node . ident ) ;
285
+ auto d_ = unwrap_def ( lookup_name ( e, n. node . ident ) ) ;
207
286
208
287
alt ( d_) {
209
288
case ( some[ def] ( _) ) {
@@ -232,7 +311,7 @@ fn fold_ty_path(&env e, &span sp, ast.path p,
232
311
e. sess . unimpl ( "resolving path ty with ty params" ) ;
233
312
}
234
313
235
- auto d_ = lookup_name ( e, n. node . ident ) ;
314
+ auto d_ = unwrap_def ( lookup_name ( e, n. node . ident ) ) ;
236
315
237
316
alt ( d_) {
238
317
case ( some[ def] ( _) ) {
0 commit comments