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.
174 lines
5.2 KiB
174 lines
5.2 KiB
(*
|
|
* Copyright (c) 2018-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
|
|
|
|
(** 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 _ ->
|
|
ClangMethodKind.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 ClangMethodKind.CPP_CLASS
|
|
else ClangMethodKind.CPP_INSTANCE
|
|
| ObjCMethodDecl (_, _, method_decl_info) ->
|
|
if method_decl_info.Clang_ast_t.omdi_is_instance_method then ClangMethodKind.OBJC_INSTANCE
|
|
else ClangMethodKind.OBJC_CLASS
|
|
| BlockDecl _ ->
|
|
ClangMethodKind.BLOCK
|
|
| _ ->
|
|
raise CFrontend_config.Invalid_declaration
|
|
|
|
|
|
let rec is_inside_objc_class_method meth_decl =
|
|
let open Clang_ast_t in
|
|
match meth_decl with
|
|
| ObjCMethodDecl _ ->
|
|
ClangMethodKind.equal (get_method_kind meth_decl) ClangMethodKind.OBJC_CLASS
|
|
| BlockDecl (di, _) -> (
|
|
match CAst_utils.get_decl_opt di.di_parent_pointer with
|
|
| Some decl ->
|
|
is_inside_objc_class_method decl
|
|
| None ->
|
|
false )
|
|
| _ ->
|
|
false
|
|
|
|
|
|
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
|
|
|
|
|
|
let is_variadic 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_is_variadic
|
|
| ObjCMethodDecl (_, _, method_decl_info) ->
|
|
method_decl_info.Clang_ast_t.omdi_is_variadic
|
|
| BlockDecl (_, block_decl_info) ->
|
|
block_decl_info.bdi_is_variadic
|
|
| _ ->
|
|
raise CFrontend_config.Invalid_declaration
|
|
|
|
|
|
let get_block_captured_variables method_decl =
|
|
let open Clang_ast_t in
|
|
match method_decl with
|
|
| BlockDecl (_, block_decl_info) ->
|
|
block_decl_info.bdi_captured_variables
|
|
| _ ->
|
|
[]
|