summaryrefslogtreecommitdiff
path: root/astroid/node_classes.py
Commit message (Collapse)AuthorAgeFilesLines
* Use a list to hold the statements to be filtered per node instead of keeping ↵Claudiu Popa2019-03-081-6/+8
| | | | them in a dict
* The last except handler wins when inferring variables bound in an except ↵Claudiu Popa2019-03-081-2/+14
| | | | | | handler. Close PyCQA/pylint#2777
* Avoid statement deletion in the _filter_stmts method of the LookupMixin ↵hippo912019-01-231-2/+10
| | | | | | | | | | | | | | class for PartialFunction In the case where the node is a PartialFunction and its name is the same as the current statement's name, avoid the statement deletion. The problem was that a call to a function that has been previously called vit a functools.partial was wrongly inferred. The bug comes from the _filter_stmts method of the LookupMixin class. The deletion of the current statement should not be made in the case where the node is an instance of the PartialFunction class and if the node's name is the same as the statement's name. This change also extracts PartialFunction from brain_functools into astroid.objects so that we remove a circular import problem. Close PyCQA/pylint#2588
* Add a method to the manager to retrieve the builtins moduleClaudiu Popa2019-01-191-1/+1
|
* Refactoring chained comparison (#636)hippo912019-01-131-2/+1
| | | | Reformat a chained comparison so that no more 'chained-comparison' warning is emitted from node_classe.py
* Cache the result of get_assign_nodesClaudiu Popa2018-10-101-4/+4
| | | | | | | | The result is usually static, but we're hitting this function quite a lot for big projects such as pandas. This change is a matter of compromising between the amount of memory astroid needs for analysis (e.g. storing the results in memory) vs the wasted CPU time in calling the same function over and over.
* Let formatting be handled by blackClaudiu Popa2018-10-021-1/+2
|
* Initial formatting of astroidClaudiu Popa2018-10-021-280/+418
|
* Make sure that assign nodes can find ``yield`` statements in their valuesClaudiu Popa2018-08-101-0/+3
| | | | Close PyCQA/pylint#2400
* Cut obsolete "explicit StopIteration" commentsNick Drozd2018-07-301-4/+0
| | | | The explicit StopIterations were themselves were cut in ceeee097.
* Spelling fixesVille Skyttä2018-07-241-3/+3
|
* Update the copyright noticesastroid-2.0Claudiu Popa2018-07-151-3/+18
|
* Don't allow max_inferable to be set by an environment variable.Claudiu Popa2018-07-061-1/+1
| | | | | | | | This would introduce a new method of configuring astroid & pylint, while the usual approach we used so far was to set a flag in the MANAGER itself it we'd need to customize some behaviour (extension_package_whitelist and friends). Also renamed the flag to `max_inferable_values` to be more suggestive on what it does.
* Limit inference to a maximum of 100 results at a time to preventBryce Guinta2018-07-061-1/+3
| | | | | | | | | | spot performance issues. Add new envrionment variable call ASTROID_MAX_INFERABLE to tune the max inferable amount of values at a time. Close #579 Close PyCQA/pylint#2251
* Fix inference for nested callsBryce Guinta2018-07-051-0/+2
| | | | | | | | | Add context_lookup to the context class as extra_context. Deliver the correct context with the correct boundnode for function argument nodes. Close #177
* Move operator precedence methods into NodeNGbrendanator2018-07-051-1/+58
|
* Improve as_string output of operators, elif, with, return & docsbrendanator2018-07-051-1/+1
| | | | | | | | | | | | | The precedence and associativity rules of operators are respected and parens are only wrapped around child nodes when needed A single If node inside the else block is output as `elif` Unneccesary parens in with statements are removed Unneccesary parens in tuple returns are removed Doc strings in classes and functions no longer get additional indenting
* Add missing TryExcept multi-line block field (#571)Nick Drozd2018-06-281-1/+1
| | | | This was overlooked in the initial implementation of _multi_line_block_fields.
* Fix useless-object-inheritance lint error (#573)Nick Drozd2018-06-281-2/+2
| | | See https://github.com/PyCQA/pylint/pull/2209
* Prevent Const copy resulting in recursionBryce Guinta2018-06-231-0/+11
| | | | | | | | | | | | Calling object.__new__ on a Const node would result in infinite recursion Fix infinite recursion by explicitly raising AttributeError if __getattr__ is called for value See https://nedbatchelder.com/blog/201010/surprising_getattr_recursion.html for more details Close #565
* Stop astroid from getting stuck in an infinite loopBryce Guinta2018-06-191-0/+15
| | | | | | | | Stop issue where decorators with the same name as the decorated function would cause an infinite loop This infinite recursion was caused by an oversight in name lookup which prefferred methods even if they weren't defined yet Close #375
* Simplify chained comparisonClaudiu Popa2018-06-181-1/+1
|
* Fix lintingClaudiu Popa2018-06-141-6/+6
|
* Remove methods scheduled for removalClaudiu Popa2018-06-121-29/+0
|
* Fix the itered() for dictionariesClaudiu Popa2018-06-091-1/+1
| | | | It was skipping elements and wasn't actually doing what it was supposed to do.
* Fix typoClaudiu Popa2018-06-091-1/+1
|
* Add NoChildrenMixinNick Drozd2018-06-081-56/+16
| | | | This allows consolidating all the empty get_children methods.
* Convert to yield fromNick Drozd2018-06-081-18/+10
| | | | | | | I tried this to see if it would improve performance. It didn't, but it does look nicer, so we might as well keep it. See also 5fd5aa81483e709cb5c464c7d4bb37c8c39f2afa
* Cache lookup (#552)Nick Drozd2018-06-041-0/+2
| | | This provides a significant speedup.
* Remove reraise() in favour of using raise..fromClaudiu Popa2018-05-311-15/+13
|
* kill aliases scheduled for removalClaudiu Popa2018-05-241-11/+0
|
* Add support for type comments (#548)Claudiu Popa2018-05-231-4/+25
|
* Corrected child orderAshley Whetter2018-05-051-9/+9
| | | | | | | | | | | 52e67656d7728f8ba958c9c35bef3a44013ad6dd introduced a new type of child iteration. Some classes started yielding children in the incorrect order, which was causing test failures in pylint. This change corrects the ordering to match the _astroid_fields of the class. Relates to a change from #497
* Check against astroid_fields explicitlyClaudiu Popa2018-04-251-2/+2
|
* Verify that the names exists in _other_fields before accessing themClaudiu Popa2018-04-251-1/+4
| | | | | Some nodes such as the ExceptHandler has a name object but that is an AST node, not a string. This fix prevents a crash when trying to repr() an ExceptHandler.
* Fix StopIteration raising for python3.7 (#534)HoverHell2018-04-241-3/+3
| | | | | | Because we don't support Python 2 any longer in the master branch, we can return values from generators to signal that we want to throw a StopIteration, without actually raising the StopIteration itself.
* Add MultiLineBlockMixinNick Drozd2018-03-301-183/+18
| | | | | | | | `_multi_line_block_fields` is a list of strings indicating which fields contain multi-line blocks. `_get_multi_line_blocks` dynamically accesses these attributes the first time it is called and then caches the resulting references so as to avoid repeated expensive attribute lookups.
* Improve _get_yield_nodes_skip_lambdas algorithmNick Drozd2018-03-301-11/+72
| | | | | | Yield statements can only appear in multiline bodies (like function definitions) and in lambdas, so there is no need to check other nodes for them.
* Improve _get_return_nodes_skip_functions algorithmNick Drozd2018-03-301-11/+71
| | | | | Return statements can only appear in multiline bodies (like function definitions), so there is no need to check other nodes for them.
* Improve _get_assign_nodes algorithmNick Drozd2018-03-301-6/+41
| | | | | | | Assign statements can only appear in multiline bodies (like function definitions) and in the value side of assign statements (e.g. `b = 4` is an assign node contained in `a = b = 4`), so there is no need to check other nodes for them.
* add qname to Unknown node to avoid error in pylintBryce Guinta2018-03-261-0/+4
|
* Add name attribute to Unknown classBryce Guinta2018-03-261-0/+1
| | | | | | This allows .root().name calls to work for Unknown objects Close #523
* Revert "Move FrozenSet to node_classes so it is accessible"Bryce Guinta2018-03-111-15/+0
| | | | This reverts commit 06273cd07d4b3701998df7b2c656d1b029bdee8e.
* Move FrozenSet to node_classes so it is accessibleBryce Guinta2018-03-111-0/+15
| | | | importing astroid.objects causes curcular imports with manager
* Add type-specific nodes_of_classNick Drozd2018-03-021-2/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | nodes_of_class is a very flexible method, which is great for use in client code (e.g. Pylint). However, that flexibility requires a great deal of runtime type checking: def nodes_of_class(self, klass, skip_klass=None): if isinstance(self, klass): yield self if skip_klass is None: for child_node in self.get_children(): for matching in child_node.nodes_of_class(klass, skip_klass): yield matching return for child_node in self.get_children(): if isinstance(child_node, skip_klass): continue for matching in child_node.nodes_of_class(klass, skip_klass): yield matching First, the node has to check its own type to see whether it's of the desired class. Then the skip_klass flag has to be checked to see whether anything needs to be skipped. If so, the type of every yielded node has to be check to see if it should be skipped. This is fine for calling code whose arguments can't be known in advance ("Give me all the Assign and ClassDef nodes, but skip all the BinOps, YieldFroms, and Globals."), but in Astroid itself, every call to this function can be known in advance. There's no need to do any type checking if all the nodes know how to respond to certain requests. Take get_assign_nodes for example. The Assign nodes know that they should yield themselves and then yield their Assign children. Other nodes know in advance that they aren't Assign nodes, so they don't need to check their own type, just immediately yield their Assign children. Overly specific functions like get_yield_nodes_skip_lambdas certainly aren't very elegant, but the tradeoff is to take advantage of knowing how the library code works to improve speed.
* Move nodes_of_class null check out of inner loopNick Drozd2018-03-021-1/+9
| | | | The check was being repeated unnecessarily in a tight loop.
* Add type-specific get_childrenNick Drozd2018-03-021-8/+222
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | get_children is elegant and flexible and slow. def get_children(self): for field in self._astroid_fields: attr = getattr(self, field) if attr is None: continue if isinstance(attr, (list, tuple)): for elt in attr: yield elt else: yield attr It iterates over a list, dynamically accesses attributes, does null checks, and does type checking. This function gets called a lot, and all that extra work is a real drag on performance. In most cases there isn't any need to do any of these checks. Take an Assign node for instance: def get_children(self): for elt in self.targets: yield elt yield self.value It's known in advance that Assign nodes have a list of targets and a value, so just yield those without checking anything.
* Fix lint errorsBryce Guinta2018-02-261-2/+2
|
* Remove Python 2 branches, assume we always run on Python 3Claudiu Popa2018-02-211-89/+47
|
* Make Unknown a rhs assignable nodeClaudiu Popa2017-12-151-1/+1
| | | | This means we can put an Unknown node in RHS of an assignment operations, which will be useful for brain related transforms.