let get_stmt_annots config v s =
let do_annot a ((b_acc, (a_acc, e_acc)) as acc) =
let ca = Annotations.get_code_annotation a in
match ca.annot_content with
| AInvariant (b_list, loop_inv, inv) ->
if loop_inv then acc
else if Wp_parameters.Invariants.get() then
add_stmt_invariant_annot config v s ca b_list inv acc
else begin
Wp_parameters.warning
"ignored 'invariant' (use -wp-invariants option) : %a"
!Ast_printer.d_code_annotation ca;
acc
end
| AAssert (b_list,p) ->
let kf = config.kf in
let acc = match is_annot_for_config config v s b_list with
| TBRno -> acc
| TBRhyp ->
let b_acc =
WpStrategy.add_prop_assert b_acc WpStrategy.Ahyp kf s ca p
in (b_acc, (a_acc, e_acc))
| TBRok | TBRpart ->
let id = WpPropId.mk_assert_id config.kf s ca in
let kind = WpStrategy.Aboth (goal_to_select config id) in
let b_acc = WpStrategy.add_prop_assert b_acc kind kf s ca p in
(b_acc, (a_acc, e_acc))
in acc
| AAssigns (_b_list, _assigns) ->
acc
| AVariant (_v, _rel) -> acc
| APragma _ ->
Wp_parameters.warning "Ignored annotation:@ %a"
!Ast_printer.d_code_annotation ca;
acc
| AStmtSpec (b_list, spec) ->
if b_list <> [] then
Wp_parameters.warning
"Ignored 'for %a' (generalize to all behavior)"
(Pretty_utils.pp_list ~sep:", " Format.pp_print_string)
b_list;
add_stmt_spec_annots config v s spec acc
in
let before_acc = WpStrategy.empty_acc in
let after_acc = WpStrategy.empty_acc in
let exits_acc = WpStrategy.empty_acc in
let acc = before_acc, (after_acc, exits_acc) in
Annotations.single_fold_stmt do_annot s acc