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.

78 lines
2.4 KiB

(*
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
(** Define the signature of a method consisting of its name, its arguments, return type, location
and whether its an instance method. *)
module F = Format
type param_type = {name: Mangled.t; typ: Typ.t; is_pointer_to_const: bool; annot: Annot.Item.t}
let mk_param_type ?(is_pointer_to_const = false) ?(annot = Annot.Item.empty) name typ =
{name; typ; is_pointer_to_const; annot}
type t =
{ name: Typ.Procname.t
; access: Clang_ast_t.access_specifier
; class_param: param_type option
; params: param_type list
; ret_type: Typ.t * Annot.Item.t
; has_added_return_param: bool
; attributes: Clang_ast_t.attribute list
; loc: Clang_ast_t.source_range
; method_kind: ClangMethodKind.t
; is_cpp_virtual: bool
; is_cpp_nothrow: bool
; is_variadic: bool
; pointer_to_parent: Clang_ast_t.pointer option
; pointer_to_property_opt: Clang_ast_t.pointer option
; (* If set then method is a getter/setter *)
return_param_typ: Typ.t option }
(* A method is a getter if it has a link to a property and *)
(* it has 0 arguments *)
let is_getter {pointer_to_property_opt; params} =
Option.is_some pointer_to_property_opt && Int.equal (List.length params) 0
(* A method is a setter if it has a link to a property and *)
(* it has 1 argument *)
let is_setter {pointer_to_property_opt; params} =
Option.is_some pointer_to_property_opt && Int.equal (List.length params) 1
let mk name class_param params ret_type ?(has_added_return_param = false) attributes loc
method_kind ?(is_cpp_virtual = false) ?(is_cpp_nothrow = false) ?(is_variadic = false)
pointer_to_parent pointer_to_property_opt return_param_typ access =
{ name
; access
; class_param
; params
; ret_type
; has_added_return_param
; attributes
; loc
; method_kind
; is_cpp_virtual
; is_cpp_nothrow
; is_variadic
; pointer_to_parent
; pointer_to_property_opt
; return_param_typ }
let pp fmt ms =
let pp_param fmt {name; typ} = F.fprintf fmt "%a, %a" Mangled.pp name (Typ.pp Pp.text) typ in
Format.fprintf fmt "Method %a [%a]->%a %a"
(Pp.to_string ~f:Typ.Procname.to_string)
ms.name (Pp.comma_seq pp_param) ms.params (Typ.pp Pp.text) (fst ms.ret_type)
(Pp.to_string ~f:Clang_ast_j.string_of_source_range)
ms.loc