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
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}
|