summaryrefslogtreecommitdiff
path: root/astroid
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2015-09-25 00:33:02 +0300
committerClaudiu Popa <pcmanticore@gmail.com>2015-09-25 00:33:02 +0300
commita4b0f48f73cb166aa9fb8ca273f17e614ba65ccb (patch)
tree8ad8063be6b521cd9fa4ad5fd504e483b023cf11 /astroid
parent3416d7889642ac9f12af981b9bc27c1d1fdfcec5 (diff)
downloadastroid-a4b0f48f73cb166aa9fb8ca273f17e614ba65ccb.tar.gz
Fix a crash when inferring subscripts which returned the same object all the time.
Diffstat (limited to 'astroid')
-rw-r--r--astroid/inference.py9
-rw-r--r--astroid/tests/unittest_inference.py15
2 files changed, 20 insertions, 4 deletions
diff --git a/astroid/inference.py b/astroid/inference.py
index 148c8cd..db80e43 100644
--- a/astroid/inference.py
+++ b/astroid/inference.py
@@ -227,6 +227,7 @@ def _slice_value(index, context=None):
return _SLICE_SENTINEL
+@bases.raise_if_nothing_inferred
def infer_subscript(self, context=None):
"""Inference for subscripts
@@ -276,7 +277,7 @@ def infer_subscript(self, context=None):
yield inferred
nodes.Subscript._infer = bases.path_wrapper(infer_subscript)
-nodes.Subscript.infer_lhs = bases.raise_if_nothing_inferred(infer_subscript)
+nodes.Subscript.infer_lhs = infer_subscript
@bases.raise_if_nothing_inferred
@@ -388,6 +389,7 @@ def _infer_unaryop(self, context=None):
yield util.YES
+@bases.raise_if_nothing_inferred
@bases.path_wrapper
def infer_unaryop(self, context=None):
"""Infer what an UnaryOp should return when evaluated."""
@@ -395,7 +397,7 @@ def infer_unaryop(self, context=None):
exceptions.UnaryOperationError)
nodes.UnaryOp._infer_unaryop = _infer_unaryop
-nodes.UnaryOp._infer = bases.raise_if_nothing_inferred(infer_unaryop)
+nodes.UnaryOp._infer = infer_unaryop
def _is_not_implemented(const):
@@ -600,13 +602,14 @@ def _infer_binop(self, context):
yield result
+@bases.yes_if_nothing_inferred
@bases.path_wrapper
def infer_binop(self, context=None):
return _filter_operation_errors(self, _infer_binop, context,
exceptions.BinaryOperationError)
nodes.BinOp._infer_binop = _infer_binop
-nodes.BinOp._infer = bases.yes_if_nothing_inferred(infer_binop)
+nodes.BinOp._infer = infer_binop
def _infer_augassign(self, context=None):
diff --git a/astroid/tests/unittest_inference.py b/astroid/tests/unittest_inference.py
index bc75f9d..ef0886f 100644
--- a/astroid/tests/unittest_inference.py
+++ b/astroid/tests/unittest_inference.py
@@ -30,6 +30,7 @@ from astroid.builder import parse
from astroid.inference import infer_end as inference_infer_end
from astroid.bases import Instance, BoundMethod, UnboundMethod,\
path_wrapper, BUILTINS
+from astroid import helpers
from astroid import objects
from astroid import test_utils
from astroid import util
@@ -2961,7 +2962,19 @@ class InferenceTest(resources.SysPathSetup, unittest.TestCase):
author = next(inferred.igetattr('author'))
self.assertIsInstance(author, nodes.Const)
self.assertEqual(author.value, 'Rushdie')
-
+
+ def test_subscript_inference_error(self):
+ # Used to raise StopIteration
+ ast_node = test_utils.extract_node('''
+ class AttributeDict(dict):
+ def __getitem__(self, name):
+ return self
+ flow = AttributeDict()
+ flow['app'] = AttributeDict()
+ flow['app']['config'] = AttributeDict()
+ flow['app']['config']['doffing'] = AttributeDict() #@
+ ''')
+ self.assertIsNone(helpers.safe_infer(ast_node.targets[0]))
class GetattrTest(unittest.TestCase):