@@ -82,17 +82,20 @@ def constant_fold_expr(builder: IRBuilder, expr: Expression) -> ConstantValue |
82
82
# builtins.str methods
83
83
if isinstance (folded_callee , str ):
84
84
# str.join
85
- if (
86
- callee .name == "join"
87
- and len (args := expr .args ) == 1
85
+ if callee .name == "join" and len (args := expr .args ) == 1 :
88
86
# TODO extend this to work with rtuples comprised of known literal values
89
- and isinstance (arg := args [0 ], (ListExpr , TupleExpr ))
90
- ):
91
- folded_items = constant_fold_container_expr (builder , arg )
92
- if folded_items is not None and all (
93
- isinstance (item , str ) for item in folded_items
87
+ arg = args [0 ]
88
+ if isinstance (arg , (ListExpr , TupleExpr )):
89
+ folded_items = constant_fold_container_expr (builder , arg )
90
+ if folded_items is not None and all (
91
+ isinstance (item , str ) for item in folded_items
92
+ ):
93
+ return folded_callee .join (folded_items ) # type: ignore [arg-type]
94
+ expr_type = builder .types [arg ]
95
+ if isinstance (expr_type , TupleType ) and all (
96
+ isinstance (i , LiteralType ) and isinstance (i .value , str ) for i in expr_type .items
94
97
):
95
- return folded_callee .join (folded_items ) # type: ignore [arg-type]
98
+ return folded_callee .join (i . value for i in expr_type . items )
96
99
97
100
# builtins.bytes methods
98
101
elif isinstance (folded_callee , bytes ):
0 commit comments