Add structs.
[wrappi.git] / generator-lib / wrappi_accumulator.ml
index 1254979..237bb0b 100644 (file)
@@ -26,12 +26,12 @@ open Printf
 let check_not_defined name new_ map thing get_loc =
   try
     let old = StringMap.find name map in
-    eprintf "generator: %s %s redefined\n" thing name;
+    eprintf "generator: error: %s %s redefined\n" thing name;
     let old_loc = get_loc old in
     let new_loc = get_loc new_ in
-    eprintf "  first definition at %s:%d\n"
+    eprintf "  first definition at %s line %d\n"
       (Loc.file_name old_loc) (Loc.start_line old_loc);
-    eprintf "  second definition at %s:%d\n"
+    eprintf "  second definition at %s line %d\n"
       (Loc.file_name new_loc) (Loc.start_line new_loc);
     exit 1
   with
@@ -86,15 +86,23 @@ let rec resolve_typedefs thing name loc = function
   | TNullable t -> TNullable (resolve_typedefs thing name loc t)
 
   | TTypedef tname ->
-    try (StringMap.find tname !tds).td_type
+    try
+      let td = StringMap.find tname !tds in
+      let t = td.td_type in
+      (* The typedef may be a typedef, so we need to recursively
+       * resolve the type.
+       *)
+      resolve_typedefs "typedef" td.td_name td.td_loc t
     with Not_found ->
-      eprintf "generator: could not resolve typedef %s\n" tname;
-      eprintf "  in definition of %s %s at %s:%d\n"
+      eprintf "generator: error: could not resolve typedef %s to a basic type\n"
+        tname;
+      eprintf "  in definition of %s %s at %s line %d\n"
         thing name (Loc.file_name loc) (Loc.start_line loc);
       exit 1
 
 let resolve_typedefs_in_ret thing name loc = function
-  | RErr as t -> t
+  | (RVoid
+        | RStaticString) as t -> t
   | Return t -> Return (resolve_typedefs thing name loc t)
 
 let get_api () =
@@ -109,7 +117,11 @@ let get_api () =
     fun sd ->
       let fields = sd.sd_fields in
       let fields =
-        Array.map (resolve_typedefs "enum" sd.sd_name sd.sd_loc) fields in
+        Array.map (
+          fun (name, t) ->
+            let t = resolve_typedefs "enum" sd.sd_name sd.sd_loc t in
+            (name, t)
+        ) fields in
       { sd with sd_fields = fields }
   ) sds in
 
@@ -117,7 +129,11 @@ let get_api () =
     fun un ->
       let fields = un.un_fields in
       let fields =
-        Array.map (resolve_typedefs "union" un.un_name un.un_loc) fields in
+        Array.map (
+          fun (name, t) ->
+            let t = resolve_typedefs "union" un.un_name un.un_loc t in
+            (name, t)
+        ) fields in
       { un with un_fields = fields }
   ) uns in