@@ -220,6 +220,8 @@ def visit_ADDRESS(self, node):
220220 yield node
221221
222222 def visit_BINARY (self , node : symbols .BINARY ):
223+ node = yield self .generic_visit (node ) # This might convert consts to numbers if possible
224+
223225 if self .O_LEVEL > 1 and node .operator in ("PLUS" , "MUL" ):
224226 if chk .is_number (node .left ) and not chk .is_number (node .right ):
225227 node .left , node .right = node .right , node .left
@@ -245,7 +247,30 @@ def visit_BINARY(self, node: symbols.BINARY):
245247 node .left = left
246248 node .right = right
247249
248- node = yield self .generic_visit (node ) # This might convert consts to numbers if possible
250+ if (
251+ node .left .token == node .right .token == "BINARY"
252+ and node .operator == node .left .operator == node .right .operator
253+ and chk .is_number (node .left .right , node .right .right )
254+ ):
255+ left = yield symbols .BINARY .make_node (
256+ operator = node .operator ,
257+ left = node .left .left ,
258+ right = node .right .left ,
259+ func = node .left .func ,
260+ lineno = node .left .lineno ,
261+ )
262+ right = yield symbols .BINARY .make_node (
263+ operator = node .operator ,
264+ left = node .left .right ,
265+ right = node .right .right ,
266+ func = node .right .func ,
267+ lineno = node .right .lineno ,
268+ )
269+
270+ node = yield symbols .BINARY .make_node (
271+ operator = node .operator , left = left , right = right , func = node .func , lineno = node .lineno
272+ )
273+
249274 # Retry folding
250275 yield symbols .BINARY .make_node (node .operator , node .left , node .right , node .lineno , node .func , node .type_ )
251276
0 commit comments