···81818282(* Given a Loc.point and the result of [parse_comment], this function returns
8383 a valid Lexing.position *)
8484-let position_of_point :
8585- t ->
8686- Loc.point ->
8787- Lexing.position =
8484+let position_of_point : t -> Loc.point -> Lexing.position =
8885 fun v point ->
8989- let { reversed_newlines; original_pos; _} = v in
8686+ let { reversed_newlines; original_pos; _ } = v in
9087 let line_in_comment = point.Loc.line - original_pos.pos_lnum + 1 in
9188 let rec find_pos_bol reversed_newlines_prefix =
9289 match reversed_newlines_prefix with
9390 | [] -> assert false
9491 | [ _ ] -> original_pos.pos_bol
9592 | (line_number, line_start_offset) :: prefix ->
9696- if line_number > line_in_comment then find_pos_bol prefix
9797- else line_start_offset + original_pos.pos_cnum
9393+ if line_number > line_in_comment then find_pos_bol prefix
9494+ else line_start_offset + original_pos.pos_cnum
9895 in
9996 let pos_bol = find_pos_bol reversed_newlines in
10097 let pos_lnum = point.Loc.line in
10198 let pos_cnum = point.column + pos_bol in
10299 let pos_fname = original_pos.pos_fname in
103103- { Lexing.pos_bol; pos_lnum; pos_cnum; pos_fname}
100100+ { Lexing.pos_bol; pos_lnum; pos_cnum; pos_fname }
104101105102(* The main entry point for this module *)
106103let parse_comment ~location ~text =
···121118122119(* Accessor functions, as [t] is opaque *)
123120let warnings t = t.warnings
124124-let ast t = t.ast
125121122122+let ast t = t.ast
+1-3
src/parser/odoc_parser.mli
···1717 in the 4th column (e.g. [{... pos_bol=0; pos_cnum=3 }]) *)
18181919module Ast = Ast
2020-2120module Loc = Loc
22212322(** Warnings produced during parsing. *)
···3433 printed. *)
3534end
36353737-3836val warnings : t -> Warning.t list
3937(** Extract any warnings from the parser result. *)
4038···4543(** Helper function to turn the internal representation of positions back into
4644 the usual representation in the Lexing module. Note that this relies on
4745 the information passed in {!parse_comment}, and hence requires the result
4848- of that call in addition to the {!Loc.point} being converted. *)4646+ of that call in addition to the {!Loc.point} being converted. *)
+73-53
src/parser/test/test.ml
···8181 let tag at : Ast.tag -> sexp = function
8282 | `Author s -> List [ Atom "@author"; Atom s ]
8383 | `Deprecated es ->
8484- List (Atom "@deprecated" :: List.map (at.at (nestable_block_element at)) es)
8484+ List
8585+ (Atom "@deprecated" :: List.map (at.at (nestable_block_element at)) es)
8586 | `Param (s, es) ->
8687 List
8787- ([ Atom "@param"; Atom s ] @ List.map (at.at (nestable_block_element at)) es)
8888+ ([ Atom "@param"; Atom s ]
8989+ @ List.map (at.at (nestable_block_element at)) es)
8890 | `Raise (s, es) ->
8991 List
9090- ([ Atom "@raise"; Atom s ] @ List.map (at.at (nestable_block_element at)) es)
9292+ ([ Atom "@raise"; Atom s ]
9393+ @ List.map (at.at (nestable_block_element at)) es)
9194 | `Return es ->
9295 List (Atom "@return" :: List.map (at.at (nestable_block_element at)) es)
9396 | `See (kind, s, es) ->
···103106 | `Since s -> List [ Atom "@since"; Atom s ]
104107 | `Before (s, es) ->
105108 List
106106- ([ Atom "@before"; Atom s ] @ List.map (at.at (nestable_block_element at)) es)
109109+ ([ Atom "@before"; Atom s ]
110110+ @ List.map (at.at (nestable_block_element at)) es)
107111 | `Version s -> List [ Atom "@version"; Atom s ]
108112 | `Canonical p -> List [ Atom "@canonical"; at.at str p ]
109113 | `Inline -> Atom "@inline"
···115119 | `Heading (level, label, es) ->
116120 let label = List [ Atom "label"; opt str label ] in
117121 let level = string_of_int level in
118118- List [ Atom level; label; List (List.map (at.at (inline_element at)) es) ]
122122+ List
123123+ [ Atom level; label; List (List.map (at.at (inline_element at)) es) ]
119124 | `Tag t -> tag at t
120125121121- let docs at : Ast.t -> sexp = fun f -> List (List.map (at.at (block_element at)) f)
126126+ let docs at : Ast.t -> sexp =
127127+ fun f -> List (List.map (at.at (block_element at)) f)
122128end
123129124130let error err = Atom (Odoc_parser.Warning.to_string err)
···131137 List [ List [ Atom "output"; value ]; List [ Atom "warnings"; warnings ] ]
132138 in
133139 Sexplib0.Sexp.pp_hum formatter output;
134134- Format.pp_print_flush formatter ()
135135-136136- let test ?(location = { Loc.line = 1; column = 0 }) str =
140140+ Format.pp_print_flush formatter ()
141141+142142+let test ?(location = { Loc.line = 1; column = 0 }) str =
137143 let dummy_filename = "f.ml" in
138144 let location =
139145 {
···50915097 "{!indexlist}"
50925098 (Ok []); *)
5093509950945094- let lexing_pos_to_sexp : Lexing.position -> sexp = fun v ->
50955095- List [
50965096- List [Atom "pos_fname"; Atom v.pos_fname];
50975097- List [Atom "pos_bol"; Atom (string_of_int v.pos_bol)];
50985098- List [Atom "pos_lnum"; Atom (string_of_int v.pos_lnum)];
50995099- List [Atom "pos_cnum"; Atom (string_of_int v.pos_cnum)];
51005100+ let lexing_pos_to_sexp : Lexing.position -> sexp =
51015101+ fun v ->
51025102+ List
51035103+ [
51045104+ List [ Atom "pos_fname"; Atom v.pos_fname ];
51055105+ List [ Atom "pos_bol"; Atom (string_of_int v.pos_bol) ];
51065106+ List [ Atom "pos_lnum"; Atom (string_of_int v.pos_lnum) ];
51075107+ List [ Atom "pos_cnum"; Atom (string_of_int v.pos_cnum) ];
51085108+ ]
51095109+51105110+ let parser_output formatter pv =
51115111+ let ast, warnings = Odoc_parser.(ast pv, warnings pv) in
51125112+ let at conv v =
51135113+ let { Loc.start; end_; _ } = Loc.location v in
51145114+ let v' = Loc.value v |> conv in
51155115+ let start' =
51165116+ Odoc_parser.position_of_point pv start |> lexing_pos_to_sexp
51175117+ in
51185118+ let start'' = Location_to_sexp.point start in
51195119+ let end' =
51205120+ Odoc_parser.position_of_point pv end_ |> lexing_pos_to_sexp
51215121+ in
51225122+ let end'' = Location_to_sexp.point end_ in
51235123+ List
51245124+ [
51255125+ List [ Atom "start"; start' ];
51265126+ List [ Atom "start_loc"; start'' ];
51275127+ List [ Atom "end"; end' ];
51285128+ List [ Atom "end_loc"; end'' ];
51295129+ List [ Atom "value"; v' ];
51005130 ]
51015101-51025102- let parser_output formatter pv =
51035103- let ast, warnings = Odoc_parser.(ast pv, warnings pv) in
51045104- let at conv v =
51055105- let { Loc.start; end_; _ } = Loc.location v in
51065106- let v' = Loc.value v |> conv in
51075107- let start' = Odoc_parser.position_of_point pv start |> lexing_pos_to_sexp in
51085108- let start'' = Location_to_sexp.point start in
51095109- let end' = Odoc_parser.position_of_point pv end_ |> lexing_pos_to_sexp in
51105110- let end'' = Location_to_sexp.point end_ in
51115111- List [
51125112- List [Atom "start"; start'];
51135113- List [Atom "start_loc"; start''];
51145114- List [Atom "end"; end'];
51155115- List [Atom "end_loc"; end''];
51165116- List [Atom "value"; v']
51175117- ]
51185118- in
51195119- let sexp = Ast_to_sexp.(docs { at = at} ast) in
51205120- let warnings = List (List.map error warnings) in
51215121- let output =
51225122- List [ List [ Atom "output"; sexp ]; List [ Atom "warnings"; warnings ] ]
51235123- in
51245124- Sexplib0.Sexp.pp_hum formatter output;
51255125- Format.pp_print_flush formatter ()
51265126-51275127-51285128-51295129- let test ?(location = Lexing.{pos_bol=0; pos_cnum=0; pos_lnum=1; pos_fname="none"}) text =
51315131+ in
51325132+ let sexp = Ast_to_sexp.(docs { at } ast) in
51335133+ let warnings = List (List.map error warnings) in
51345134+ let output =
51355135+ List
51365136+ [ List [ Atom "output"; sexp ]; List [ Atom "warnings"; warnings ] ]
51375137+ in
51385138+ Sexplib0.Sexp.pp_hum formatter output;
51395139+ Format.pp_print_flush formatter ()
51405140+51415141+ let test
51425142+ ?(location =
51435143+ Lexing.{ pos_bol = 0; pos_cnum = 0; pos_lnum = 1; pos_fname = "none" })
51445144+ text =
51305145 let ast = Odoc_parser.parse_comment ~location ~text in
51315146 Format.printf "%a" parser_output ast
5132514751335148 let non_offset_location =
51345149 test "one\n two\n three";
51355135- [%expect{|
51505150+ [%expect
51515151+ {|
51365152 ((output
51375153 (((start ((pos_fname none) (pos_bol 0) (pos_lnum 1) (pos_cnum 0)))
51385154 (start_loc (1 0))
···51605176 (start_loc (3 2))
51615177 (end ((pos_fname none) (pos_bol 9) (pos_lnum 3) (pos_cnum 16)))
51625178 (end_loc (3 7)) (value (word three)))))))))
51635163- (warnings ())) |} ]
51795179+ (warnings ())) |}]
5164518051655165- let offset_location =
51665166- test ~location:Lexing.{pos_bol=10; pos_cnum=20; pos_lnum=2; pos_fname="none"} "one\n two\n three";
51675167- [%expect{|
51815181+ let offset_location =
51825182+ test
51835183+ ~location:
51845184+ Lexing.
51855185+ { pos_bol = 10; pos_cnum = 20; pos_lnum = 2; pos_fname = "none" }
51865186+ "one\n two\n three";
51875187+ [%expect
51885188+ {|
51685189 ((output
51695190 (((start ((pos_fname none) (pos_bol 10) (pos_lnum 2) (pos_cnum 20)))
51705191 (start_loc (2 10))
···51925213 (start_loc (4 2))
51935214 (end ((pos_fname none) (pos_bol 29) (pos_lnum 4) (pos_cnum 36)))
51945215 (end_loc (4 7)) (value (word three)))))))))
51955195- (warnings ())) |} ]
51965196-51975197- end in
51985198- ()
52165216+ (warnings ())) |}]
52175217+ end in
52185218+ ()
+1-2
src/parser/warning.ml
···1313 in
1414 Printf.sprintf "File \"%s\", %s:\n%s" location.file location_string message
15151616-let pp fmt v =
1717- Format.fprintf fmt "%s" (to_string v)
1616+let pp fmt v = Format.fprintf fmt "%s" (to_string v)
18171918let kasprintf k fmt =
2019 Format.(kfprintf (fun _ -> k (flush_str_formatter ())) str_formatter fmt)