Skip to content

Commit c7e9b19

Browse files
committed
---
yaml --- r: 2505 b: refs/heads/master c: 1a12a7b h: refs/heads/master i: 2503: c05bf7e v: v3
1 parent e3f2880 commit c7e9b19

File tree

3 files changed

+101
-43
lines changed

3 files changed

+101
-43
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: 58ec5d1654f367d7f3459ebee2b5f4c89e0f3aa1
2+
refs/heads/master: 1a12a7b04b5c279b897dda998e946085883d9cf9

trunk/src/comp/middle/resolve.rs

Lines changed: 87 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@ tag mod_index_entry {
6464
mie_item(@ast::item);
6565
mie_tag_variant(@ast::item /* tag item */, uint /* variant index */);
6666
}
67-
type mod_index = hashmap[ident,mod_index_entry];
67+
type mod_index = hashmap[ident,list[mod_index_entry]];
6868
type indexed_mod = rec(ast::_mod m, mod_index index);
6969

70-
tag native_mod_index_entry {
70+
tag nmod_index_entry {
7171
nmie_view_item(@ast::view_item);
7272
nmie_item(@ast::native_item);
7373
}
74-
type nmod_index = hashmap[ident,native_mod_index_entry];
74+
type nmod_index = hashmap[ident,list[nmod_index_entry]];
7575
type indexed_nmod = rec(ast::native_mod m, nmod_index index);
7676

7777
type def_map = hashmap[uint,def];
@@ -340,9 +340,9 @@ fn resolve_import(&env e, &@ast::view_item it, &list[scope] sc) {
340340
}
341341
}
342342

