let ast_to_sast_klass klass_data (ast_klass : Ast.class_def) =
let s : Ast.class_sections_def = ast_klass.sections in
let rec update_env env sect (klass : Ast.class_def) =
let env = add_ivars klass env sect in
match klass.klass with
| "Object" -> env
| _ -> let parent = Klass.klass_to_parent klass in
let pclass = StringMap.find parent klass_data.classes in
update_env env Protects pclass in
let env = update_env empty_environment Privates ast_klass in
let mems = List.map (fun m -> ast_mem_to_sast_mem klass_data m env) in
let funs = List.map (fun f -> ast_func_to_sast_func klass_data f env false) in
let sections : Sast.class_sections_def =
{ publics = mems s.publics;
protects = mems s.protects;
privates = mems s.privates;
refines = funs s.refines;
mains = funs (List.map check_main s.mains) } in
let sast_klass : Sast.class_def =
{ klass = ast_klass.klass;
parent = ast_klass.parent;
sections = sections } in
if init_calls_super sast_klass then sast_klass
else raise(Failure(Format.sprintf "%s's inits don't always call super as their first statement (maybe empty body, maybe something else)." sast_klass.klass))