16eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson"""Fixer for operator functions. 2840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson 36eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonoperator.isCallable(obj) -> hasattr(obj, '__call__') 4840077cd319716a1c135dd4facfaea1eff05d929Benjamin Petersonoperator.sequenceIncludes(obj) -> operator.contains(obj) 56eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonoperator.isSequenceType(obj) -> isinstance(obj, collections.Sequence) 66eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonoperator.isMappingType(obj) -> isinstance(obj, collections.Mapping) 76eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonoperator.isNumberType(obj) -> isinstance(obj, numbers.Number) 86eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonoperator.repeat(obj, n) -> operator.mul(obj, n) 96eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonoperator.irepeat(obj, n) -> operator.imul(obj, n) 10840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson""" 11840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson 12840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson# Local imports 136eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonfrom lib2to3 import fixer_base 146eccb79aa376691e6f5116b121fea49737e3e552Benjamin Petersonfrom lib2to3.fixer_util import Call, Name, String, touch_import 156eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 16840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson 17a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Petersondef invocation(s): 18a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson def dec(f): 19a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson f.invocation = s 20a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson return f 21a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson return dec 22a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson 23a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson 24840077cd319716a1c135dd4facfaea1eff05d929Benjamin Petersonclass FixOperator(fixer_base.BaseFix): 25a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson BM_compatible = True 26a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson order = "pre" 27840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson 286eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson methods = """ 296eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson method=('isCallable'|'sequenceIncludes' 306eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson |'isSequenceType'|'isMappingType'|'isNumberType' 316eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson |'repeat'|'irepeat') 326eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson """ 336eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson obj = "'(' obj=any ')'" 34840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson PATTERN = """ 35840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson power< module='operator' 366eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson trailer< '.' %(methods)s > trailer< %(obj)s > > 37840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson | 386eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson power< %(methods)s trailer< %(obj)s > > 396eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson """ % dict(methods=methods, obj=obj) 40840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson 41840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson def transform(self, node, results): 426eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson method = self._check_method(node, results) 436eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson if method is not None: 446eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return method(node, results) 456eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 46a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("operator.contains(%s)") 476eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _sequenceIncludes(self, node, results): 486eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return self._handle_rename(node, results, u"contains") 496eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 50a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("hasattr(%s, '__call__')") 516eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _isCallable(self, node, results): 526eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson obj = results["obj"] 536eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson args = [obj.clone(), String(u", "), String(u"'__call__'")] 546eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return Call(Name(u"hasattr"), args, prefix=node.prefix) 556eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 56a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("operator.mul(%s)") 576eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _repeat(self, node, results): 586eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return self._handle_rename(node, results, u"mul") 596eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 60a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("operator.imul(%s)") 616eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _irepeat(self, node, results): 626eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return self._handle_rename(node, results, u"imul") 636eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 64a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("isinstance(%s, collections.Sequence)") 656eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _isSequenceType(self, node, results): 666eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return self._handle_type2abc(node, results, u"collections", u"Sequence") 676eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 68a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("isinstance(%s, collections.Mapping)") 696eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _isMappingType(self, node, results): 706eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return self._handle_type2abc(node, results, u"collections", u"Mapping") 716eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 72a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson @invocation("isinstance(%s, numbers.Number)") 736eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _isNumberType(self, node, results): 746eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return self._handle_type2abc(node, results, u"numbers", u"Number") 756eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 766eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _handle_rename(self, node, results, name): 77840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson method = results["method"][0] 786eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson method.value = name 796eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson method.changed() 80840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson 816eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _handle_type2abc(self, node, results, module, abc): 826eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson touch_import(None, module, node) 836eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson obj = results["obj"] 846eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson args = [obj.clone(), String(u", " + u".".join([module, abc]))] 856eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return Call(Name(u"isinstance"), args, prefix=node.prefix) 866eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson 876eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson def _check_method(self, node, results): 886eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson method = getattr(self, "_" + results["method"][0].value.encode("ascii")) 896eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson if callable(method): 906eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson if "module" in results: 916eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return method 92840077cd319716a1c135dd4facfaea1eff05d929Benjamin Peterson else: 936eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson sub = (unicode(results["obj"]),) 94a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson invocation_str = unicode(method.invocation) % sub 956eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson self.warning(node, u"You should use '%s' here." % invocation_str) 966eccb79aa376691e6f5116b121fea49737e3e552Benjamin Peterson return None 97