Parse arguments of an Enum call. Return a tuple of fields, values, was there an error.
(
self, call: CallExpr, class_name: str
)
| 155 | return info |
| 156 | |
| 157 | def parse_enum_call_args( |
| 158 | self, call: CallExpr, class_name: str |
| 159 | ) -> tuple[str, list[str], list[Expression | None], bool]: |
| 160 | """Parse arguments of an Enum call. |
| 161 | |
| 162 | Return a tuple of fields, values, was there an error. |
| 163 | """ |
| 164 | args = call.args |
| 165 | if not all(arg_kind in [ARG_POS, ARG_NAMED] for arg_kind in call.arg_kinds): |
| 166 | return self.fail_enum_call_arg(f"Unexpected arguments to {class_name}()", call) |
| 167 | if len(args) < 2: |
| 168 | return self.fail_enum_call_arg(f"Too few arguments for {class_name}()", call) |
| 169 | if len(args) > 6: |
| 170 | return self.fail_enum_call_arg(f"Too many arguments for {class_name}()", call) |
| 171 | valid_name = [None, "value", "names", "module", "qualname", "type", "start"] |
| 172 | for arg_name in call.arg_names: |
| 173 | if arg_name not in valid_name: |
| 174 | self.fail_enum_call_arg(f'Unexpected keyword argument "{arg_name}"', call) |
| 175 | value, names = None, None |
| 176 | for arg_name, arg in zip(call.arg_names, args): |
| 177 | if arg_name == "value": |
| 178 | value = arg |
| 179 | if arg_name == "names": |
| 180 | names = arg |
| 181 | if value is None: |
| 182 | value = args[0] |
| 183 | if names is None: |
| 184 | names = args[1] |
| 185 | if not isinstance(value, StrExpr): |
| 186 | return self.fail_enum_call_arg( |
| 187 | f"{class_name}() expects a string literal as the first argument", call |
| 188 | ) |
| 189 | new_class_name = value.value |
| 190 | |
| 191 | items = [] |
| 192 | values: list[Expression | None] = [] |
| 193 | if isinstance(names, StrExpr): |
| 194 | fields = names.value |
| 195 | for field in fields.replace(",", " ").split(): |
| 196 | items.append(field) |
| 197 | elif isinstance(names, (TupleExpr, ListExpr)): |
| 198 | seq_items = names.items |
| 199 | if is_StrExpr_list(seq_items): |
| 200 | items = [seq_item.value for seq_item in seq_items] |
| 201 | elif all( |
| 202 | isinstance(seq_item, (TupleExpr, ListExpr)) |
| 203 | and len(seq_item.items) == 2 |
| 204 | and isinstance(seq_item.items[0], StrExpr) |
| 205 | for seq_item in seq_items |
| 206 | ): |
| 207 | for seq_item in seq_items: |
| 208 | assert isinstance(seq_item, (TupleExpr, ListExpr)) |
| 209 | name, value = seq_item.items |
| 210 | assert isinstance(name, StrExpr) |
| 211 | items.append(name.value) |
| 212 | values.append(value) |
| 213 | else: |
| 214 | return self.fail_enum_call_arg( |
no test coverage detected