Skip to content

Commit c218d06

Browse files
committed
Merge branch 'contrib'
2 parents 0b675a0 + e714402 commit c218d06

File tree

4 files changed

+108
-87
lines changed

4 files changed

+108
-87
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*.toc
2525
*.tp
2626
*.vr
27+
*.swp
2728
.hg/
2829
.hgignore
2930
lexer.ml

AUTHORS.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Graydon Hoare <[email protected]>
44

55
Other authors:
66

7+
Adam Bozanich <[email protected]>
78
Andreas Gal <[email protected]>
89
Brendan Eich <[email protected]>
910
Chris Double <[email protected]>

src/boot/fe/item.ml

Lines changed: 88 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,6 @@ and parse_type_item
775775
let item = Ast.MOD_ITEM_type (effect, ty) in
776776
(ident, span ps apos bpos (decl params item))
777777

778-
779778
and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
780779
let apos = lexpos ps in
781780
let parse_lib_name ident =
@@ -849,72 +848,35 @@ and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
849848
note_required_mod ps {lo=apos; hi=bpos} conv rlib item;
850849
(ident, item)
851850
end
852-
853-
| USE ->
854-
begin
855-
bump ps;
856-
let ident = ctxt "use mod: ident" Pexp.parse_ident ps in
857-
let meta =
858-
ctxt "use mod: meta" parse_optional_meta_pat ps ident
859-
in
860-
let bpos = lexpos ps in
861-
let id = (span ps apos bpos ()).id in
862-
let (path, items) =
863-
ps.pstate_get_mod meta id ps.pstate_node_id ps.pstate_opaque_id
864-
in
865-
let bpos = lexpos ps in
866-
expect ps SEMI;
867-
let rlib =
868-
REQUIRED_LIB_rust { required_libname = path;
869-
required_prefix = ps.pstate_depth }
870-
in
871-
iflog ps
872-
begin
873-
fun _ ->
874-
log ps "extracted mod from %s (binding to %s)"
875-
path ident;
876-
log ps "%a" Ast.sprintf_mod_items items;
877-
end;
878-
let item = decl [||] (Ast.MOD_ITEM_mod (empty_view, items)) in
879-
let item = span ps apos bpos item in
880-
note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item;
881-
(ident, item)
882-
end
883-
884-
885-
886851
| _ -> raise (unexpected ps)
887852

853+
and parse_mod_items_header_from_signature (ps:pstate) : Ast.mod_view =
854+
let exports = Hashtbl.create 0 in
855+
while (peek ps = EXPORT)
856+
do
857+
bump ps;
858+
parse_export ps exports;
859+
expect ps SEMI;
860+
done;
861+
if (Hashtbl.length exports) = 0
862+
then htab_put exports Ast.EXPORT_all_decls ();
863+
{empty_view with Ast.view_exports = exports}
888864

889865
and parse_mod_items_from_signature
890866
(ps:pstate)
891867
: (Ast.mod_view * Ast.mod_items) =
892-
let exports = Hashtbl.create 0 in
893-
let mis = Hashtbl.create 0 in
894-
let in_view = ref true in
895-
expect ps LBRACE;
868+
expect ps LBRACE;
869+
let view = parse_mod_items_header_from_signature ps in
870+
let items = Hashtbl.create 0 in
896871
while not (peek ps = RBRACE)
897872
do
898-
if !in_view
899-
then
900-
match peek ps with
901-
EXPORT ->
902-
bump ps;
903-
parse_export ps exports;
904-
expect ps SEMI;
905-
| _ ->
906-
in_view := false
907-
else
908-
let (ident, mti) = ctxt "mod items from sig: mod item"
909-
parse_mod_item_from_signature ps
910-
in
911-
Hashtbl.add mis ident mti;
873+
let (ident,item) = ctxt "mod items from sig: mod item"
874+
parse_mod_item_from_signature ps
875+
in
876+
htab_put items ident item;
912877
done;
913-
if (Hashtbl.length exports) = 0
914-
then Hashtbl.add exports Ast.EXPORT_all_decls ();
915878
expect ps RBRACE;
916-
({empty_view with Ast.view_exports = exports}, mis)
917-
879+
(view,items)
918880

919881
and parse_mod_item_from_signature (ps:pstate)
920882
: (Ast.ident * Ast.mod_item) =
@@ -1032,7 +994,6 @@ and expand_tags_to_stmts
1032994
(Ast.DECL_mod_item (ident, tag_item))))
1033995
id_items
1034996

1035-
1036997
and expand_tags_to_items
1037998
(ps:pstate)
1038999
(item:Ast.mod_item)
@@ -1043,7 +1004,6 @@ and expand_tags_to_items
10431004
(fun (ident, item) -> htab_put items ident item)
10441005
id_items
10451006

