@@ -34,6 +34,7 @@ tag def_wrap {
34
34
def_wrap_use( @ast. view_item ) ;
35
35
def_wrap_import ( @ast. view_item ) ;
36
36
def_wrap_mod ( @ast. item ) ;
37
+ def_wrap_native_mod ( @ast. item ) ;
37
38
def_wrap_other ( def) ;
38
39
def_wrap_expr_field ( uint, def) ;
39
40
def_wrap_resolving;
@@ -103,6 +104,29 @@ fn find_final_def(&env e, import_map index,
103
104
// should return what a.b.c.d points to in the end.
104
105
fn found_something ( & env e, import_map index,
105
106
& span sp, vec[ ident] idents , def_wrap d) -> def_wrap {
107
+
108
+ fn found_mod ( & env e, & import_map index, & span sp,
109
+ vec[ ident] idents , @ast. item i ) -> def_wrap {
110
+ auto len = _vec. len [ ident] ( idents) ;
111
+ auto rest_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
112
+ auto empty_e = rec ( scopes = nil[ scope] ,
113
+ sess = e. sess ) ;
114
+ auto tmp_e = update_env_for_item ( empty_e, i) ;
115
+ auto next_i = rest_idents. ( 0 ) ;
116
+ auto next_ = lookup_name_wrapped ( tmp_e, next_i) ;
117
+ alt ( next_) {
118
+ case ( none[ tup ( @env, def_wrap) ] ) {
119
+ e. sess . span_err ( sp, "unresolved name: " + next_i) ;
120
+ fail;
121
+ }
122
+ case ( some[ tup ( @env, def_wrap) ] ( ?next) ) {
123
+ auto combined_e = update_env_for_item ( e, i) ;
124
+ ret found_something ( combined_e, index, sp,
125
+ rest_idents, next. _1 ) ;
126
+ }
127
+ }
128
+ }
129
+
106
130
alt ( d) {
107
131
case ( def_wrap_import ( ?imp) ) {
108
132
alt ( imp. node ) {
@@ -122,23 +146,10 @@ fn find_final_def(&env e, import_map index,
122
146
}
123
147
alt ( d) {
124
148
case ( def_wrap_mod ( ?i) ) {
125
- auto rest_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
126
- auto empty_e = rec ( scopes = nil[ scope] ,
127
- sess = e. sess ) ;
128
- auto tmp_e = update_env_for_item ( empty_e, i) ;
129
- auto next_i = rest_idents. ( 0 ) ;
130
- auto next_ = lookup_name_wrapped ( tmp_e, next_i) ;
131
- alt ( next_) {
132
- case ( none[ tup ( @env, def_wrap) ] ) {
133
- e. sess . span_err ( sp, "unresolved name: " + next_i) ;
134
- fail;
135
- }
136
- case ( some[ tup ( @env, def_wrap) ] ( ?next) ) {
137
- auto combined_e = update_env_for_item ( e, i) ;
138
- ret found_something ( combined_e, index, sp,
139
- rest_idents, next. _1 ) ;
140
- }
141
- }
149
+ ret found_mod ( e, index, sp, idents, i) ;
150
+ }
151
+ case ( def_wrap_native_mod ( ?i) ) {
152
+ ret found_mod ( e, index, sp, idents, i) ;
142
153
}
143
154
case ( def_wrap_use ( ?c) ) {
144
155
e. sess . span_err ( sp, "Crate access is not implemented" ) ;
@@ -201,6 +212,9 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
201
212
case ( ast. item_mod ( _, _, ?id) ) {
202
213
ret def_wrap_mod ( i) ;
203
214
}
215
+ case ( ast. item_native_mod ( _, _, ?id) ) {
216
+ ret def_wrap_native_mod ( i) ;
217
+ }
204
218
case ( ast. item_ty ( _, _, _, ?id, _) ) {
205
219
ret def_wrap_other ( ast. def_ty ( id) ) ;
206
220
}
@@ -213,6 +227,17 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
213
227
}
214
228
}
215
229
230
+ fn found_def_native_item ( @ast. native_item i ) -> def_wrap {
231
+ alt ( i. node ) {
232
+ case ( ast. native_item_ty ( _, ?id) ) {
233
+ ret def_wrap_other ( ast. def_native_ty ( id) ) ;
234
+ }
235
+ case ( ast. native_item_fn ( _, _, _, ?id) ) {
236
+ ret def_wrap_other ( ast. def_native_fn ( id) ) ;
237
+ }
238
+ }
239
+ }
240
+
216
241
fn found_decl_stmt ( @ast. stmt s ) -> def_wrap {
217
242
alt ( s. node ) {
218
243
case ( ast. stmt_decl ( ?d) ) {
@@ -267,11 +292,22 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
267
292
}
268
293
}
269
294
}
270
- case ( none[ ast. mod_index_entry ] ) { /* fall through */ }
295
+ case ( none[ ast. mod_index_entry ] ) {
296
+ ret none[ def_wrap] ;
297
+ }
271
298
}
272
- ret none[ def_wrap] ;
273
299
}
274
300
301
+ fn check_native_mod ( ast . ident i, ast. native_mod m ) -> option. t[ def_wrap ] {
302
+ alt ( m. index . find ( i) ) {
303
+ case ( some[ @ast. native_item ] ( ?item) ) {
304
+ ret some ( found_def_native_item ( item) ) ;
305
+ }
306
+ case ( _) {
307
+ ret none[ def_wrap] ;
308
+ }
309
+ }
310
+ }
275
311
276
312
fn in_scope ( ast . ident i, & scope s) -> option. t[ def_wrap ] {
277
313
alt ( s) {
@@ -313,6 +349,9 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
313
349
case ( ast. item_mod ( _, ?m, _) ) {
314
350
ret check_mod ( i, m) ;
315
351
}
352
+ case ( ast. item_native_mod ( _, ?m, _) ) {
353
+ ret check_native_mod ( i, m) ;
354
+ }
316
355
case ( ast. item_ty ( _, _, ?ty_params, _, _) ) {
317
356
for ( ast. ty_param tp in ty_params) {
318
357
if ( _str. eq ( tp. ident , i) ) {
0 commit comments