[clang] Add template instantiation info into Procname.t

Reviewed By: jberdine

Differential Revision: D4634826

fbshipit-source-id: 3fdfb80
master
Andrzej Kotulski 8 years ago committed by Facebook Github Bot
parent 95a8ca2d3e
commit 925d73efce

@ -24,7 +24,8 @@ let create_procname name =
let create_objc_class_method class_name method_name = let create_objc_class_method class_name method_name =
let method_kind = Typ.Procname.ObjCClassMethod in let method_kind = Typ.Procname.ObjCClassMethod in
let tname = Typename.Objc.from_string class_name in let tname = Typename.Objc.from_string class_name in
let pname = Typ.Procname.ObjC_Cpp (Typ.Procname.objc_cpp tname method_name method_kind) in let pname = Typ.Procname.ObjC_Cpp
(Typ.Procname.objc_cpp tname method_name method_kind Typ.NoTemplate) in
register pname; register pname;
pname pname

@ -319,7 +319,7 @@ let module Procname = {
[@@deriving compare]; [@@deriving compare];
/** Type of c procedure names. */ /** Type of c procedure names. */
type c = (string, option string) [@@deriving compare]; type c = (string, option string, template_spec_info) [@@deriving compare];
type objc_cpp_method_kind = type objc_cpp_method_kind =
| CPPMethod (option string) /** with mangling */ | CPPMethod (option string) /** with mangling */
| CPPConstructor (option string, bool) /** with mangling + is it constexpr? */ | CPPConstructor (option string, bool) /** with mangling + is it constexpr? */
@ -329,7 +329,12 @@ let module Procname = {
[@@deriving compare]; [@@deriving compare];
/** Type of Objective C and C++ procedure names: method signatures. */ /** Type of Objective C and C++ procedure names: method signatures. */
type objc_cpp = {method_name: string, class_name: Typename.t, kind: objc_cpp_method_kind} type objc_cpp = {
method_name: string,
class_name: Typename.t,
kind: objc_cpp_method_kind,
template_args: template_spec_info
}
[@@deriving compare]; [@@deriving compare];
/** Type of Objective C block names. */ /** Type of Objective C block names. */
@ -398,8 +403,12 @@ let module Procname = {
| None => (None, package_classname) | None => (None, package_classname)
}; };
let split_typename typename => split_classname (Typename.name typename); let split_typename typename => split_classname (Typename.name typename);
let from_string_c_fun (s: string) => C (s, None); let from_string_c_fun (s: string) => C (s, None, NoTemplate);
let c (plain: string) (mangled: string) => (plain, Some mangled); let c (plain: string) (mangled: string) (template_args: template_spec_info) => (
plain,
Some mangled,
template_args
);
let java class_name return_type method_name parameters kind => { let java class_name return_type method_name parameters kind => {
class_name, class_name,
return_type, return_type,
@ -409,9 +418,14 @@ let module Procname = {
}; };
/** Create an objc procedure name from a class_name and method_name. */ /** Create an objc procedure name from a class_name and method_name. */
let objc_cpp class_name method_name kind => {class_name, method_name, kind}; let objc_cpp class_name method_name kind template_args => {
class_name,
method_name,
kind,
template_args
};
let get_default_objc_class_method objc_class => { let get_default_objc_class_method objc_class => {
let objc_cpp = objc_cpp objc_class "__find_class_" ObjCInternalMethod; let objc_cpp = objc_cpp objc_class "__find_class_" ObjCInternalMethod NoTemplate;
ObjC_Cpp objc_cpp ObjC_Cpp objc_cpp
}; };
@ -473,7 +487,7 @@ let module Procname = {
let get_method = let get_method =
fun fun
| ObjC_Cpp name => name.method_name | ObjC_Cpp name => name.method_name
| C (name, _) => name | C (name, _, _) => name
| Block name => name | Block name => name
| Java j => j.method_name | Java j => j.method_name
| Linters_dummy_method => "Linters_dummy_method"; | Linters_dummy_method => "Linters_dummy_method";
@ -676,7 +690,7 @@ let module Procname = {
}; };
let get_global_name_of_initializer = let get_global_name_of_initializer =
fun fun
| C (name, _) when String.is_prefix prefix::Config.clang_initializer_prefix name => { | C (name, _, _) when String.is_prefix prefix::Config.clang_initializer_prefix name => {
let prefix_len = String.length Config.clang_initializer_prefix; let prefix_len = String.length Config.clang_initializer_prefix;
Some (String.sub name pos::prefix_len len::(String.length name - prefix_len)) Some (String.sub name pos::prefix_len len::(String.length name - prefix_len))
} }
@ -729,7 +743,7 @@ let module Procname = {
let to_unique_id pn => let to_unique_id pn =>
switch pn { switch pn {
| Java j => java_to_string j Verbose | Java j => java_to_string j Verbose
| C (c1, c2) => to_readable_string (c1, c2) true | C (c1, c2, _) => to_readable_string (c1, c2) true
| ObjC_Cpp osig => c_method_to_string osig Verbose | ObjC_Cpp osig => c_method_to_string osig Verbose
| Block name => name | Block name => name
| Linters_dummy_method => "Linters_dummy_method" | Linters_dummy_method => "Linters_dummy_method"
@ -739,7 +753,7 @@ let module Procname = {
let to_string p => let to_string p =>
switch p { switch p {
| Java j => java_to_string j Non_verbose | Java j => java_to_string j Non_verbose
| C (c1, c2) => to_readable_string (c1, c2) false | C (c1, c2, _) => to_readable_string (c1, c2) false
| ObjC_Cpp osig => c_method_to_string osig Non_verbose | ObjC_Cpp osig => c_method_to_string osig Non_verbose
| Block name => name | Block name => name
| Linters_dummy_method => to_unique_id p | Linters_dummy_method => to_unique_id p
@ -749,7 +763,7 @@ let module Procname = {
let to_simplified_string withclass::withclass=false p => let to_simplified_string withclass::withclass=false p =>
switch p { switch p {
| Java j => java_to_string withclass::withclass j Simple | Java j => java_to_string withclass::withclass j Simple
| C (c1, c2) => to_readable_string (c1, c2) false ^ "()" | C (c1, c2, _) => to_readable_string (c1, c2) false ^ "()"
| ObjC_Cpp osig => c_method_to_string osig Simple | ObjC_Cpp osig => c_method_to_string osig Simple
| Block _ => "block" | Block _ => "block"
| Linters_dummy_method => to_unique_id p | Linters_dummy_method => to_unique_id p
@ -782,7 +796,7 @@ let module Procname = {
let pp_set fmt set => Set.iter (fun pname => F.fprintf fmt "%a " pp pname) set; let pp_set fmt set => Set.iter (fun pname => F.fprintf fmt "%a " pp pname) set;
let get_qualifiers pname => let get_qualifiers pname =>
switch pname { switch pname {
| C c => fst c |> QualifiedCppName.qualifiers_of_qual_name | C c => fst3 c |> QualifiedCppName.qualifiers_of_qual_name
| ObjC_Cpp objc_cpp => | ObjC_Cpp objc_cpp =>
List.append List.append
(QualifiedCppName.qualifiers_of_qual_name (Typename.name objc_cpp.class_name)) (QualifiedCppName.qualifiers_of_qual_name (Typename.name objc_cpp.class_name))

@ -204,7 +204,7 @@ let module Procname: {
let module Set: Caml.Set.S with type elt = t; let module Set: Caml.Set.S with type elt = t;
/** Create a C procedure name from plain and mangled name. */ /** Create a C procedure name from plain and mangled name. */
let c: string => string => c; let c: string => string => template_spec_info => c;
/** Empty block name. */ /** Empty block name. */
let empty_block: t; let empty_block: t;
@ -259,7 +259,7 @@ let module Procname: {
let mangled_objc_block: string => t; let mangled_objc_block: string => t;
/** Create an objc procedure name from a class_name and method_name. */ /** Create an objc procedure name from a class_name and method_name. */
let objc_cpp: Typename.t => string => objc_cpp_method_kind => objc_cpp; let objc_cpp: Typename.t => string => objc_cpp_method_kind => template_spec_info => objc_cpp;
let get_default_objc_class_method: Typename.t => t; let get_default_objc_class_method: Typename.t => t;
/** Get the class name of a Objective-C/C++ procedure name. */ /** Get the class name of a Objective-C/C++ procedure name. */

@ -275,7 +275,7 @@ let objc_method_to_procname objc_method =
let method_kind = Typ.Procname.objc_method_kind_of_bool (not objc_method.is_static) in let method_kind = Typ.Procname.objc_method_kind_of_bool (not objc_method.is_static) in
let typename = Typename.Objc.from_string objc_method.classname in let typename = Typename.Objc.from_string objc_method.classname in
Typ.Procname.ObjC_Cpp Typ.Procname.ObjC_Cpp
(Typ.Procname.objc_cpp typename objc_method.method_name method_kind) (Typ.Procname.objc_cpp typename objc_method.method_name method_kind Typ.NoTemplate)
let taint_spec_to_taint_info taint_spec = let taint_spec_to_taint_info taint_spec =
let taint_source = let taint_source =

@ -49,7 +49,7 @@ let mk_c_function translation_unit_context name function_decl_info_opt =
if String.is_empty file && String.is_empty mangled_name then if String.is_empty file && String.is_empty mangled_name then
Typ.Procname.from_string_c_fun name Typ.Procname.from_string_c_fun name
else else
Typ.Procname.C (Typ.Procname.c name mangled) Typ.Procname.C (Typ.Procname.c name mangled Typ.NoTemplate)
let mk_cpp_method class_name method_name ?meth_decl mangled = let mk_cpp_method class_name method_name ?meth_decl mangled =
let method_kind = match meth_decl with let method_kind = match meth_decl with
@ -58,11 +58,11 @@ let mk_cpp_method class_name method_name ?meth_decl mangled =
| _ -> | _ ->
Typ.Procname.CPPMethod mangled in Typ.Procname.CPPMethod mangled in
Typ.Procname.ObjC_Cpp Typ.Procname.ObjC_Cpp
(Typ.Procname.objc_cpp class_name method_name method_kind) (Typ.Procname.objc_cpp class_name method_name method_kind Typ.NoTemplate)
let mk_objc_method class_typename method_name method_kind = let mk_objc_method class_typename method_name method_kind =
Typ.Procname.ObjC_Cpp Typ.Procname.ObjC_Cpp
(Typ.Procname.objc_cpp class_typename method_name method_kind) (Typ.Procname.objc_cpp class_typename method_name method_kind Typ.NoTemplate)
let block_procname_with_index defining_proc i = let block_procname_with_index defining_proc i =
Config.anonymous_block_prefix ^ Config.anonymous_block_prefix ^

Loading…
Cancel
Save