Skip to content

Commit f8c9fad

Browse files
committed
Added dependency parsing with better errors and cleaner interface
Signed-off-by: Ambre Austen Suhamy <[email protected]>
1 parent 4c333fc commit f8c9fad

File tree

5 files changed

+39
-37
lines changed

5 files changed

+39
-37
lines changed

src/dune_lang/package_dependency.ml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,34 @@ type t =
55
; constraint_ : Package_constraint.t option
66
}
77

8+
module Well_formed_name = struct
9+
module T = struct
10+
include Package_name.Opam_compatible
11+
12+
let module_ = "Package.Dependency.Name"
13+
let description = "package dependency"
14+
let description_of_valid_string = Some description_of_valid_string
15+
16+
let better_hint s =
17+
match String.lsplit2 s ~on:'.' with
18+
| None -> make_valid s
19+
| Some (before, after) ->
20+
if Option.is_some (of_string_opt before) && not (String.is_empty after)
21+
then sprintf "(%s (= %s))" before after
22+
else make_valid s
23+
;;
24+
25+
let hint_valid = Some better_hint
26+
end
27+
28+
module TT = Dune_util.Stringlike.Make (T)
29+
30+
let decode =
31+
let open Dune_sexp.Decoder in
32+
TT.decode >>| T.to_package_name
33+
;;
34+
end
35+
836
let encode { name; constraint_ } =
937
let open Dune_sexp.Encoder in
1038
match constraint_ with
@@ -20,7 +48,7 @@ let decode =
2048
{ name; constraint_ = Some expr }
2149
in
2250
enter constrained
23-
<|> let+ name = Package_name.decode in
51+
<|> let+ name = Well_formed_name.decode in
2452
{ name; constraint_ = None }
2553
;;
2654

src/dune_lang/package_name.ml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,11 @@ module Opam_compatible = struct
4949

5050
let of_string_opt s = Option.some_if (is_valid_string s) s
5151

52-
let escape s =
52+
let make_valid s =
5353
let replaced = String.map s ~f:(fun c -> if is_valid_char c then c else '_') in
5454
if is_valid_string replaced then replaced else "p" ^ replaced
5555
;;
5656

57-
let make_valid s =
58-
match index_opt s '.' with
59-
| None -> escape s
60-
| Some i ->
61-
let before = sub s ~pos:0 ~len:i in
62-
let s_len = length s in
63-
if is_valid_string before && s_len > i + 1
64-
then (
65-
let after = sub s ~pos:(i + 1) ~len:(s_len - i - 1) in
66-
Printf.sprintf "(%s (= %s))" before after)
67-
else escape s
68-
;;
69-
7057
let hint_valid = Some make_valid
7158
end
7259

src/dune_rules/package.ml

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -421,19 +421,6 @@ let decode_name ~version =
421421
if version >= (3, 11) then Name.decode_opam_compatible else Name.decode
422422
;;
423423

424-
let decode_dep ~version =
425-
let open Dune_lang.Decoder in
426-
let open Dune_lang.Package_dependency in
427-
let constrained =
428-
let+ name = decode_name ~version
429-
and+ expr = Dune_lang.Package_constraint.decode in
430-
{ name; constraint_ = Some expr }
431-
in
432-
enter constrained
433-
<|> let+ name = decode_name ~version in
434-
{ name; constraint_ = None }
435-
;;
436-
437424
let decode =
438425
let open Dune_lang.Decoder in
439426
let name_map syntax of_list_map to_string name decode print_value error_msg =
@@ -458,9 +445,9 @@ let decode =
458445
field_o
459446
"version"
460447
(Dune_lang.Syntax.since Stanza.syntax (2, 5) >>> Package_version.decode)
461-
and+ depends = field ~default:[] "depends" (repeat (decode_dep ~version))
462-
and+ conflicts = field ~default:[] "conflicts" (repeat (decode_dep ~version))
463-
and+ depopts = field ~default:[] "depopts" (repeat (decode_dep ~version))
448+
and+ depends = field ~default:[] "depends" (repeat Dependency.decode)
449+
and+ conflicts = field ~default:[] "conflicts" (repeat Dependency.decode)
450+
and+ depopts = field ~default:[] "depopts" (repeat Dependency.decode)
464451
and+ info = Info.decode ~since:(2, 0) ()
465452
and+ tags = field "tags" (enter (repeat string)) ~default:[]
466453
and+ deprecated_package_names =

test/blackbox-tests/test-cases/invalid-package-version.t

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ Building doesn't work as the dependency is invalid.
1616
File "dune-project", line 5, characters 10-19:
1717
5 | (depends foo.1.2.3))
1818
^^^^^^^^^
19-
Error: "foo.1.2.3" is an invalid opam package name.
19+
Error: "foo.1.2.3" is an invalid package dependency.
2020
Package names can contain letters, numbers, '-', '_' and '+', and need to
2121
contain at least a letter.
22-
Hint: (foo (= 1.2.3)) would be a correct opam package name
22+
Hint: (foo (= 1.2.3)) would be a correct package dependency
2323
[1]
2424

2525
We can take this further and add some really invalid characters into the name:
@@ -37,8 +37,8 @@ We can take this further and add some really invalid characters into the name:
3737
File "dune-project", line 5, characters 10-15:
3838
5 | (depends f{oo."1.2.3"))
3939
^^^^^
40-
Error: "f{oo." is an invalid opam package name.
40+
Error: "f{oo." is an invalid package dependency.
4141
Package names can contain letters, numbers, '-', '_' and '+', and need to
4242
contain at least a letter.
43-
Hint: f_oo_ would be a correct opam package name
43+
Hint: f_oo_ would be a correct package dependency
4444
[1]

test/blackbox-tests/test-cases/pkg/invalid-version.t

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ In this case we could also hint at the correct syntax for dune-project files.
2525
File "dune-project", line 4, characters 10-19:
2626
4 | (depends foo.1.2.3))
2727
^^^^^^^^^
28-
Error: "foo.1.2.3" is an invalid opam package name.
28+
Error: "foo.1.2.3" is an invalid package dependency.
2929
Package names can contain letters, numbers, '-', '_' and '+', and need to
3030
contain at least a letter.
31-
Hint: (foo (= 1.2.3)) would be a correct opam package name
31+
Hint: (foo (= 1.2.3)) would be a correct package dependency
3232
[1]

0 commit comments

Comments
 (0)