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