@@ -85,6 +85,67 @@ predicate extractorTotalDiagnostics(string key, int value) {
85
85
)
86
86
}
87
87
88
+ signature module StatsSig {
89
+ int getNumberOfOk ( ) ;
90
+
91
+ int getNumberOfNotOk ( ) ;
92
+
93
+ string getOkText ( ) ;
94
+
95
+ string getNotOkText ( ) ;
96
+ }
97
+
98
+ module ReportStats< StatsSig Stats> {
99
+ predicate numberOfOk ( string key , int value ) {
100
+ value = Stats:: getNumberOfOk ( ) and
101
+ key = "Number of " + Stats:: getOkText ( )
102
+ }
103
+
104
+ predicate numberOfNotOk ( string key , int value ) {
105
+ value = Stats:: getNumberOfNotOk ( ) and
106
+ key = "Number of " + Stats:: getNotOkText ( )
107
+ }
108
+
109
+ predicate percentageOfOk ( string key , float value ) {
110
+ value = Stats:: getNumberOfOk ( ) * 100.0 / ( Stats:: getNumberOfOk ( ) + Stats:: getNumberOfNotOk ( ) ) and
111
+ key = "Percentage of " + Stats:: getOkText ( )
112
+ }
113
+ }
114
+
115
+ module CallTargetStats implements StatsSig {
116
+ int getNumberOfOk ( ) { result = count ( Call c | exists ( c .getCallee ( ) ) ) }
117
+
118
+ int getNumberOfNotOk ( ) { result = count ( Call c | not exists ( c .getCallee ( ) ) ) }
119
+
120
+ string getOkText ( ) { result = "calls with call target" }
121
+
122
+ string getNotOkText ( ) { result = "calls with missing call target" }
123
+ }
124
+
125
+ private class SourceExpr extends Expr {
126
+ SourceExpr ( ) {
127
+ this .getFile ( ) .isSourceFile ( )
128
+ }
129
+ }
130
+
131
+ private predicate hasGoodType ( Expr e ) {
132
+ exists ( e .getType ( ) ) and not e .getType ( ) instanceof ErrorType
133
+ }
134
+
135
+ module ExprTypeStats implements StatsSig {
136
+ int getNumberOfOk ( ) { result = count ( SourceExpr e | hasGoodType ( e ) ) }
137
+
138
+ int getNumberOfNotOk ( ) { result = count ( SourceExpr e | not hasGoodType ( e ) ) }
139
+
140
+ string getOkText ( ) { result = "expressions with known type" }
141
+
142
+ string getNotOkText ( ) { result = "expressions with unknown type" }
143
+ }
144
+
145
+ module CallTargetStatsReport = ReportStats< CallTargetStats > ;
146
+
147
+ module ExprTypeStatsReport = ReportStats< ExprTypeStats > ;
148
+
88
149
from string key , int value
89
150
where
90
151
not exists ( string pattern | extractorInformationSkipKey ( pattern ) and key .matches ( pattern ) ) and
@@ -97,6 +158,12 @@ where
97
158
totalNumberOfLinesByExtension ( key , value ) or
98
159
numberOfLinesOfCodeByExtension ( key , value ) or
99
160
extractorDiagnostics ( key , value ) or
100
- extractorTotalDiagnostics ( key , value )
161
+ extractorTotalDiagnostics ( key , value ) or
162
+ CallTargetStatsReport:: numberOfOk ( key , value ) or
163
+ CallTargetStatsReport:: numberOfNotOk ( key , value ) or
164
+ CallTargetStatsReport:: percentageOfOk ( key , value ) or
165
+ ExprTypeStatsReport:: numberOfOk ( key , value ) or
166
+ ExprTypeStatsReport:: numberOfNotOk ( key , value ) or
167
+ ExprTypeStatsReport:: percentageOfOk ( key , value )
101
168
)
102
169
select key , value
0 commit comments