@@ -775,7 +775,6 @@ and parse_type_item
775
775
let item = Ast. MOD_ITEM_type (effect, ty) in
776
776
(ident, span ps apos bpos (decl params item))
777
777
778
-
779
778
and parse_mod_item (ps :pstate ) : (Ast.ident * Ast.mod_item) =
780
779
let apos = lexpos ps in
781
780
let parse_lib_name ident =
@@ -849,72 +848,35 @@ and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
849
848
note_required_mod ps {lo= apos; hi= bpos} conv rlib item;
850
849
(ident, item)
851
850
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
-
886
851
| _ -> raise (unexpected ps)
887
852
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}
888
864
889
865
and parse_mod_items_from_signature
890
866
(ps :pstate )
891
867
: (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
896
871
while not (peek ps = RBRACE )
897
872
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;
912
877
done ;
913
- if (Hashtbl. length exports) = 0
914
- then Hashtbl. add exports Ast. EXPORT_all_decls () ;
915
878
expect ps RBRACE ;
916
- ({empty_view with Ast. view_exports = exports}, mis)
917
-
879
+ (view,items)
918
880
919
881
and parse_mod_item_from_signature (ps :pstate )
920
882
: (Ast.ident * Ast.mod_item) =
@@ -1032,7 +994,6 @@ and expand_tags_to_stmts
1032
994
(Ast. DECL_mod_item (ident, tag_item))))
1033
995
id_items
1034
996
1035
-
1036
997
and expand_tags_to_items
1037
998
(ps :pstate )
1038
999
(item :Ast.mod_item )
@@ -1043,7 +1004,6 @@ and expand_tags_to_items
1043
1004
(fun (ident , item ) -> htab_put items ident item)
1044
1005
id_items
1045
1006
1046
-
1047
1007
and note_required_mod
1048
1008
(ps :pstate )
1049
1009
(sp :span )
@@ -1123,48 +1083,89 @@ and parse_export
1123
1083
in
1124
1084
Hashtbl. add exports e ()
1125
1085
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)
1126
1152
1127
1153
and parse_mod_items
1128
1154
(ps :pstate )
1129
1155
(terminal :token )
1130
1156
: (Ast.mod_view * Ast.mod_items) =
1131
1157
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
1136
1159
while (not (peek ps = terminal))
1137
1160
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;
1155
1162
done ;
1156
- if (Hashtbl. length exports) = 0
1157
- then Hashtbl. add exports Ast. EXPORT_all_decls () ;
1158
1163
expect ps terminal;
1159
1164
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)
1164
1166
;;
1165
1167
1166
1168
1167
-
1168
1169
(*
1169
1170
* Local Variables:
1170
1171
* fill-column: 78;
0 commit comments