mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 06:44:46 +08:00
Sort completions by input resemblance. (#2018)
* Sort completions by input resemblance. Fixes #2017 * Clean code
This commit is contained in:
@@ -65,6 +65,7 @@ Code Contributors
|
|||||||
- Márcio Mazza (@marciomazza)
|
- Márcio Mazza (@marciomazza)
|
||||||
- Martin Vielsmaier (@moser) <martin@vielsmaier.net>
|
- Martin Vielsmaier (@moser) <martin@vielsmaier.net>
|
||||||
- TingJia Wu (@WutingjiaX) <wutingjia@bytedance.com>
|
- TingJia Wu (@WutingjiaX) <wutingjia@bytedance.com>
|
||||||
|
- Nguyễn Hồng Quân <ng.hong.quan@gmail.com>
|
||||||
|
|
||||||
And a few more "anonymous" contributors.
|
And a few more "anonymous" contributors.
|
||||||
|
|
||||||
|
|||||||
@@ -138,6 +138,11 @@ class Completion:
|
|||||||
|
|
||||||
self._fuzzy = fuzzy
|
self._fuzzy = fuzzy
|
||||||
|
|
||||||
|
# Return list of completions in this order:
|
||||||
|
# - Beginning with what user is typing
|
||||||
|
# - Public (alphabet)
|
||||||
|
# - Private ("_xxx")
|
||||||
|
# - Dunder ("__xxx")
|
||||||
def complete(self):
|
def complete(self):
|
||||||
leaf = self._module_node.get_leaf_for_position(
|
leaf = self._module_node.get_leaf_for_position(
|
||||||
self._original_position,
|
self._original_position,
|
||||||
@@ -176,7 +181,8 @@ class Completion:
|
|||||||
return (
|
return (
|
||||||
# Removing duplicates mostly to remove False/True/None duplicates.
|
# Removing duplicates mostly to remove False/True/None duplicates.
|
||||||
_remove_duplicates(prefixed_completions, completions)
|
_remove_duplicates(prefixed_completions, completions)
|
||||||
+ sorted(completions, key=lambda x: (x.name.startswith('__'),
|
+ sorted(completions, key=lambda x: (not x.name.startswith(self._like_name),
|
||||||
|
x.name.startswith('__'),
|
||||||
x.name.startswith('_'),
|
x.name.startswith('_'),
|
||||||
x.name.lower()))
|
x.name.lower()))
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -321,10 +321,19 @@ def test_docstrings_for_completions(Script):
|
|||||||
assert isinstance(c.docstring(), str)
|
assert isinstance(c.docstring(), str)
|
||||||
|
|
||||||
|
|
||||||
|
def test_completions_order_most_resemblance_on_top(Script):
|
||||||
|
"""Test that the completion which resembles the in-typing the most will come first."""
|
||||||
|
code = "from pathlib import Path\npath = Path('hello.txt')\n\npat"
|
||||||
|
script = Script(code)
|
||||||
|
# User is typing "pat" and "path" is closer to it than "Path".
|
||||||
|
assert ['path', 'Path'] == [comp.name for comp in script.complete()]
|
||||||
|
|
||||||
|
|
||||||
def test_fuzzy_completion(Script):
|
def test_fuzzy_completion(Script):
|
||||||
script = Script('string = "hello"\nstring.upper')
|
script = Script('string = "hello"\nstring.upper')
|
||||||
assert ['isupper',
|
# 'isupper' is included because it is fuzzily matched.
|
||||||
'upper'] == [comp.name for comp in script.complete(fuzzy=True)]
|
assert ['upper',
|
||||||
|
'isupper'] == [comp.name for comp in script.complete(fuzzy=True)]
|
||||||
|
|
||||||
|
|
||||||
def test_math_fuzzy_completion(Script, environment):
|
def test_math_fuzzy_completion(Script, environment):
|
||||||
|
|||||||
Reference in New Issue
Block a user