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
135 lines
4.2 KiB
7 years ago
|
(*
|
||
|
* 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
|