343-
fn register(&env e, def_id defid, &span sp, ident id,
344-
option::t[def] val, option::t[def] typ) {
345-
if (val == none[def] && typ == none[def]) {
343+
fn register(&env e, def_id defid, &span sp, &ident id,
344+
&option::t[def] val, &option::t[def] typ) {
345+
if (option::is_none(val) && option::is_none(typ)) {
346346
unresolved(e, sp, id, "import");
347347
}
348348
e.imports.insert(defid._1, resolved(val, typ));
@@ -366,7 +366,7 @@ fn ns_name(namespace ns) -> str {
366366
}
367367
}
368368

369-
fn unresolved(&env e, &span sp, ident id, str kind) {
369+
fn unresolved(&env e, &span sp, &ident id, &str kind) {
370370
e.sess.span_err(sp, "unresolved " + kind + ": " + id);
371371
}
372372

@@ -392,7 +392,7 @@ fn lookup_path_strict(&env e, &list[scope] sc, &span sp, vec[ident] idents,
392392
ret dcur;
393393
}
394394

395-
fn lookup_in_scope_strict(&env e, list[scope] sc, &span sp, ident id,
395+
fn lookup_in_scope_strict(&env e, list[scope] sc, &span sp, &ident id,
396396
namespace ns) -> def {
397397
alt (lookup_in_scope(e, sc, sp, id, ns)) {
398398
case (none[def]) {
@@ -433,9 +433,9 @@ fn def_is_obj_field(&def d) -> bool {
433433
};
434434
}
435435

436-
fn lookup_in_scope(&env e, list[scope] sc, &span sp, ident id, namespace ns)
436+
fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
437437
-> option::t[def] {
438-
fn in_scope(&env e, ident id, &scope s, namespace ns)
438+
fn in_scope(&env e, &ident id, &scope s, namespace ns)
439439
-> option::t[def] {
440440
alt (s) {
441441
case (scope_crate(?c)) {
@@ -513,8 +513,8 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, ident id, namespace ns)
513513
auto df = option::get(fnd);
514514
if ((left_fn && def_is_local(df)) ||
515515
(left_fn_level2 && def_is_obj_field(df))) {
516-
e.sess.span_err(sp, "attempted dynamic " +
517-
"environment-capture");
516+
e.sess.span_err
517+
(sp, "attempted dynamic environment-capture");
518518
}
519519
ret fnd;
520520
}
@@ -528,7 +528,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, ident id, namespace ns)
528528
}
529529
}
530530

531-
fn lookup_in_ty_params(ident id, &vec[ast::ty_param] ty_params)
531+
fn lookup_in_ty_params(&ident id, &vec[ast::ty_param] ty_params)
532532
-> option::t[def] {
533533
auto i = 0u;
534534
for (ast::ty_param tp in ty_params) {
@@ -540,7 +540,7 @@ fn lookup_in_ty_params(ident id, &vec[ast::ty_param] ty_params)
540540
ret none[def];
541541
}
542542

543-
fn lookup_in_pat(ident id, &ast::pat pat) -> option::t[def] {
543+
fn lookup_in_pat(&ident id, &ast::pat pat) -> option::t[def] {
544544
alt (pat.node) {
545545
case (ast::pat_bind(?name, ?defid, _)) {
546546
if (_str::eq(name, id)) { ret some(ast::def_binding(defid)); }
@@ -558,7 +558,7 @@ fn lookup_in_pat(ident id, &ast::pat pat) -> option::t[def] {
558558
}
559559

560560

561-
fn lookup_in_fn(ident id, &ast::fn_decl decl, &vec[ast::ty_param] ty_params,
561+
fn lookup_in_fn(&ident id, &ast::fn_decl decl, &vec[ast::ty_param] ty_params,
562562
namespace ns) -> option::t[def] {
563563
if (ns == ns_value) {
564564
for (ast::arg a in decl.inputs) {
@@ -572,7 +572,7 @@ fn lookup_in_fn(ident id, &ast::fn_decl decl, &vec[ast::ty_param] ty_params,
572572
}
573573
}
574574

575-
fn lookup_in_obj(ident id, &ast::_obj ob, &vec[ast::ty_param] ty_params,
575+
fn lookup_in_obj(&ident id, &ast::_obj ob, &vec[ast::ty_param] ty_params,
576576
namespace ns) -> option::t[def] {
577577
if (ns == ns_value) {
578578
for (ast::obj_field f in ob.fields) {
@@ -586,7 +586,7 @@ fn lookup_in_obj(ident id, &ast::_obj ob, &vec[ast::ty_param] ty_params,
586586
}
587587
}
588588

589-
fn lookup_in_block(ident id, &ast::block_ b, namespace ns)
589+
fn lookup_in_block(&ident id, &ast::block_ b, namespace ns)
590590
-> option::t[def] {
591591
for (@ast::stmt st in b.stmts) {
592592
alt (st.node) {
@@ -659,7 +659,7 @@ fn found_def_item(@ast::item i, namespace ns) -> option::t[def] {
659659
ret none[def];
660660
}
661661

662-
fn lookup_in_mod_strict(&env e, def m, &span sp, ident id,
662+
fn lookup_in_mod_strict(&env e, def m, &span sp, &ident id,
663663
namespace ns, dir dr) -> def {
664664
alt (lookup_in_mod(e, m, id, ns, dr)) {
665665
case (none[def]) {
@@ -672,7 +672,7 @@ fn lookup_in_mod_strict(&env e, def m, &span sp, ident id,
672672
}
673673
}
674674

675-
fn lookup_in_mod(&env e, def m, ident id, namespace ns, dir dr)
675+
fn lookup_in_mod(&env e, def m, &ident id, namespace ns, dir dr)
676676
-> option::t[def] {
677677
auto defid = ast::def_id_of_def(m);
678678
if (defid._0 != ast::local_crate) { // Not in this crate
@@ -728,15 +728,32 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
728728
}
729729
}
730730

731-
fn lookup_in_regular_mod(&env e, def_id defid, ident id, namespace ns, dir dr)
731+
fn lookup_in_regular_mod(&env e, def_id defid, &ident id, namespace ns, dir dr)
732732
-> option::t[def] {
733733
auto info = e.mod_map.get(defid._1);
734734
auto found = info.index.find(id);
735-
if (found == none[mod_index_entry] ||
735+
if (option::is_none(found) ||
736736
(dr == outside && !ast::is_exported(id, info.m))) {
737737
ret none[def];
738738
}
739-
alt (option::get(found)) {
739+
auto lst = option::get(found);
740+
while (true) {
741+
alt (lst) {
742+
case (nil[mod_index_entry]) {
743+
ret none[def];
744+
}
745+
case (cons[mod_index_entry](?hd, ?tl)) {
746+
auto found = lookup_in_mie(e, hd, ns);
747+
if (!option::is_none(found)) { ret found; }
748+
lst = *tl;
749+
}
750+
}
751+
}
752+
}
753+
754+
fn lookup_in_mie(&env e, &mod_index_entry mie, namespace ns)
755+
-> option::t[def] {
756+
alt (mie) {
740757
case (mie_view_item(?view_item)) {
741758
ret found_view_item(e, view_item, ns);
742759
}
@@ -754,18 +771,35 @@ fn lookup_in_regular_mod(&env e, def_id defid, ident id, namespace ns, dir dr)
754771
}
755772
}
756773
}
757-
}
774+
}
758775
}
759776
}
760777

761-
fn lookup_in_native_mod(&env e, def_id defid, ident id, namespace ns)
778+
fn lookup_in_native_mod(&env e, def_id defid, &ident id, namespace ns)
762779
-> option::t[def] {
763780
auto info = e.nmod_map.get(defid._1);
764781
auto found = info.index.find(id);
765-
if (found == none[native_mod_index_entry]) {
782+
if (option::is_none(found)) {
766783
ret none[def];
767784
}
768-
alt (option::get(found)) {
785+
auto lst = option::get(found);
786+
while (true) {
787+
alt (lst) {
788+
case (nil[nmod_index_entry]) {
789+
ret none[def];
790+
}
791+
case (cons[nmod_index_entry](?hd, ?tl)) {
792+
auto found = lookup_in_nmie(e, hd, ns);
793+
if (!option::is_none(found)) { ret found; }
794+
lst = *tl;
795+
}
796+
}
797+
}
798+
}
799+
800+
fn lookup_in_nmie(&env e, &nmod_index_entry nmie, namespace ns)
801+
-> option::t[def] {
802+
alt (nmie) {
769803
case (nmie_view_item(?view_item)) {
770804
ret found_view_item(e, view_item, ns);
771805
}
@@ -790,16 +824,27 @@ fn lookup_in_native_mod(&env e, def_id defid, ident id, namespace ns)
790824

791825
// Module indexing
792826

827+
fn add_to_index[T](&hashmap[ident,list[T]] index, &ident id, &T ent) {
828+
alt (index.find(id)) {
829+
case (none[list[T]]) {
830+
index.insert(id, cons(ent, @nil[T]));
831+
}
832+
case (some[list[T]](?prev)) {
833+
index.insert(id, cons(ent, @prev));
834+
}
835+
}
836+
}
837+
793838
fn index_mod(&ast::_mod md) -> mod_index {
794-
auto index = new_str_hash[mod_index_entry]();
839+
auto index = new_str_hash[list[mod_index_entry]]();
795840

796841
for (@ast::view_item it in md.view_items) {
797842
alt (it.node) {
798843
case(ast::view_item_use(?id, _, _, _)) {
799-
index.insert(id, mie_view_item(it));
844+
add_to_index(index, id, mie_view_item(it));
800845
}
801846
case(ast::view_item_import(?def_ident,_,_)) {
802-
index.insert(def_ident, mie_view_item(it));
847+
add_to_index(index, def_ident, mie_view_item(it));
803848
}
804849
case(ast::view_item_export(_)) {}
805850
}
@@ -808,31 +853,31 @@ fn index_mod(&ast::_mod md) -> mod_index {
808853
for (@ast::item it in md.items) {
809854
alt (it.node) {
810855
case (ast::item_const(?id, _, _, _, _)) {
811-
index.insert(id, mie_item(it));
856+
add_to_index(index, id, mie_item(it));
812857
}
813858
case (ast::item_fn(?id, _, _, _, _)) {
814-
index.insert(id, mie_item(it));
859+
add_to_index(index, id, mie_item(it));
815860
}
816861
case (ast::item_mod(?id, _, _)) {
817-
index.insert(id, mie_item(it));
862+
add_to_index(index, id, mie_item(it));
818863
}
819864
case (ast::item_native_mod(?id, _, _)) {
820-
index.insert(id, mie_item(it));
865+
add_to_index(index, id, mie_item(it));
821866
}
822867
case (ast::item_ty(?id, _, _, _, _)) {
823-
index.insert(id, mie_item(it));
868+
add_to_index(index, id, mie_item(it));
824869
}
825870
case (ast::item_tag(?id, ?variants, _, _, _)) {
826-
index.insert(id, mie_item(it));
871+
add_to_index(index, id, mie_item(it));
827872
let uint variant_idx = 0u;
828873
for (ast::variant v in variants) {
829-
index.insert(v.node.name,
830-
mie_tag_variant(it, variant_idx));
874+
add_to_index(index, v.node.name,
875+
mie_tag_variant(it, variant_idx));
831876
variant_idx += 1u;
832877
}
833878
}
834879
case (ast::item_obj(?id, _, _, _, _)) {
835-
index.insert(id, mie_item(it));
880+
add_to_index(index, id, mie_item(it));
836881
}
837882
}
838883
}
@@ -841,12 +886,12 @@ fn index_mod(&ast::_mod md) -> mod_index {
841886
}
842887

843888
fn index_nmod(&ast::native_mod md) -> nmod_index {
844-
auto index = new_str_hash[native_mod_index_entry]();
889+
auto index = new_str_hash[list[nmod_index_entry]]();
845890

846891
for (@ast::view_item it in md.view_items) {
847892
alt (it.node) {
848893
case(ast::view_item_import(?def_ident,_,_)) {
849-
index.insert(def_ident, nmie_view_item(it));
894+
add_to_index(index, def_ident, nmie_view_item(it));
850895
}
851896
case(ast::view_item_export(_)) {}
852897
}
@@ -855,10 +900,10 @@ fn index_nmod(&ast::native_mod md) -> nmod_index {
855900
for (@ast::native_item it in md.items) {
856901
alt (it.node) {
857902
case (ast::native_item_ty(?id, _)) {
858-
index.insert(id, nmie_item(it));
903+
add_to_index(index, id, nmie_item(it));
859904
}
860905
case (ast::native_item_fn(?id, _, _, _, _, _)) {
861-
index.insert(id, nmie_item(it));
906+
add_to_index(index, id, nmie_item(it));
862907
}
863908
}
864909
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// xfail-boot
2+
// xfail-stage0
3+
4+
type a = rec(int a);
5+
6+
fn a(a a) -> int {
7+
ret a.a;
8+
}
9+
10+
fn main() {
11+
let a x = rec(a=1);
12+
assert(a(x) == 1);
13+
}

0 commit comments

Comments
 (0)