| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 | (* *  This file is part of JavaLib *  Copyright (c)2004-2012 Nicolas Cannasse and Caue Waneck * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *)type jpath = (string list) * stringtype jversion = int * int (* minor + major *)(** unqualified names cannot have the characters '.', ';', '[' or '/' *)type unqualified_name = stringtype jwildcard =  | WExtends (* + *)  | WSuper (* -  *)  | WNonetype jtype_argument =  | TType of jwildcard * jsignature  | TAny (* * *)and jsignature =  | TByte (* B *)  | TChar (* C *)  | TDouble (* D *)  | TFloat (* F *)  | TInt (* I *)  | TLong (* J *)  | TShort (* S *)  | TBool (* Z *)  | TObject of jpath * jtype_argument list (* L Classname *)  | TObjectInner of (string list) * (string * jtype_argument list) list (* L Classname ClassTypeSignatureSuffix *)  | TArray of jsignature * int option (* [ *)  | TMethod of jmethod_signature (* ( *)  | TTypeParameter of string (* T *)(* ( jsignature list ) ReturnDescriptor (| V | jsignature) *)and jmethod_signature = jsignature list * jsignature option(* InvokeDynamic-specific: Method handle *)type reference_type =  | RGetField (* constant must be ConstField *)  | RGetStatic (* constant must be ConstField *)  | RPutField (* constant must be ConstField *)  | RPutStatic (* constant must be ConstField *)  | RInvokeVirtual (* constant must be Method *)  | RInvokeStatic (* constant must be Method *)  | RInvokeSpecial (* constant must be Method *)  | RNewInvokeSpecial (* constant must be Method with name <init> *)  | RInvokeInterface (* constant must be InterfaceMethod *)(* TODO *)type bootstrap_method = inttype jconstant =  (** references a class or an interface - jpath must be encoded as StringUtf8 *)  | ConstClass of jpath (* tag = 7 *)  (** field reference *)  | ConstField of (jpath * unqualified_name * jsignature) (* tag = 9 *)  (** method reference; string can be special "<init>" and "<clinit>" values *)  | ConstMethod of (jpath * unqualified_name * jmethod_signature) (* tag = 10 *)  (** interface method reference *)  | ConstInterfaceMethod of (jpath * unqualified_name * jmethod_signature) (* tag = 11 *)  (** constant values *)  | ConstString of string  (* tag = 8 *)  | ConstInt of int32 (* tag = 3 *)  | ConstFloat of float (* tag = 4 *)  | ConstLong of int64 (* tag = 5 *)  | ConstDouble of float (* tag = 6 *)  (** name and type: used to represent a field or method, without indicating which class it belongs to *)  | ConstNameAndType of unqualified_name * jsignature  (** UTF8 encoded strings. Note that when reading/writing, take into account Utf8 modifications of java *)  (* (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4.7) *)  | ConstUtf8 of string  (** invokeDynamic-specific *)  | ConstMethodHandle of (reference_type * jconstant) (* tag = 15 *)  | ConstMethodType of jmethod_signature (* tag = 16 *)  | ConstInvokeDynamic of (bootstrap_method * unqualified_name * jsignature) (* tag = 18 *)  | ConstUnusabletype jcode = unit (* TODO *)type jaccess_flag =  | JPublic (* 0x0001 *)  | JPrivate (* 0x0002 *)  | JProtected (* 0x0004 *)  | JStatic (* 0x0008 *)  | JFinal (* 0x0010 *)  | JSynchronized (* 0x0020 *)  | JVolatile (* 0x0040 *)  | JTransient (* 0x0080 *)  (** added if created by the compiler *)  | JSynthetic (* 0x1000 *)  | JEnum (* 0x4000 *)  | JUnusable (* should not be present *)  (** class flags *)  | JSuper (* 0x0020 *)  | JInterface (* 0x0200 *)  | JAbstract (* 0x0400 *)  | JAnnotation (* 0x2000 *)  (** method flags *)  | JBridge (* 0x0040 *)  | JVarArgs (* 0x0080 *)  | JNative (* 0x0100 *)  | JStrict (* 0x0800 *)type jaccess = jaccess_flag list(* type parameter name, extends signature, implements signatures *)type jtypes = (string * jsignature option * jsignature list) listtype jannotation = {  ann_type : jsignature;  ann_elements : (string * jannotation_value) list;}and jannotation_value =  | ValConst of jsignature * jconstant (* B, C, D, E, F, I, J, S, Z, s *)  | ValEnum of jsignature * string (* e *)  | ValClass of jsignature (* c *) (* V -> Void *)  | ValAnnotation of jannotation (* @ *)  | ValArray of jannotation_value list (* [ *)type jattribute =  | AttrDeprecated  | AttrVisibleAnnotations of jannotation list  | AttrInvisibleAnnotations of jannotation list  | AttrUnknown of string * stringtype jfield_kind =  | JKField  | JKMethodtype jfield = {  jf_name : string;  jf_kind : jfield_kind;  (* signature, as used by the vm *)  jf_vmsignature : jsignature;  (* actual signature, as used in java code *)  jf_signature : jsignature;  jf_throws : jsignature list;  jf_types : jtypes;  jf_flags : jaccess;  jf_attributes : jattribute list;  jf_constant : jconstant option;  jf_code : jcode option;}type jclass = {  cversion : jversion;  cpath : jpath;  csuper : jsignature;  cflags : jaccess;  cinterfaces : jsignature list;  cfields : jfield list;  cmethods : jfield list;  cattributes : jattribute list;  cinner_types : (jpath * jpath option * string option * jaccess) list;  ctypes : jtypes;}(* reading/writing *)type utf8ref = inttype classref = inttype nametyperef = inttype dynref = inttype bootstrapref = inttype jconstant_raw =  | KClass of utf8ref (* 7 *)  | KFieldRef of (classref * nametyperef) (* 9 *)  | KMethodRef of (classref * nametyperef) (* 10 *)  | KInterfaceMethodRef of (classref * nametyperef) (* 11 *)  | KString of utf8ref (* 8 *)  | KInt of int32 (* 3 *)  | KFloat of float (* 4 *)  | KLong of int64 (* 5 *)  | KDouble of float (* 6 *)  | KNameAndType of (utf8ref * utf8ref) (* 12 *)  | KUtf8String of string (* 1 *)  | KMethodHandle of (reference_type * dynref) (* 15 *)  | KMethodType of utf8ref (* 16 *)  | KInvokeDynamic of (bootstrapref * nametyperef) (* 18 *)  | KUnusable(* jData debugging *)let is_override_attrib = (function    (* TODO: pass anotations as @:meta *)    | AttrVisibleAnnotations ann ->      List.exists (function        | { ann_type = TObject( (["java";"lang"], "Override"), [] ) } ->            true        | _ -> false      ) ann    | _ -> false  )let is_override field =  List.exists is_override_attrib field.jf_attributeslet path_s = function  | (pack,name) -> String.concat "." (pack @ [name])let rec s_sig = function  | TByte (* B *) -> "byte"  | TChar (* C *) -> "char"  | TDouble (* D *) -> "double"  | TFloat (* F *) -> "float"  | TInt (* I *) -> "int"  | TLong (* J *) -> "long"  | TShort (* S *) -> "short"  | TBool (* Z *) -> "bool"  | TObject(path,args) -> path_s  path ^ s_args args  | TObjectInner (sl, sjargl) -> String.concat "." sl ^ "." ^ (String.concat "." (List.map (fun (s,arg) -> s ^ s_args arg) sjargl))  | TArray (s,i) -> s_sig s ^ "[" ^ (match i with | None -> "" | Some i -> string_of_int i) ^ "]"  | TMethod (sigs, sopt) -> (match sopt with | None -> "" | Some s -> s_sig s ^ " ") ^ "(" ^ String.concat ", " (List.map s_sig sigs) ^ ")"  | TTypeParameter s -> sand s_args = function  | [] -> ""  | args -> "<" ^ String.concat ", " (List.map (fun t ->      match t with      | TAny -> "*"      | TType (wc, s) ->        (match wc with          | WNone -> ""          | WExtends -> "+"          | WSuper -> "-") ^        (s_sig s))    args) ^ ">"let s_field f = (if is_override f then "override " else "") ^ s_sig f.jf_signature ^ " " ^ f.jf_namelet s_fields fs = "{ \n\t" ^ String.concat "\n\t" (List.map s_field fs) ^ "\n}"
 |