1046-
10471007
and note_required_mod
10481008
(ps:pstate)
10491009
(sp:span)
@@ -1123,48 +1083,89 @@ and parse_export
11231083
in
11241084
Hashtbl.add exports e ()
11251085

1086+
and parse_use
1087+
(ps:pstate)
1088+
: (Ast.ident * Ast.mod_item) =
1089+
bump ps;
1090+
let ident = ctxt "use mod: ident" Pexp.parse_ident ps in
1091+
let meta =
1092+
ctxt "use mod: meta" parse_optional_meta_pat ps ident
1093+
in
1094+
let apos = lexpos ps in
1095+
let bpos = lexpos ps in
1096+
let id = (span ps apos bpos ()).id in
1097+
let (path, items) =
1098+
ps.pstate_get_mod meta id ps.pstate_node_id ps.pstate_opaque_id
1099+
in
1100+
let bpos = lexpos ps in
1101+
expect ps SEMI;
1102+
let rlib =
1103+
REQUIRED_LIB_rust { required_libname = path;
1104+
required_prefix = ps.pstate_depth }
1105+
in
1106+
iflog ps
1107+
begin
1108+
fun _ ->
1109+
log ps "extracted mod from %s (binding to %s)"
1110+
path ident;
1111+
log ps "%a" Ast.sprintf_mod_items items;
1112+
end;
1113+
let item = decl [||] (Ast.MOD_ITEM_mod (empty_view, items)) in
1114+
let item = span ps apos bpos item in
1115+
note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item;
1116+
(ident, item)
1117+
1118+
and parse_item_decl ps items fn =
1119+
let (ident, item) = fn ps in
1120+
htab_put items ident item;
1121+
expand_tags_to_items ps item items
1122+
1123+
and parse_mod_header (ps:pstate)
1124+
: (Ast.mod_view * Ast.mod_items) =
1125+
let imports = Hashtbl.create 0 in
1126+
let exports = Hashtbl.create 0 in
1127+
let items = Hashtbl.create 4 in
1128+
let rec loop () =
1129+
match peek ps with
1130+
IMPORT ->
1131+
bump ps;
1132+
parse_import ps imports;
1133+
expect ps SEMI;
1134+
loop ()
1135+
| EXPORT ->
1136+
bump ps;
1137+
parse_export ps exports;
1138+
expect ps SEMI;
1139+
loop ()
1140+
| USE ->
1141+
parse_item_decl ps items parse_use;
1142+
loop ()
1143+
| _ -> ()
1144+
in
1145+
loop ();
1146+
if (Hashtbl.length exports) = 0
1147+
then Hashtbl.add exports Ast.EXPORT_all_decls ();
1148+
let view = { Ast.view_imports = imports;
1149+
Ast.view_exports = exports }
1150+
in
1151+
(view, items)
11261152

11271153
and parse_mod_items
11281154
(ps:pstate)
11291155
(terminal:token)
11301156
: (Ast.mod_view * Ast.mod_items) =
11311157
ps.pstate_depth <- ps.pstate_depth + 1;
1132-
let imports = Hashtbl.create 0 in
1133-
let exports = Hashtbl.create 0 in
1134-
let in_view = ref true in
1135-
let items = Hashtbl.create 4 in
1158+
let (view, items) = parse_mod_header ps in
11361159
while (not (peek ps = terminal))
11371160
do
1138-
if !in_view
1139-
then
1140-
match peek ps with
1141-
IMPORT ->
1142-
bump ps;
1143-
parse_import ps imports;
1144-
expect ps SEMI;
1145-
| EXPORT ->
1146-
bump ps;
1147-
parse_export ps exports;
1148-
expect ps SEMI;
1149-
| _ ->
1150-
in_view := false
1151-
else
1152-
let (ident, item) = parse_mod_item ps in
1153-
htab_put items ident item;
1154-
expand_tags_to_items ps item items;
1161+
parse_item_decl ps items parse_mod_item;
11551162
done;
1156-
if (Hashtbl.length exports) = 0
1157-
then Hashtbl.add exports Ast.EXPORT_all_decls ();
11581163
expect ps terminal;
11591164
ps.pstate_depth <- ps.pstate_depth - 1;
1160-
let view = { Ast.view_imports = imports;
1161-
Ast.view_exports = exports }
1162-
in
1163-
(view, items)
1165+
(view, items)
11641166
;;
11651167

11661168

1167-
11681169
(*
11691170
* Local Variables:
11701171
* fill-column: 78;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
mod foo {
3+
export x;
4+
use std (ver="0.0.1");
5+
fn x() -> int { ret 1; }
6+
}
7+
8+
mod bar {
9+
use std (ver="0.0.1");
10+
export y;
11+
fn y() -> int { ret 1; }
12+
}
13+
14+
fn main() {
15+
foo.x();
16+
bar.y();
17+
}
18+

0 commit comments

Comments
 (0)