diff --git a/jedi/api/classes.py b/jedi/api/classes.py index b7aaadd3..0456e7c3 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -523,6 +523,12 @@ class BaseDefinition(object): """ return self._name.infer().get_type_hint() + def is_side_effect(self): + tree_name = self._name.tree_name + if tree_name is None: + return False + return tree_name.parent.type == 'trailer' + class Completion(BaseDefinition): """ diff --git a/test/test_api/test_names.py b/test/test_api/test_names.py index 8b1c731e..3d1ed07c 100644 --- a/test/test_api/test_names.py +++ b/test/test_api/test_names.py @@ -4,6 +4,8 @@ Tests for `api.names`. from textwrap import dedent +import pytest + def _assert_definition_names(definitions, names): assert [d.name for d in definitions] == names @@ -167,3 +169,20 @@ def test_no_error(get_names): assert b.name == 'b' assert a20.name == 'a' assert a20.goto() == [a20] + + +@pytest.mark.parametrize( + 'code, index, is_side_effect', [ + ('x', 0, False), + ('x.x', 0, False), + ('x.x', 1, True), + ('def x(x): x.x', 1, False), + ('def x(x): x.x', 3, True), + ('import sys; sys.path', 0, False), + ('import sys; sys.path', 1, False), + ('import sys; sys.path', 2, True), + ] +) +def test_is_side_effect(get_names, code, index, is_side_effect): + names = get_names(code, references=True, all_scopes=True) + assert names[index].is_side_effect() == is_side_effect