diff --git a/infer/src/clang/cMethod_decl.ml b/infer/src/clang/cMethod_decl.ml index 8fc8f33d4..e261fd7c3 100644 --- a/infer/src/clang/cMethod_decl.ml +++ b/infer/src/clang/cMethod_decl.ml @@ -147,23 +147,27 @@ struct list_iter (process_one_method_decl tenv cg cfg curr_class namespace) decl_list let process_getter_setter context procname = - let class_name = Procname.c_get_class procname in - let open CContext in - let cls = CContext.create_curr_class context.tenv class_name in - let method_name = Procname.c_get_method procname in - match ObjcProperty_decl.method_is_property_accesor cls method_name with - | Some (property_name, property_type, is_getter) when - CMethod_trans.should_create_procdesc context.cfg procname true true -> - (match property_type with qt, atts, decl_info, _, _, ivar_opt -> - let ivar_name = ObjcProperty_decl.get_ivar_name property_name ivar_opt in - let field = CField_decl.build_sil_field_property cls context.tenv ivar_name qt (Some atts) in - ignore (CField_decl.add_missing_fields context.tenv class_name [field]); - let accessor = - if is_getter then - ObjcProperty_decl.make_getter cls property_name property_type - else ObjcProperty_decl.make_setter cls property_name property_type in - list_iter (process_one_method_decl context.tenv context.cg context.cfg cls context.namespace) accessor; - true) - | _ -> false + (*If there is already a spec for the method we want to generate (in incremental analysis) *) + (* we don't need to generate it again. *) + if Specs.summary_exists procname then false + else + let class_name = Procname.c_get_class procname in + let open CContext in + let cls = CContext.create_curr_class context.tenv class_name in + let method_name = Procname.c_get_method procname in + match ObjcProperty_decl.method_is_property_accesor cls method_name with + | Some (property_name, property_type, is_getter) when + CMethod_trans.should_create_procdesc context.cfg procname true true -> + (match property_type with qt, atts, decl_info, _, _, ivar_opt -> + let ivar_name = ObjcProperty_decl.get_ivar_name property_name ivar_opt in + let field = CField_decl.build_sil_field_property cls context.tenv ivar_name qt (Some atts) in + ignore (CField_decl.add_missing_fields context.tenv class_name [field]); + let accessor = + if is_getter then + ObjcProperty_decl.make_getter cls property_name property_type + else ObjcProperty_decl.make_setter cls property_name property_type in + list_iter (process_one_method_decl context.tenv context.cg context.cfg cls context.namespace) accessor; + true) + | _ -> false end