mirror of
https://github.com/CatalaLang/catala.git
synced 2024-11-08 07:51:43 +03:00
catala depends fixes
- automatically include the directories of listed files - work for files that don't define modules
This commit is contained in:
parent
21a429bfcf
commit
99004ab1d9
@ -26,14 +26,19 @@ let modname_of_file f =
|
||||
(* Fixme: make this more robust *)
|
||||
String.capitalize_ascii Filename.(basename (remove_extension f))
|
||||
|
||||
let load_module_interfaces options includes program =
|
||||
let load_module_interfaces
|
||||
options
|
||||
includes
|
||||
?(more_includes = [])
|
||||
?(allow_notmodules = false)
|
||||
program =
|
||||
(* Recurse into program modules, looking up files in [using] and loading
|
||||
them *)
|
||||
if program.Surface.Ast.program_used_modules <> [] then
|
||||
Message.emit_debug "Loading module interfaces...";
|
||||
let includes =
|
||||
includes
|
||||
|> List.map (fun d -> File.Tree.build (options.Cli.path_rewrite d))
|
||||
List.map options.Cli.path_rewrite includes @ more_includes
|
||||
|> List.map File.Tree.build
|
||||
|> List.fold_left File.Tree.union File.Tree.empty
|
||||
in
|
||||
let err_req_pos chain =
|
||||
@ -80,7 +85,13 @@ let load_module_interfaces options includes program =
|
||||
(err_req_pos (Mark.get use.Surface.Ast.mod_use_name :: req_chain))
|
||||
"Circular module dependency"
|
||||
| None ->
|
||||
let intf = Surface.Parser_driver.load_interface (Cli.FileName f) in
|
||||
let default_module_name =
|
||||
if allow_notmodules then Some (modname_of_file f) else None
|
||||
in
|
||||
let intf =
|
||||
Surface.Parser_driver.load_interface ?default_module_name
|
||||
(Cli.FileName f)
|
||||
in
|
||||
let modname = ModuleName.fresh intf.intf_modname in
|
||||
let seen = File.Map.add f None seen in
|
||||
let seen, sub_use_map =
|
||||
@ -990,8 +1001,9 @@ module Commands = struct
|
||||
$ Cli.Flags.check_invariants)
|
||||
|
||||
let depends options includes prefix extension extra_files =
|
||||
let file = Cli.input_src_file options.Cli.input_src in
|
||||
let more_includes = List.map Filename.dirname (file :: extra_files) in
|
||||
let prg =
|
||||
let file = Cli.input_src_file options.Cli.input_src in
|
||||
Surface.Ast.
|
||||
{
|
||||
program_module_name = None;
|
||||
@ -1009,7 +1021,10 @@ module Commands = struct
|
||||
program_lang = Cli.file_lang file;
|
||||
}
|
||||
in
|
||||
let mod_uses, modules = load_module_interfaces options includes prg in
|
||||
let mod_uses, modules =
|
||||
load_module_interfaces options includes ~more_includes
|
||||
~allow_notmodules:true prg
|
||||
in
|
||||
let d_ctx =
|
||||
Desugared.Name_resolution.form_context (prg, mod_uses) modules
|
||||
in
|
||||
|
@ -412,13 +412,14 @@ let check_modname program source_file =
|
||||
File.((dirname file / mname) ^ Filename.extension file)
|
||||
| _ -> ()
|
||||
|
||||
let load_interface source_file =
|
||||
let load_interface ?default_module_name source_file =
|
||||
let program = with_sedlex_source source_file parse_source in
|
||||
check_modname program source_file;
|
||||
let modname =
|
||||
match program.Ast.program_module_name with
|
||||
| Some mname -> mname
|
||||
| None ->
|
||||
match program.Ast.program_module_name, default_module_name with
|
||||
| Some mname, _ -> mname
|
||||
| None, Some n -> n, Pos.from_info (Cli.input_src_file source_file) 0 0 0 0
|
||||
| None, None ->
|
||||
Message.raise_error
|
||||
"%a doesn't define a module name. It should contain a '@{<cyan>> \
|
||||
Module %s@}' directive."
|
||||
|
@ -24,7 +24,8 @@ val lines :
|
||||
(** Raw file parser that doesn't interpret any includes and returns the flat law
|
||||
structure as is *)
|
||||
|
||||
val load_interface : Cli.input_src -> Ast.interface
|
||||
val load_interface :
|
||||
?default_module_name:string -> Cli.input_src -> Ast.interface
|
||||
(** Reads only declarations in metadata in the supplied input file, and only
|
||||
keeps type information. The list of submodules is initialised with names
|
||||
only and empty contents. *)
|
||||
|
Loading…
Reference in New Issue
Block a user