@@ -10,69 +10,64 @@ use crate::{
10
10
VerificationArgs ,
11
11
list_args:: { CargoListArgs , StandaloneListArgs } ,
12
12
} ,
13
- list:: ListMetadata ,
14
13
list:: output:: output_list_results,
14
+ list:: { FileName , HarnessName , ListMetadata } ,
15
15
project:: { Project , cargo_project, standalone_project, std_project} ,
16
16
session:: KaniSession ,
17
17
version:: print_kani_version,
18
18
} ;
19
19
use anyhow:: Result ;
20
- use kani_metadata:: { ContractedFunction , HarnessKind , KaniMetadata } ;
20
+ use kani_metadata:: { ContractedFunction , HarnessKind , HarnessMetadata , KaniMetadata } ;
21
21
22
22
/// Process the KaniMetadata output from kani-compiler and output the list subcommand results
23
- pub fn process_metadata ( metadata : Vec < KaniMetadata > ) -> ListMetadata {
24
- // We use ordered maps and sets so that the output is in lexicographic order (and consistent across invocations).
25
-
26
- // Map each file to a vector of its harnesses.
27
- let mut standard_harnesses: BTreeMap < String , BTreeSet < String > > = BTreeMap :: new ( ) ;
28
- let mut contract_harnesses: BTreeMap < String , BTreeSet < String > > = BTreeMap :: new ( ) ;
23
+ pub fn process_metadata ( metadata : Vec < KaniMetadata > ) -> BTreeSet < ListMetadata > {
24
+ let mut list_metadata: BTreeSet < ListMetadata > = BTreeSet :: new ( ) ;
25
+
26
+ let insert = |harness_meta : HarnessMetadata ,
27
+ map : & mut BTreeMap < FileName , BTreeSet < HarnessName > > ,
28
+ count : & mut usize | {
29
+ * count += 1 ;
30
+ if let Some ( harnesses) = map. get_mut ( & harness_meta. original_file ) {
31
+ harnesses. insert ( harness_meta. pretty_name ) ;
32
+ } else {
33
+ map. insert ( harness_meta. original_file , BTreeSet :: from ( [ harness_meta. pretty_name ] ) ) ;
34
+ } ;
35
+ } ;
29
36
30
- let mut contracted_functions: BTreeSet < ContractedFunction > = BTreeSet :: new ( ) ;
37
+ for kani_meta in metadata {
38
+ // We use ordered maps and sets so that the output is in lexicographic order (and consistent across invocations).
39
+ let mut standard_harnesses: BTreeMap < FileName , BTreeSet < HarnessName > > = BTreeMap :: new ( ) ;
40
+ let mut contract_harnesses: BTreeMap < FileName , BTreeSet < HarnessName > > = BTreeMap :: new ( ) ;
41
+ let mut contracted_functions: BTreeSet < ContractedFunction > = BTreeSet :: new ( ) ;
31
42
32
- let mut standard_harnesses_count = 0 ;
33
- let mut contract_harnesses_count = 0 ;
43
+ let mut standard_harnesses_count = 0 ;
44
+ let mut contract_harnesses_count = 0 ;
34
45
35
- for kani_meta in metadata {
36
46
for harness_meta in kani_meta. proof_harnesses {
37
47
match harness_meta. attributes . kind {
38
48
HarnessKind :: Proof => {
39
- standard_harnesses_count += 1 ;
40
- if let Some ( harnesses) = standard_harnesses. get_mut ( & harness_meta. original_file )
41
- {
42
- harnesses. insert ( harness_meta. pretty_name ) ;
43
- } else {
44
- standard_harnesses. insert (
45
- harness_meta. original_file ,
46
- BTreeSet :: from ( [ harness_meta. pretty_name ] ) ,
47
- ) ;
48
- }
49
+ insert ( harness_meta, & mut standard_harnesses, & mut standard_harnesses_count) ;
49
50
}
50
51
HarnessKind :: ProofForContract { .. } => {
51
- contract_harnesses_count += 1 ;
52
- if let Some ( harnesses) = contract_harnesses. get_mut ( & harness_meta. original_file )
53
- {
54
- harnesses. insert ( harness_meta. pretty_name ) ;
55
- } else {
56
- contract_harnesses. insert (
57
- harness_meta. original_file ,
58
- BTreeSet :: from ( [ harness_meta. pretty_name ] ) ,
59
- ) ;
60
- }
52
+ insert ( harness_meta, & mut contract_harnesses, & mut contract_harnesses_count) ;
61
53
}
62
54
HarnessKind :: Test => { }
63
55
}
64
56
}
65
57
66
58
contracted_functions. extend ( kani_meta. contracted_functions . into_iter ( ) ) ;
67
- }
68
59
69
- ListMetadata {
70
- standard_harnesses,
71
- standard_harnesses_count,
72
- contract_harnesses,
73
- contract_harnesses_count,
74
- contracted_functions,
60
+ list_metadata. insert ( ListMetadata {
61
+ crate_name : kani_meta. crate_name ,
62
+ standard_harnesses,
63
+ standard_harnesses_count,
64
+ contract_harnesses,
65
+ contract_harnesses_count,
66
+ contracted_functions,
67
+ } ) ;
75
68
}
69
+
70
+ list_metadata
76
71
}
77
72
78
73
pub fn list_cargo ( args : CargoListArgs , mut verify_opts : VerificationArgs ) -> Result < ( ) > {
0 commit comments