You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.7 KiB

(*
* Copyright (c) 2009-2013, Monoidics ltd.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
open Javalib_pack
let translate_basic_type = function
| `Bool ->
Typ.boolean
| `Byte ->
Typ.java_byte
| `Char ->
Typ.char
| `Double ->
Typ.double
| `Float ->
Typ.float
| `Int ->
Typ.int
| `Long ->
Typ.long
| `Short ->
Typ.java_short
let rec translate_value_type = function
| JBasics.TBasic basic ->
translate_basic_type basic
| JBasics.TObject obj ->
translate_object_type obj
and translate_object_type = function
| JBasics.TClass cn ->
Typ.mk_struct (Typ.Name.Java.from_string (JBasics.cn_name cn))
| JBasics.TArray vt ->
Typ.mk_array (translate_value_type vt)
let rec translate_value_exn = function
| JBasics.EVCstString s ->
Annot.Str s
| JBasics.EVCstBoolean 0 ->
Annot.Bool false
| JBasics.EVCstBoolean 1 ->
Annot.Bool true
| JBasics.EVEnum (cn, value) ->
Annot.Enum {class_typ= Typ.mk_struct (Typ.Name.Java.from_string (JBasics.cn_name cn)); value}
| JBasics.EVArray values ->
Annot.Array (List.map values ~f:translate_value |> List.filter_opt)
| JBasics.EVClass (Some typ) ->
Annot.Class (translate_value_type typ)
| JBasics.EVClass _ ->
Annot.Class Typ.void
| JBasics.EVAnnotation ann ->
Annot.Annot (translate ann)
| _ ->
raise (Invalid_argument "Annotation value not supported")
and translate_value element_value =
match translate_value_exn element_value with
| value ->
Some value
| exception Invalid_argument _ ->
None
(** Translate an annotation. *)
and translate a : Annot.t =
let class_name = JBasics.cn_name a.JBasics.kind in
let translate_value_pair acc (x, value) =
match translate_value value with
| Some translated ->
Annot.{name= Some x; value= translated} :: acc
| _ ->
acc
in
let parameters =
List.fold ~f:translate_value_pair ~init:[] a.JBasics.element_value_pairs |> List.rev
in
{Annot.class_name; parameters}
(** Translate an item annotation. *)
let translate_item avlist : Annot.Item.t =
let trans_vis = function Javalib.RTVisible -> true | Javalib.RTInvisible -> false in
let trans (a, v) = (translate a, trans_vis v) in
List.map ~f:trans avlist
(** Translate a method annotation. *)
let translate_method ann : Annot.Method.t =
let global_ann = ann.Javalib.ma_global in
let param_ann = ann.Javalib.ma_parameters in
let return = translate_item global_ann in
let params = List.map ~f:translate_item param_ann in
{return; params}