@@ -774,7 +774,6 @@ and parse_type_item
774
774
let item = Ast. MOD_ITEM_type (effect, ty) in
775
775
(ident, span ps apos bpos (decl params item))
776
776
777
-
778
777
and parse_mod_item (ps :pstate ) : (Ast.ident * Ast.mod_item) =
779
778
let apos = lexpos ps in
780
779
let parse_lib_name ident =
@@ -848,64 +847,35 @@ and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
848
847
note_required_mod ps {lo= apos; hi= bpos} conv rlib item;
849
848
(ident, item)
850
849
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
882
850
| _ -> raise (unexpected ps)
883
851
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}
884
863
885
864
and parse_mod_items_from_signature
886
865
(ps :pstate )
887
866
: (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
891
870
while not (peek ps = RBRACE )
892
871
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"
900
873
parse_mod_item_from_signature ps
901
- in
902
- Hashtbl. add mis ident mti ;
874
+ in
875
+ htab_put items ident item ;
903
876
done ;
904
- if (Hashtbl. length exports) = 0
905
- then Hashtbl. add exports Ast. EXPORT_all_decls () ;
906
877
expect ps RBRACE ;
907
- ({empty_view with Ast. view_exports = exports}, mis)
908
-
878
+ (view,items)
909
879
910
880
and parse_mod_item_from_signature (ps :pstate )
911
881
: (Ast.ident * Ast.mod_item) =
@@ -1023,7 +993,6 @@ and expand_tags_to_stmts
1023
993
(Ast. DECL_mod_item (ident, tag_item))))
1024
994
id_items
1025
995
1026
-
1027
996
and expand_tags_to_items
1028
997
(ps :pstate )
1029
998
(item :Ast.mod_item )
@@ -1034,7 +1003,6 @@ and expand_tags_to_items
1034
1003
(fun (ident , item ) -> htab_put items ident item)
1035
1004
id_items
1036
1005
1037
-
1038
1006
and note_required_mod
1039
1007
(ps :pstate )
1040
1008
(sp :span )
@@ -1114,43 +1082,89 @@ and parse_export
1114
1082
in
1115
1083
Hashtbl. add exports e ()
1116
1084
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)
1117
1151
1118
1152
and parse_mod_items
1119
1153
(ps :pstate )
1120
1154
(terminal :token )
1121
1155
: (Ast.mod_view * Ast.mod_items) =
1122
1156
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
1126
1158
while (not (peek ps = terminal))
1127
1159
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;
1141
1161
done ;
1142
- if (Hashtbl. length exports) = 0
1143
- then Hashtbl. add exports Ast. EXPORT_all_decls () ;
1144
1162
expect ps terminal;
1145
1163
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)
1150
1165
;;
1151
1166
1152
1167
1153
-
1154
1168
(*
1155
1169
* Local Variables:
1156
1170
* fill-column: 78;
0 commit comments