let build_class_struct_map klass_data (sast_classes : Sast.class_def list) =
    (* Extract the ancestry and variables from a class into a cdef *)
    let klass_to_struct klass_name (aklass : Ast.class_def) =
        let compare (_, n1) (_, n2) = Pervasives.compare n1 n2 in
        let ivars = List.flatten (List.map snd (Klass.klass_to_variables aklass)) in
        let renamed = List.map get_vdef ivars in
        [(klass_name, List.sort compare renamed)] in

    (* Map each individial class to a basic class_struct *)
    let struct_map = StringMap.mapi klass_to_struct klass_data.classes in

    (* Now, assuming we get parents before children, update the maps appropriately *)
    let folder map = function
        | "Object" -> StringMap.add (get_tname "Object") (StringMap.find "Object" struct_map) map
        | aklass ->
            let parent = StringMap.find aklass klass_data.parents in
            let ancestors = StringMap.find (get_tname parent) map in
            let this = StringMap.find aklass struct_map in
            StringMap.add (get_tname aklass) (this @ ancestors) map in

    (* Update the map so that each child has information from parents *)
    let struct_map = List.fold_left folder StringMap.empty (Klass.get_class_names klass_data) in

    (* Reverse the values so that they start from the root *)
    StringMap.map List.rev struct_map