(&self, args: ImplItemArgs<'_, Item>)
| 898 | Item: ItemLike + ToTokens + GetIdent, |
| 899 | { |
| 900 | fn gen_impl_item(&self, args: ImplItemArgs<'_, Item>) -> Result<()> { |
| 901 | let func = args |
| 902 | .item |
| 903 | .function_or_method() |
| 904 | .map_err(|_| self.new_syn_error(args.item.span(), "can only be on a method"))?; |
| 905 | let ident = &func.sig().ident; |
| 906 | |
| 907 | let item_attr = args.attrs.remove(self.index()); |
| 908 | let item_meta = MethodItemMeta::from_attr(ident.clone(), &item_attr)?; |
| 909 | |
| 910 | let py_name = item_meta.method_name()?; |
| 911 | |
| 912 | // Disallow slot methods - they should be defined via trait implementations |
| 913 | // These are exposed as wrapper_descriptor via add_operators from SLOT_DEFS |
| 914 | if !args.context.is_trait { |
| 915 | const FORBIDDEN_SLOT_METHODS: &[(&str, &str)] = &[ |
| 916 | // Constructor/Initializer traits |
| 917 | ("__new__", "Constructor"), |
| 918 | ("__init__", "Initializer"), |
| 919 | // Representable trait |
| 920 | ("__repr__", "Representable"), |
| 921 | // ("__str__", "???"), // allow __str__ |
| 922 | // Hashable trait |
| 923 | ("__hash__", "Hashable"), |
| 924 | // Callable trait |
| 925 | ("__call__", "Callable"), |
| 926 | // GetAttr/SetAttr traits |
| 927 | // NOTE: __getattribute__, __setattr__, __delattr__ are intentionally NOT forbidden |
| 928 | // because they need pymethod for subclass override mechanism to work properly. |
| 929 | // GetDescriptor/SetDescriptor traits |
| 930 | ("__get__", "GetDescriptor"), |
| 931 | ("__set__", "SetDescriptor"), |
| 932 | ("__delete__", "SetDescriptor"), |
| 933 | // AsNumber trait |
| 934 | ("__add__", "AsNumber"), |
| 935 | ("__radd__", "AsNumber"), |
| 936 | ("__iadd__", "AsNumber"), |
| 937 | ("__sub__", "AsNumber"), |
| 938 | ("__rsub__", "AsNumber"), |
| 939 | ("__isub__", "AsNumber"), |
| 940 | ("__mul__", "AsNumber"), |
| 941 | ("__rmul__", "AsNumber"), |
| 942 | ("__imul__", "AsNumber"), |
| 943 | ("__truediv__", "AsNumber"), |
| 944 | ("__rtruediv__", "AsNumber"), |
| 945 | ("__itruediv__", "AsNumber"), |
| 946 | ("__floordiv__", "AsNumber"), |
| 947 | ("__rfloordiv__", "AsNumber"), |
| 948 | ("__ifloordiv__", "AsNumber"), |
| 949 | ("__mod__", "AsNumber"), |
| 950 | ("__rmod__", "AsNumber"), |
| 951 | ("__imod__", "AsNumber"), |
| 952 | ("__pow__", "AsNumber"), |
| 953 | ("__rpow__", "AsNumber"), |
| 954 | ("__ipow__", "AsNumber"), |
| 955 | ("__divmod__", "AsNumber"), |
| 956 | ("__rdivmod__", "AsNumber"), |
| 957 | ("__matmul__", "AsNumber"), |
no test coverage detected