(** Time-stamp: <modified the 18/12/2007 (at 11:10) by Erwan Jahier> *)

(*----------------------------------------------------------------------
	module : Compile
	date :
------------------------------------------------------------------------
DESCRIPTION :

	Le top du compilateur

	_ init_appli : initialisation de l'appli (links 
	dynamiques enre les modules caml, n�cessaires
	� cause des d�pendences cycliques)

	- test_check : test du check statique du packbody

	- compile : compilation standard

----------------------------------------------------------------------*)

open Lxm
open Errors
open SyntaxTree
(*---------------------------------------------------------------------
init_appli
---------------------------------------------------------------------*)
(* let init_appli () = ( *)
	(* CheckExp.call_check_node_key := CheckNode.check_node_key *)
(* ) *)

let rec first_pack_in = (
  function
    | (NSPack pi)::_ -> pi.it.pa_name
    | _::tail -> first_pack_in tail
    | [] -> raise (Global_error "No package has been provided")
)

let doit (srclist : SyntaxTree.pack_or_model list) (mnode : Ident.idref) = (
  (* init de la table source *)
  let srctab = SyntaxTab.create srclist in

    SyntaxTab.dump srctab;

    (* le pack par d�faut est le premier de la liste ... *)
    Ident.set_dft_pack_name (first_pack_in srclist);

    (* la cl�e "absolue" du main node (pas d'args statiques) *)
    let mnode_key = CompileData.make_simple_node_key (Ident.long_of_idref mnode) in

      Verbose.put "-- MAIN NODE: \"%s\"\n" (CompileData.string_of_node_key mnode_key);

      (* Pour chaque package, on a un solveur de r�f�rences
	 globales, pour les types, const et oper :
	 - les r�f�rences point�es (p::n) sont recherch�es
	 directement dans la srctab puisqu'il n'y a pas 
	 d'ambiguit�
	 - les r�f�rences simple sont recherch�es :
         . dans le pack lui-m�me
         . dans un des packs d�clar�s "uses", avec
         priorit� dans l'ordre
      *)
      let lzcomp = LazyCompiler.create srctab in
(*       let res = LazyCompiler.do_node lzcomp mnode_key in *)
	LazyCompiler.test_types lzcomp ; (* XXX : a virer *)
	() 
)