Convert expressions into string literal objects with the guidance of FormatOps. Return None when fails.
(
builder: IRBuilder, format_ops: list[FormatOp], exprs: list[Expression], line: int
)
| 133 | |
| 134 | |
| 135 | def convert_format_expr_to_str( |
| 136 | builder: IRBuilder, format_ops: list[FormatOp], exprs: list[Expression], line: int |
| 137 | ) -> list[Value] | None: |
| 138 | """Convert expressions into string literal objects with the guidance |
| 139 | of FormatOps. Return None when fails.""" |
| 140 | if len(format_ops) != len(exprs): |
| 141 | return None |
| 142 | |
| 143 | converted = [] |
| 144 | for x, format_op in zip(exprs, format_ops): |
| 145 | node_type = builder.node_type(x) |
| 146 | if format_op == FormatOp.STR: |
| 147 | if isinstance(folded := constant_fold_expr(builder, x), str): |
| 148 | var_str = builder.load_literal_value(folded) |
| 149 | elif is_str_rprimitive(node_type): |
| 150 | var_str = builder.accept(x) |
| 151 | elif is_int_rprimitive(node_type) or is_short_int_rprimitive(node_type): |
| 152 | var_str = builder.primitive_op(int_to_str_op, [builder.accept(x)], line) |
| 153 | else: |
| 154 | var_str = builder.primitive_op(str_op, [builder.accept(x)], line) |
| 155 | elif format_op == FormatOp.INT: |
| 156 | if isinstance(folded := constant_fold_expr(builder, x), int): |
| 157 | var_str = builder.load_literal_value(str(folded)) |
| 158 | elif is_int_rprimitive(node_type) or is_short_int_rprimitive(node_type): |
| 159 | var_str = builder.primitive_op(int_to_str_op, [builder.accept(x)], line) |
| 160 | else: |
| 161 | return None |
| 162 | else: |
| 163 | return None |
| 164 | converted.append(var_str) |
| 165 | return converted |
| 166 | |
| 167 | |
| 168 | def join_formatted_strings( |
no test coverage detected
searching dependent graphs…