Skip to content

Commit

Permalink
filter imported names during completion
Browse files Browse the repository at this point in the history
  • Loading branch information
wutingjia committed Oct 16, 2024
1 parent d2bef68 commit c962f4d
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
21 changes: 16 additions & 5 deletions jedi/api/completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def filter_names(inference_state, completion_names, stack, like_name, fuzzy, imp
like_name = like_name.lower()
for name in completion_names:
string = name.string_name
if string in imported_names:
if string in imported_names and string != like_name:
continue
if settings.case_insensitive_completion:
string = string.lower()
Expand Down Expand Up @@ -172,10 +172,8 @@ def complete(self):
cached_name, completion_names = self._complete_python(leaf)

imported_names = []
if leaf.parent is not None and leaf.parent.type == 'import_as_names':
for child in leaf.parent.children:
if child.type == 'name':
imported_names.append(child.value)
if leaf.parent is not None and leaf.parent.type in ['import_as_names', 'dotted_as_names']:
imported_names.extend(extract_imported_names(leaf.parent))

completions = list(filter_names(self._inference_state, completion_names,
self.stack, self._like_name,
Expand Down Expand Up @@ -672,3 +670,16 @@ def search_in_module(inference_state, module_context, names, wanted_names,
def_ = classes.Name(inference_state, n2)
if not wanted_type or wanted_type == def_.type:
yield def_


def extract_imported_names(node):
imported_names = []

if node.type in ['import_as_names', 'dotted_as_names', 'import_as_name']:
for child in node.children:
if child.type == 'name':
imported_names.append(child.value)
elif child.type == 'import_as_name':
imported_names.extend(extract_imported_names(child))

return imported_names
18 changes: 18 additions & 0 deletions test/test_inference/test_imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,24 @@ def import_names(*args, **kwargs):
assert 'path' in import_names(s, column=len(s) - 3)


def test_duplicated_import(Script):
def import_names(*args, **kwargs):
return [d.name for d in Script(*args).complete(**kwargs)]

s = 'import os, o'
assert 'os' not in import_names(s)
assert 'os' in import_names(s, column=len(s) - 3)

s = 'from os import path, p'
assert 'path' not in import_names(s)
assert 'path' in import_names(s, column=len(s) - 3)

s = 'import path as pp, p'
assert 'path' not in import_names(s)

s = 'from os import path as pp, p'
assert 'path' not in import_names(s)

def test_path_issues(Script):
"""
See pull request #684 for details.
Expand Down

0 comments on commit c962f4d

Please sign in to comment.