Skip to content

Commit 7a13a61

Browse files
bozgraydon
authored andcommitted
use,import,export parse fixes
* use,import,export must come before all other items. * disallow use,import in "native" declarations.
1 parent b096b0e commit 7a13a61

File tree

1 file changed

+87
-73
lines changed

1 file changed

+87
-73
lines changed

src/boot/fe/item.ml

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

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

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

885864
and parse_mod_items_from_signature
886865
(ps:pstate)
887866
: (Ast.mod_view * Ast.mod_items) =
888-
let exports = Hashtbl.create 0 in
889-
let mis = Hashtbl.create 0 in
890-
expect ps LBRACE;
867+
expect ps LBRACE;
868+
let view = parse_mod_items_header_from_signature ps in
869+
let items = Hashtbl.create 0 in
891870
while not (peek ps = RBRACE)
892871
do
893-
match peek ps with
894-
EXPORT ->
895-
bump ps;
896-
parse_export ps exports;
897-
expect ps SEMI;
898-
| _ ->
899-
let (ident, mti) = ctxt "mod items from sig: mod item"
872+
let (ident,item) = ctxt "mod items from sig: mod item"
900873
parse_mod_item_from_signature ps
901-
in
902-
Hashtbl.add mis ident mti;
874+
in
875+
htab_put items ident item;
903876
done;
904-
if (Hashtbl.length exports) = 0
905-
then Hashtbl.add exports Ast.EXPORT_all_decls ();
906877
expect ps RBRACE;
907-
({empty_view with Ast.view_exports = exports}, mis)
908-
878+
(view,items)
909879

910880
and parse_mod_item_from_signature (ps:pstate)
911881
: (Ast.ident * Ast.mod_item) =
@@ -1023,7 +993,6 @@ and expand_tags_to_stmts
1023993
(Ast.DECL_mod_item (ident, tag_item))))
1024994
id_items
1025995

1026-
1027996
and expand_tags_to_items
1028997
(ps:pstate)
1029998
(item:Ast.mod_item)
@@ -1034,7 +1003,6 @@ and expand_tags_to_items
10341003
(fun (ident, item) -> htab_put items ident item)
10351004
id_items
10361005

1037-
10381006
and note_required_mod
10391007
(ps:pstate)
10401008
(sp:span)
@@ -1114,43 +1082,89 @@ and parse_export
11141082
in
11151083
Hashtbl.add exports e ()
11161084

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

11181152
and parse_mod_items
11191153
(ps:pstate)
11201154
(terminal:token)
11211155
: (Ast.mod_view * Ast.mod_items) =
11221156
ps.pstate_depth <- ps.pstate_depth + 1;
1123-
let imports = Hashtbl.create 0 in
1124-
let exports = Hashtbl.create 0 in
1125-
let items = Hashtbl.create 4 in
1157+
let (view, items) = parse_mod_header ps in
11261158
while (not (peek ps = terminal))
11271159
do
1128-
match peek ps with
1129-
IMPORT ->
1130-
bump ps;
1131-
parse_import ps imports;
1132-
expect ps SEMI;
1133-
| EXPORT ->
1134-
bump ps;
1135-
parse_export ps exports;
1136-
expect ps SEMI;
1137-
| _ ->
1138-
let (ident, item) = parse_mod_item ps in
1139-
htab_put items ident item;
1140-
expand_tags_to_items ps item items;
1160+
parse_item_decl ps items parse_mod_item;
11411161
done;
1142-
if (Hashtbl.length exports) = 0
1143-
then Hashtbl.add exports Ast.EXPORT_all_decls ();
11441162
expect ps terminal;
11451163
ps.pstate_depth <- ps.pstate_depth - 1;
1146-
let view = { Ast.view_imports = imports;
1147-
Ast.view_exports = exports }
1148-
in
1149-
(view, items)
1164+
(view, items)
11501165
;;
11511166

11521167

1153-
11541168
(*
11551169
* Local Variables:
11561170
* fill-column: 78;

0 commit comments

Comments
 (0)