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.

135 lines
4.2 KiB

(*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
open! IStd
(** Functions for extracting properties of functions or method declarations *)
let get_method_kind meth_decl =
let open Clang_ast_t in
match meth_decl with
| FunctionDecl _ ->
ProcAttributes.C_FUNCTION
| CXXMethodDecl (_, _, _, _, method_decl_info)
| CXXConstructorDecl (_, _, _, _, method_decl_info)
| CXXConversionDecl (_, _, _, _, method_decl_info)
| CXXDestructorDecl (_, _, _, _, method_decl_info) ->
if method_decl_info.Clang_ast_t.xmdi_is_static then ProcAttributes.CPP_CLASS
else ProcAttributes.CPP_INSTANCE
| ObjCMethodDecl (_, _, method_decl_info) ->
if method_decl_info.Clang_ast_t.omdi_is_instance_method then ProcAttributes.OBJC_INSTANCE
else ProcAttributes.OBJC_CLASS
| BlockDecl _ ->
ProcAttributes.BLOCK
| _ ->
raise CFrontend_config.Invalid_declaration
let get_return_type method_decl =
let open Clang_ast_t in
match method_decl with
| FunctionDecl (_, _, qt, _)
| CXXMethodDecl (_, _, qt, _, _)
| CXXConstructorDecl (_, _, qt, _, _)
| CXXConversionDecl (_, _, qt, _, _)
| CXXDestructorDecl (_, _, qt, _, _) ->
CType.return_type_of_function_type qt
| ObjCMethodDecl (_, _, omdi) ->
omdi.omdi_result_type
| _ ->
raise CFrontend_config.Invalid_declaration
let get_param_decls method_decl =
let open Clang_ast_t in
match method_decl with
| FunctionDecl (_, _, _, function_decl_info)
| CXXMethodDecl (_, _, _, function_decl_info, _)
| CXXConstructorDecl (_, _, _, function_decl_info, _)
| CXXConversionDecl (_, _, _, function_decl_info, _)
| CXXDestructorDecl (_, _, _, function_decl_info, _) ->
function_decl_info.fdi_parameters
| ObjCMethodDecl (_, _, method_decl_info) ->
method_decl_info.omdi_parameters
| BlockDecl (_, block_decl_info) ->
block_decl_info.bdi_parameters
| _ ->
raise CFrontend_config.Invalid_declaration
let get_method_body method_decl =
let open Clang_ast_t in
match method_decl with
| FunctionDecl (_, _, _, function_decl_info)
| CXXMethodDecl (_, _, _, function_decl_info, _)
| CXXConstructorDecl (_, _, _, function_decl_info, _)
| CXXConversionDecl (_, _, _, function_decl_info, _)
| CXXDestructorDecl (_, _, _, function_decl_info, _) ->
function_decl_info.fdi_body
| ObjCMethodDecl (_, _, method_decl_info) ->
method_decl_info.omdi_body
| BlockDecl (_, block_decl_info) ->
block_decl_info.bdi_body
| _ ->
raise CFrontend_config.Invalid_declaration
let is_cpp_virtual method_decl =
let open Clang_ast_t in
match method_decl with
| CXXMethodDecl (_, _, _, _, mdi)
| CXXConstructorDecl (_, _, _, _, mdi)
| CXXConversionDecl (_, _, _, _, mdi)
| CXXDestructorDecl (_, _, _, _, mdi) ->
mdi.xmdi_is_virtual
| _ ->
false
let is_cpp_nothrow method_decl =
let open Clang_ast_t in
match method_decl with
| FunctionDecl (_, _, _, fdi)
| CXXMethodDecl (_, _, _, fdi, _)
| CXXConstructorDecl (_, _, _, fdi, _)
| CXXConversionDecl (_, _, _, fdi, _)
| CXXDestructorDecl (_, _, _, fdi, _) ->
fdi.fdi_is_no_throw
| _ ->
false
let get_init_list_instrs method_decl =
let open Clang_ast_t in
match method_decl with
| CXXMethodDecl (_, _, _, _, mdi)
| CXXConstructorDecl (_, _, _, _, mdi)
| CXXConversionDecl (_, _, _, _, mdi)
| CXXDestructorDecl (_, _, _, _, mdi) ->
let create_custom_instr construct_instr = `CXXConstructorInit construct_instr in
List.map ~f:create_custom_instr mdi.xmdi_cxx_ctor_initializers
| _ ->
[]
let get_pointer_to_property method_decl =
let open Clang_ast_t in
match method_decl with
| ObjCMethodDecl (_, _, mdi) -> (
match mdi.Clang_ast_t.omdi_property_decl with
| Some decl_ref ->
Some decl_ref.Clang_ast_t.dr_decl_pointer
| None ->
None )
| _ ->
None
let is_objc_method method_decl =
match method_decl with Clang_ast_t.ObjCMethodDecl _ -> true | _ -> false