diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index f09e9204..a566d1a6 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -32,7 +32,7 @@ from jedi.evaluate import Evaluator, filter_private_variable from jedi.evaluate import representation as er from jedi.evaluate import compiled from jedi.evaluate import imports -from jedi.evaluate.helpers import FakeName +from jedi.evaluate.helpers import FakeName, get_module_name_parts from jedi.evaluate.finder import get_names_of_scope from jedi.evaluate.helpers import search_call_signatures from jedi.evaluate import analysis @@ -688,6 +688,14 @@ def defined_names(source, path=None, encoding='utf-8'): return classes.defined_names(Evaluator(), parser.module) +def _names(source=None, path=None, encoding='utf-8'): + # Set line/column to a random position, because they don't matter. + script = Script(source, line=1, column=0, path=path, encoding=encoding) + defs = [classes.Definition(script._evaluator, name_part) + for name_part in get_module_name_parts(script._parser.module())] + return sorted(defs, key=lambda x: (x.line, x.column)) + + def preload_module(*modules): """ Preloading modules tells Jedi to load a module now, instead of lazy parsing diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 924f5ef8..7601e4e9 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -309,6 +309,19 @@ class BaseDefinition(object): return '.'.join(path if path[0] else path[1:]) + def goto_assignments(self): + if not isinstance(self._definition, pr.NamePart): + raise TypeError('Definition is not a NamePart.') + + if self.type not in ('statement', 'import'): + # Functions, classes and modules are already fixed definitions, we + # cannot follow them anymore. + return [self] + stmt_or_imp = self._definition.parent.parent + + names, _ = self._evaluator.goto(stmt_or_imp, [self._definition]) + return [Definition(self._evaluator, n) for n in names] + @memoize_default() def _follow_statements_imports(self): """ diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index cb61441c..034c730e 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -191,6 +191,10 @@ def scan_statement_for_calls(stmt, search_name, assignment_details=False): def get_module_name_parts(module): + """ + Returns a dictionary with name parts as keys and their call paths as + values. + """ def scope_name_parts(scope): for s in scope.subscopes: # Yield the name parts, not names.