Commit d47a25b5 authored by Tzer-jen Wei's avatar Tzer-jen Wei

code clean up, add dict, list, tuple annotations

parent c2737309
...@@ -7,17 +7,11 @@ from __future__ import absolute_import ...@@ -7,17 +7,11 @@ from __future__ import absolute_import
from io import open from io import open
from collections import defaultdict from collections import defaultdict
from itertools import chain from itertools import chain
import re
import jedi import jedi
if list(map(int, re.findall('[0-9]+', jedi.__version__ or '0'))) >= [0, 9, 0]: from jedi.parser.tree import Module, ImportName
__jedi_version__ = 9 from jedi.evaluate.representation import Function, Instance, Class
from jedi.parser.tree import Module, Module as Import from jedi.evaluate.iterable import Array,Generator, GeneratorComprehension
from jedi.evaluate.representation import Function, Instance
else:
__jedi_version__ = 8
from jedi import Script
from jedi.parser.representation import Function, Module, Import
from Cython.Utils import open_source_file from Cython.Utils import open_source_file
...@@ -36,53 +30,39 @@ def analyse(source_path=None, code=None): ...@@ -36,53 +30,39 @@ def analyse(source_path=None, code=None):
if not source_path and code is None: if not source_path and code is None:
raise ValueError("Either 'source_path' or 'code' is required.") raise ValueError("Either 'source_path' or 'code' is required.")
scoped_names = {} scoped_names = {}
if __jedi_version__ == 8: statement_iter = jedi.names(source=code, path=source_path, all_scopes=True)
script = Script(source=code, path=source_path)
evaluator = script._evaluator
statement_iter = chain.from_iterable(script._parser.module().used_names.values())
else:
statement_iter = jedi.names(source=code, path=source_path, all_scopes=True)
for statement in statement_iter: for statement in statement_iter:
if __jedi_version__ == 8: parent = statement.parent()
parent = scope = statement.parent scope = parent._definition
while not isinstance(scope, (Function, Module)): evaluator = statement._evaluator
parent = scope = scope.parent
# hack: work around current Jedi problem with global module variables # skip function/generator definitions, class definitions, and module imports
if not hasattr(scope, 'scope_names_generator'): if any(isinstance(statement._definition, t) for t in [Function, Class, ImportName]):
continue continue
statement_names = statement.get_defined_names()
if not statement_names:
continue
else:
parent = statement.parent()
scope = parent._definition
evaluator = statement._evaluator
# original jedi-typer does not handle function definitions, so skip here as well
if isinstance(statement._definition, Function):
continue
statement_names = [statement.name]
key = (None if isinstance(scope, Module) else str(parent.name), scope.start_pos) key = (None if isinstance(scope, Module) else str(parent.name), scope.start_pos)
try: try:
names = scoped_names[key] names = scoped_names[key]
except KeyError: except KeyError:
names = scoped_names[key] = defaultdict(set) names = scoped_names[key] = defaultdict(set)
for name in statement_names:
for name_type in evaluator.find_types(scope, name, search_global=True): for name_type in evaluator.find_types(scope, statement.name, search_global=True):
if isinstance(name_type, Import): if isinstance(name_type, Instance):
if isinstance(name_type.base, Class):
type_name = 'object' type_name = 'object'
else: else:
try: type_name = name_type.base.obj.__name__
if __jedi_version__ == 8: elif isinstance(name_type, Array):
type_name = name_type.name type_name = name_type.type
else: elif isinstance(name_type, GeneratorComprehension):
if isinstance(name_type, Instance): type_name = None
type_name = name_type.base.obj.__name__ else:
else: try:
type_name = type(name_type.obj).__name__ type_name = type(name_type.obj).__name__
except AttributeError as error: except AttributeError as error:
print(error) type_name = None
type_name = 'object' if type_name is not None:
names[str(name)].add(type_name) names[str(statement.name)].add(type_name)
return scoped_names return scoped_names
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment