Explorar o código

[java] added support for fields and methods

Caue Waneck %!s(int64=13) %!d(string=hai) anos
pai
achega
e75cfe1c05
Modificáronse 1 ficheiros con 97 adicións e 1 borrados
  1. 97 1
      genjava.ml

+ 97 - 1
genjava.ml

@@ -1873,6 +1873,10 @@ let generate con =
 
 
 open JData
 open JData
 
 
+exception ConversionError of string * pos
+
+let error s p = raise (ConversionError (s, p))
+
 let mk_type_path path params =
 let mk_type_path path params =
   CTPath {
   CTPath {
     tpackage = fst path;
     tpackage = fst path;
@@ -1916,6 +1920,13 @@ and convert_signature p jsig =
   | TMethod _ -> JReader.error "TMethod cannot be converted directly into Complex Type"
   | TMethod _ -> JReader.error "TMethod cannot be converted directly into Complex Type"
   | TTypeParameter s -> mk_type_path ([], s) []
   | TTypeParameter s -> mk_type_path ([], s) []
 
 
+let convert_constant p const =
+  Option.map_default (function
+    | ConstString s -> Some (EConst (String s), p)
+    | ConstInt i -> Some (EConst (Int (Printf.sprintf "%ld" i)), p)
+    | ConstFloat f | ConstDouble f -> Some (EConst (Float (Printf.sprintf "%E" f)), p)
+    | _ -> None) None const
+
 let convert_param p param =
 let convert_param p param =
   let name, constraints = match param with
   let name, constraints = match param with
     | (name, Some extends_sig, implem_sig) ->
     | (name, Some extends_sig, implem_sig) ->
@@ -1949,6 +1960,91 @@ let convert_java_enum p pe =
     d_data = !data;
     d_data = !data;
   }
   }
 
 
+let convert_java_field p jc field =
+  let cff_doc = None in
+  let cff_pos = p in
+  let cff_meta = ref [] in
+  let cff_access = ref [] in
+  let cff_name = match field.jf_name with
+    | "<init>" -> "new"
+    | "<clinit>" -> cff_access := [AStatic]; "__init__"
+    | name -> name
+  in
+
+  List.iter (function
+    | JPublic -> cff_access := APublic :: !cff_access
+    | JPrivate -> raise Exit (* private instances aren't useful on externs *)
+    | JProtected -> cff_access := APrivate :: !cff_access
+    | JStatic -> cff_access := AStatic :: !cff_access
+    | JFinal -> cff_meta := (":final", [], p) :: !cff_meta
+    | JSynchronized -> cff_meta := (":synchronized", [], p) :: !cff_meta
+    | JVolatile -> cff_meta := (":volatile", [], p) :: !cff_meta
+    | JTransient -> cff_meta := (":transient", [], p) :: !cff_meta
+    | JVarArgs -> cff_meta := (":varArgs", [], p) :: !cff_meta
+    | _ -> ()
+  ) field.jf_flags;
+
+  List.iter (function
+    | AttrDeprecated -> cff_meta := (":deprecated", [], p) :: !cff_meta
+    (* TODO: pass anotations as @:meta *)
+    | AttrVisibleAnnotations ann ->
+      List.iter (function 
+        | { ann_type = TObject( (["java";"lang"], "Override"), [] ) } ->
+          print_endline "Override FOUND!";
+          cff_access := AOverride :: !cff_access
+        | _ -> ()
+      ) ann
+    | _ -> ()
+  ) field.jf_attributes;
+
+  let kind = match field.jf_kind with
+    | JKField -> 
+      FVar (Some (convert_signature p field.jf_signature), convert_constant p field.jf_constant)
+    | JKMethod ->
+      match field.jf_signature with
+      | TMethod (args, ret) ->
+        let i = ref 0 in
+        let args = List.map (fun s ->
+          incr i;
+          "param" ^ string_of_int !i, false, Some(convert_signature p s), None
+        ) args in
+        let t = Option.map_default (convert_signature p) (mk_type_path ([], "Void") []) ret in
+        cff_meta := (":overload", [], p) :: !cff_meta;
+
+        let types = List.map (function
+          | (name, Some ext, impl) ->
+            {
+              tp_name = name;
+              tp_params = [];
+              tp_constraints = List.map (convert_signature p) (ext :: impl);
+            }
+          | (name, None, impl) ->
+            {
+              tp_name = name;
+              tp_params = [];
+              tp_constraints = List.map (convert_signature p) (impl);
+            }
+        ) field.jf_types in
+        
+        FFun ({
+          f_params = types;
+          f_args = args;
+          f_type = Some t;
+          f_expr = None
+        })
+      | _ -> error "Method signature was expected" p
+  in
+
+  {
+    cff_name = cff_name;
+    cff_doc = cff_doc;
+    cff_pos = cff_pos;
+    cff_meta = !cff_meta;
+    cff_access = !cff_access;
+    cff_kind = kind
+  }
+
+
 let convert_java_class p jc =
 let convert_java_class p jc =
   match List.mem JEnum jc.cflags with
   match List.mem JEnum jc.cflags with
   | true -> (* is enum *)
   | true -> (* is enum *)
@@ -1983,7 +2079,7 @@ let convert_java_class p jc =
       d_params = List.map (convert_param p) jc.ctypes;
       d_params = List.map (convert_param p) jc.ctypes;
       d_meta = !meta;
       d_meta = !meta;
       d_flags = !flags;
       d_flags = !flags;
-      d_data = [];
+      d_data = List.map (convert_java_field p jc) jc.cfields @ List.map (convert_java_field p jc) jc.cmethods;
     }
     }