@@ -192,12 +192,17 @@ module Array {
192
192
}
193
193
}
194
194
195
+ private class ElementReferenceReadMethodName extends string {
196
+ ElementReferenceReadMethodName ( ) { this = [ "[]" , "slice" ] }
197
+ }
198
+
195
199
/** A call to `[]`, or its alias, `slice`. */
196
200
abstract private class ElementReferenceReadSummary extends SummarizedCallable {
197
201
MethodCall mc ;
202
+ ElementReferenceReadMethodName methodName ; // adding this as a field helps give a better join order
198
203
199
204
bindingset [ this ]
200
- ElementReferenceReadSummary ( ) { mc .getMethodName ( ) = [ "[]" , "slice" ] }
205
+ ElementReferenceReadSummary ( ) { mc .getMethodName ( ) = methodName }
201
206
202
207
override MethodCall getACall ( ) { result = mc }
203
208
}
@@ -207,7 +212,7 @@ module Array {
207
212
private ConstantValue cv ;
208
213
209
214
ElementReferenceReadKnownSummary ( ) {
210
- this = mc . getMethodName ( ) + "(" + cv .serialize ( ) + ")" and
215
+ this = methodName + "(" + cv .serialize ( ) + ")" and
211
216
mc .getNumberOfArguments ( ) = 1 and
212
217
cv = getKnownElementIndex ( mc .getArgument ( 0 ) )
213
218
}
@@ -225,7 +230,7 @@ module Array {
225
230
*/
226
231
private class ElementReferenceReadUnknownSummary extends ElementReferenceReadSummary {
227
232
ElementReferenceReadUnknownSummary ( ) {
228
- this = mc . getMethodName ( ) + "(index)" and
233
+ this = methodName + "(index)" and
229
234
mc .getNumberOfArguments ( ) = 1 and
230
235
isUnknownElementIndex ( mc .getArgument ( 0 ) )
231
236
}
@@ -267,7 +272,7 @@ module Array {
267
272
or
268
273
rl .isExclusive ( ) and end = e - 1
269
274
) and
270
- this = "[] (" + start + ".." + end + ")"
275
+ this = methodName + " (" + start + ".." + end + ")"
271
276
)
272
277
}
273
278
@@ -291,7 +296,7 @@ module Array {
291
296
*/
292
297
private class ElementReferenceRangeReadUnknownSummary extends ElementReferenceReadSummary {
293
298
ElementReferenceRangeReadUnknownSummary ( ) {
294
- this = "[] (range_unknown)" and
299
+ this = methodName + " (range_unknown)" and
295
300
(
296
301
mc .getNumberOfArguments ( ) = 2 and
297
302
(
@@ -2007,17 +2012,22 @@ module Enumerable {
2007
2012
}
2008
2013
}
2009
2014
2015
+ private class GrepMethodName extends string {
2016
+ GrepMethodName ( ) { this = [ "grep" , "grep_v" ] }
2017
+ }
2018
+
2010
2019
abstract private class GrepSummary extends SummarizedCallable {
2011
2020
MethodCall mc ;
2021
+ GrepMethodName methodName ; // adding this as a field helps give a better join order
2012
2022
2013
2023
bindingset [ this ]
2014
- GrepSummary ( ) { mc .getMethodName ( ) = [ "grep" , "grep_v" ] }
2024
+ GrepSummary ( ) { mc .getMethodName ( ) = methodName }
2015
2025
2016
2026
override MethodCall getACall ( ) { result = mc }
2017
2027
}
2018
2028
2019
2029
private class GrepBlockSummary extends GrepSummary {
2020
- GrepBlockSummary ( ) { this = mc . getMethodName ( ) + "(block)" and exists ( mc .getBlock ( ) ) }
2030
+ GrepBlockSummary ( ) { this = methodName + "(block)" and exists ( mc .getBlock ( ) ) }
2021
2031
2022
2032
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
2023
2033
(
@@ -2032,7 +2042,7 @@ module Enumerable {
2032
2042
}
2033
2043
2034
2044
private class GrepNoBlockSummary extends GrepSummary {
2035
- GrepNoBlockSummary ( ) { this = mc . getMethodName ( ) + "(no_block)" and not exists ( mc .getBlock ( ) ) }
2045
+ GrepNoBlockSummary ( ) { this = methodName + "(no_block)" and not exists ( mc .getBlock ( ) ) }
2036
2046
2037
2047
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
2038
2048
input = "Argument[self].Element[any]" and
@@ -2052,18 +2062,23 @@ module Enumerable {
2052
2062
}
2053
2063
}
2054
2064
2065
+ private class InjectMethodName extends string {
2066
+ // `reduce` is an alias for `inject`.
2067
+ InjectMethodName ( ) { this = [ "inject" , "reduce" ] }
2068
+ }
2069
+
2055
2070
abstract private class InjectSummary extends SummarizedCallable {
2056
2071
MethodCall mc ;
2072
+ InjectMethodName methodName ; // adding this as a field helps give a better join order
2057
2073
2058
- // `reduce` is an alias for `inject`.
2059
2074
bindingset [ this ]
2060
- InjectSummary ( ) { mc .getMethodName ( ) = [ "inject" , "reduce" ] }
2075
+ InjectSummary ( ) { mc .getMethodName ( ) = methodName }
2061
2076
2062
2077
override MethodCall getACall ( ) { result = mc }
2063
2078
}
2064
2079
2065
2080
private class InjectNoArgSummary extends InjectSummary {
2066
- InjectNoArgSummary ( ) { this = mc . getMethodName ( ) + "_no_arg" and mc .getNumberOfArguments ( ) = 0 }
2081
+ InjectNoArgSummary ( ) { this = methodName + "_no_arg" and mc .getNumberOfArguments ( ) = 0 }
2067
2082
2068
2083
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
2069
2084
// The no-argument variant of inject passes element 0 to the first block
@@ -2083,7 +2098,7 @@ module Enumerable {
2083
2098
}
2084
2099
2085
2100
private class InjectArgSummary extends InjectSummary {
2086
- InjectArgSummary ( ) { this = mc . getMethodName ( ) + "_arg" and mc .getNumberOfArguments ( ) > 0 }
2101
+ InjectArgSummary ( ) { this = methodName + "_arg" and mc .getNumberOfArguments ( ) > 0 }
2087
2102
2088
2103
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
2089
2104
(
@@ -2101,18 +2116,23 @@ module Enumerable {
2101
2116
}
2102
2117
}
2103
2118
2119
+ private class MinOrMaxByMethodName extends string {
2120
+ MinOrMaxByMethodName ( ) { this = [ "min_by" , "max_by" ] }
2121
+ }
2122
+
2104
2123
abstract private class MinOrMaxBySummary extends SummarizedCallable {
2105
2124
MethodCall mc ;
2125
+ MinOrMaxByMethodName methodName ; // adding this as a field helps give a better join order
2106
2126
2107
2127
bindingset [ this ]
2108
- MinOrMaxBySummary ( ) { mc .getMethodName ( ) = [ "min_by" , "max_by" ] }
2128
+ MinOrMaxBySummary ( ) { mc .getMethodName ( ) = methodName }
2109
2129
2110
2130
override MethodCall getACall ( ) { result = mc }
2111
2131
}
2112
2132
2113
2133
private class MinOrMaxByNoArgSummary extends MinOrMaxBySummary {
2114
2134
MinOrMaxByNoArgSummary ( ) {
2115
- this = mc . getMethodName ( ) + "_no_arg" and
2135
+ this = methodName + "_no_arg" and
2116
2136
mc .getNumberOfArguments ( ) = 0
2117
2137
}
2118
2138
@@ -2125,7 +2145,7 @@ module Enumerable {
2125
2145
2126
2146
private class MinOrMaxByArgSummary extends MinOrMaxBySummary {
2127
2147
MinOrMaxByArgSummary ( ) {
2128
- this = mc . getMethodName ( ) + "_arg" and
2148
+ this = methodName + "_arg" and
2129
2149
mc .getNumberOfArguments ( ) > 0
2130
2150
}
2131
2151
@@ -2136,18 +2156,23 @@ module Enumerable {
2136
2156
}
2137
2157
}
2138
2158
2159
+ private class MinOrMaxMethodName extends string {
2160
+ MinOrMaxMethodName ( ) { this = [ "min" , "max" ] }
2161
+ }
2162
+
2139
2163
abstract private class MinOrMaxSummary extends SummarizedCallable {
2140
2164
MethodCall mc ;
2165
+ MinOrMaxMethodName methodName ; // adding this as a field helps give a better join order
2141
2166
2142
2167
bindingset [ this ]
2143
- MinOrMaxSummary ( ) { mc .getMethodName ( ) = [ "min" , "max" ] }
2168
+ MinOrMaxSummary ( ) { mc .getMethodName ( ) = methodName }
2144
2169
2145
2170
override MethodCall getACall ( ) { result = mc }
2146
2171
}
2147
2172
2148
2173
private class MinOrMaxNoArgNoBlockSummary extends MinOrMaxSummary {
2149
2174
MinOrMaxNoArgNoBlockSummary ( ) {
2150
- this = mc . getMethodName ( ) + "_no_arg_no_block" and
2175
+ this = methodName + "_no_arg_no_block" and
2151
2176
mc .getNumberOfArguments ( ) = 0 and
2152
2177
not exists ( mc .getBlock ( ) )
2153
2178
}
@@ -2161,7 +2186,7 @@ module Enumerable {
2161
2186
2162
2187
private class MinOrMaxArgNoBlockSummary extends MinOrMaxSummary {
2163
2188
MinOrMaxArgNoBlockSummary ( ) {
2164
- this = mc . getMethodName ( ) + "_arg_no_block" and
2189
+ this = methodName + "_arg_no_block" and
2165
2190
mc .getNumberOfArguments ( ) > 0 and
2166
2191
not exists ( mc .getBlock ( ) )
2167
2192
}
@@ -2175,7 +2200,7 @@ module Enumerable {
2175
2200
2176
2201
private class MinOrMaxNoArgBlockSummary extends MinOrMaxSummary {
2177
2202
MinOrMaxNoArgBlockSummary ( ) {
2178
- this = mc . getMethodName ( ) + "_no_arg_block" and
2203
+ this = methodName + "_no_arg_block" and
2179
2204
mc .getNumberOfArguments ( ) = 0 and
2180
2205
exists ( mc .getBlock ( ) )
2181
2206
}
@@ -2189,7 +2214,7 @@ module Enumerable {
2189
2214
2190
2215
private class MinOrMaxArgBlockSummary extends MinOrMaxSummary {
2191
2216
MinOrMaxArgBlockSummary ( ) {
2192
- this = mc . getMethodName ( ) + "_arg_block" and
2217
+ this = methodName + "_arg_block" and
2193
2218
mc .getNumberOfArguments ( ) > 0 and
2194
2219
exists ( mc .getBlock ( ) )
2195
2220
}
0 commit comments