diff --git a/src/jbuild.ml b/src/jbuild.ml index 35aee96f..855b4fc4 100644 --- a/src/jbuild.ml +++ b/src/jbuild.ml @@ -37,21 +37,36 @@ let module_name = let module_names = list module_name >>| String.Set.of_list -let invalid_lib_name ~loc = of_sexp_errorf loc "invalid library name" +module Lib_name : sig + type t -let library_name = - plain_string (fun ~loc name -> + val to_string : t -> string + + val of_string : loc:Loc.t -> string -> t + + val t : t Sexp.Of_sexp.t +end = struct + type t = string + + let invalid ~loc = of_sexp_errorf loc "invalid library name" + + let to_string s = s + + let of_string ~loc name = match name with - | "" -> invalid_lib_name ~loc + | "" -> invalid ~loc | s -> - if s.[0] = '.' then invalid_lib_name ~loc + if s.[0] = '.' then invalid ~loc else try String.iter s ~f:(function | 'A'..'Z' | 'a'..'z' | '_' | '.' | '0'..'9' -> () | _ -> raise_notrace Exit); s - with Exit -> invalid_lib_name ~loc) + with Exit -> invalid ~loc + + let t = plain_string of_string +end let file = plain_string (fun ~loc s -> @@ -868,7 +883,7 @@ module Library = struct record (let%map buildable = Buildable.t and loc = loc - and name = field_o "name" library_name + and name = field_o "name" Lib_name.t and public = Public_lib.public_name_field and synopsis = field_o "synopsis" string and install_c_headers = @@ -900,9 +915,9 @@ module Library = struct let name = match name, public with | Some n, _ -> n - | None, Some { name = (_loc, name) ; _ } -> + | None, Some { name = (loc, name) ; _ } -> if dune_version >= (1, 1) then - name + Lib_name.of_string ~loc name else of_sexp_error loc "name field cannot be omitted before version \ 1.1 of the dune language" @@ -914,7 +929,7 @@ module Library = struct "name field is missing" ) in - { name + { name = Lib_name.to_string name ; public ; synopsis ; install_c_headers diff --git a/test/blackbox-tests/test-cases/no-name-field/run.t b/test/blackbox-tests/test-cases/no-name-field/run.t index 8723a7c6..aecbd8de 100644 --- a/test/blackbox-tests/test-cases/no-name-field/run.t +++ b/test/blackbox-tests/test-cases/no-name-field/run.t @@ -4,7 +4,7 @@ the name field can be omitted for libraries when public_name is present this isn't possible for older syntax <= (1, 0) $ dune build --root no-name-lib-syntax-1-0 - File "dune", line 1, characters 0-27: + File "dune", line 1, characters 22-25: Error: name field cannot be omitted before version 1.1 of the dune language [1]