Skip to content

Commit b64791d

Browse files
author
Rafael Avila de Espindola
committed
---
yaml --- r: 1342 b: refs/heads/master c: 3e613c1 h: refs/heads/master v: v3
1 parent d1f66f2 commit b64791d

File tree

3 files changed

+61
-20
lines changed

3 files changed

+61
-20
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: ff6864aa5ca14795ae0e23e97e0e67b1122a6b68
2+
refs/heads/master: 3e613c1648141ac757d1f0608ad845686ebbe97e

trunk/src/comp/front/ast.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ tag def {
3636
def_ty_arg(def_id);
3737
def_binding(def_id);
3838
def_use(def_id);
39+
def_native_ty(def_id);
40+
def_native_fn(def_id);
3941
}
4042

4143
type crate = spanned[crate_];

trunk/src/comp/middle/resolve.rs

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ tag def_wrap {
3434
def_wrap_use(@ast.view_item);
3535
def_wrap_import(@ast.view_item);
3636
def_wrap_mod(@ast.item);
37+
def_wrap_native_mod(@ast.item);
3738
def_wrap_other(def);
3839
def_wrap_expr_field(uint, def);
3940
def_wrap_resolving;
@@ -103,6 +104,29 @@ fn find_final_def(&env e, import_map index,
103104
// should return what a.b.c.d points to in the end.
104105
fn found_something(&env e, import_map index,
105106
&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, 1u, 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+
106130
alt (d) {
107131
case (def_wrap_import(?imp)) {
108132
alt (imp.node) {
@@ -122,23 +146,10 @@ fn find_final_def(&env e, import_map index,
122146
}
123147
alt (d) {
124148
case (def_wrap_mod(?i)) {
125-
auto rest_idents = _vec.slice[ident](idents, 1u, 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);
142153
}
143154
case (def_wrap_use(?c)) {
144155
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)] {
201212
case (ast.item_mod(_, _, ?id)) {
202213
ret def_wrap_mod(i);
203214
}
215+
case (ast.item_native_mod(_, _, ?id)) {
216+
ret def_wrap_native_mod(i);
217+
}
204218
case (ast.item_ty(_, _, _, ?id, _)) {
205219
ret def_wrap_other(ast.def_ty(id));
206220
}
@@ -213,6 +227,17 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
213227
}
214228
}
215229

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+
216241
fn found_decl_stmt(@ast.stmt s) -> def_wrap {
217242
alt (s.node) {
218243
case (ast.stmt_decl(?d)) {
@@ -267,11 +292,22 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
267292
}
268293
}
269294
}
270-
case (none[ast.mod_index_entry]) { /* fall through */ }
295+
case (none[ast.mod_index_entry]) {
296+
ret none[def_wrap];
297+
}
271298
}
272-
ret none[def_wrap];
273299
}
274300

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+
}
275311

276312
fn in_scope(ast.ident i, &scope s) -> option.t[def_wrap] {
277313
alt (s) {
@@ -313,6 +349,9 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
313349
case (ast.item_mod(_, ?m, _)) {
314350
ret check_mod(i, m);
315351
}
352+
case (ast.item_native_mod(_, ?m, _)) {
353+
ret check_native_mod(i, m);
354+
}
316355
case (ast.item_ty(_, _, ?ty_params, _, _)) {
317356
for (ast.ty_param tp in ty_params) {
318357
if (_str.eq(tp.ident, i)) {

0 commit comments

Comments
 (0)