@@ -85,6 +85,67 @@ predicate extractorTotalDiagnostics(string key, int value) {
8585 )
8686}
8787
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+
88149from string key , int value
89150where
90151 not exists ( string pattern | extractorInformationSkipKey ( pattern ) and key .matches ( pattern ) ) and
@@ -97,6 +158,12 @@ where
97158 totalNumberOfLinesByExtension ( key , value ) or
98159 numberOfLinesOfCodeByExtension ( key , value ) or
99160 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 )
101168 )
102169select key , value
0 commit comments