OLD | NEW |
1 # Copyright (c) 2006-2013 LOGILAB S.A. (Paris, FRANCE). | 1 # Copyright (c) 2006-2013 LOGILAB S.A. (Paris, FRANCE). |
2 # http://www.logilab.fr/ -- mailto:contact@logilab.fr | 2 # http://www.logilab.fr/ -- mailto:contact@logilab.fr |
3 # | 3 # |
4 # This program is free software; you can redistribute it and/or modify it under | 4 # This program is free software; you can redistribute it and/or modify it under |
5 # the terms of the GNU General Public License as published by the Free Software | 5 # the terms of the GNU General Public License as published by the Free Software |
6 # Foundation; either version 2 of the License, or (at your option) any later | 6 # Foundation; either version 2 of the License, or (at your option) any later |
7 # version. | 7 # version. |
8 # | 8 # |
9 # This program is distributed in the hope that it will be useful, but WITHOUT | 9 # This program is distributed in the hope that it will be useful, but WITHOUT |
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 attrs = klass._proxied.getattr(node.func.attrname) | 337 attrs = klass._proxied.getattr(node.func.attrname) |
338 except astroid.NotFoundError: | 338 except astroid.NotFoundError: |
339 return | 339 return |
340 | 340 |
341 for attr in attrs: | 341 for attr in attrs: |
342 if attr is astroid.YES: | 342 if attr is astroid.YES: |
343 continue | 343 continue |
344 if not isinstance(attr, astroid.Function): | 344 if not isinstance(attr, astroid.Function): |
345 continue | 345 continue |
346 | 346 |
347 # Decorated, see if it is decorated with a property | 347 # Decorated, see if it is decorated with a property. |
| 348 # Also, check the returns and see if they are callable. |
348 if decorated_with_property(attr): | 349 if decorated_with_property(attr): |
349 self.add_message('not-callable', node=node, | 350 if all(return_node.callable() |
350 args=node.func.as_string()) | 351 for return_node in attr.infer_call_result(node)): |
351 break | 352 continue |
| 353 else: |
| 354 self.add_message('not-callable', node=node, |
| 355 args=node.func.as_string()) |
| 356 break |
352 | 357 |
353 @check_messages(*(list(MSGS.keys()))) | 358 @check_messages(*(list(MSGS.keys()))) |
354 def visit_callfunc(self, node): | 359 def visit_callfunc(self, node): |
355 """check that called functions/methods are inferred to callable objects, | 360 """check that called functions/methods are inferred to callable objects, |
356 and that the arguments passed to the function match the parameters in | 361 and that the arguments passed to the function match the parameters in |
357 the inferred function's definition | 362 the inferred function's definition |
358 """ | 363 """ |
359 # Build the set of keyword arguments, checking for duplicate keywords, | 364 # Build the set of keyword arguments, checking for duplicate keywords, |
360 # and count the positional arguments. | 365 # and count the positional arguments. |
361 keyword_args = set() | 366 keyword_args = set() |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 return | 618 return |
614 except astroid.NotFoundError: | 619 except astroid.NotFoundError: |
615 pass | 620 pass |
616 | 621 |
617 # Anything else is an error | 622 # Anything else is an error |
618 self.add_message('invalid-slice-index', node=node) | 623 self.add_message('invalid-slice-index', node=node) |
619 | 624 |
620 def register(linter): | 625 def register(linter): |
621 """required method to auto register this checker """ | 626 """required method to auto register this checker """ |
622 linter.register_checker(TypeChecker(linter)) | 627 linter.register_checker(TypeChecker(linter)) |
OLD | NEW |