From d8090cfa0aac8984bc97f95308184e976cffdd7a Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 7 Nov 2018 01:20:39 +0100 Subject: [PATCH] Start implementing get_signatures --- jedi/api/__init__.py | 5 +++-- jedi/api/classes.py | 5 +++-- jedi/evaluate/base_context.py | 3 +++ jedi/evaluate/context/function.py | 7 +++++++ jedi/evaluate/context/instance.py | 3 +++ jedi/evaluate/context/klass.py | 6 ++++++ 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 06721810..f33cfb20 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -345,11 +345,12 @@ class Script(object): ) debug.speed('func_call followed') - return [classes.CallSignature(self._evaluator, d.name, + return [classes.CallSignature(self._evaluator, signature, call_signature_details.bracket_leaf.start_pos, call_signature_details.call_index, call_signature_details.keyword_name_str) - for d in definitions if hasattr(d, 'py__call__')] + for d in definitions + for signature in d.get_signatures()] def _analysis(self): self._evaluator.is_analysis = True diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 9e54421c..2bc0f60d 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -600,11 +600,12 @@ class CallSignature(Definition): It knows what functions you are currently in. e.g. `isinstance(` would return the `isinstance` function. without `(` it would return nothing. """ - def __init__(self, evaluator, executable_name, bracket_start_pos, index, key_name_str): - super(CallSignature, self).__init__(evaluator, executable_name) + def __init__(self, evaluator, signature, bracket_start_pos, index, key_name_str): + super(CallSignature, self).__init__(evaluator, signature.name) self._index = index self._key_name_str = key_name_str self._bracket_start_pos = bracket_start_pos + self._signature = signature @property def index(self): diff --git a/jedi/evaluate/base_context.py b/jedi/evaluate/base_context.py index daba9639..277c5692 100644 --- a/jedi/evaluate/base_context.py +++ b/jedi/evaluate/base_context.py @@ -131,6 +131,9 @@ class Context(HelperContextMixin, BaseContext): ) return NO_CONTEXTS + def get_signatures(self): + return [] + def is_class(self): return False diff --git a/jedi/evaluate/context/function.py b/jedi/evaluate/context/function.py index bee7899b..ce7419b1 100644 --- a/jedi/evaluate/context/function.py +++ b/jedi/evaluate/context/function.py @@ -9,6 +9,7 @@ from jedi.evaluate import docstrings from jedi.evaluate import pep0484 from jedi.evaluate import flow_analysis from jedi.evaluate import helpers +from jedi.evaluate.signature import TreeSignature from jedi.evaluate.arguments import AnonymousArguments from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \ ContextName, AbstractNameDefinition, ParamName @@ -135,6 +136,9 @@ class FunctionContext(use_metaclass(CachedMetaClass, FunctionMixin, TreeContext) def get_matching_functions(self, arguments): yield self + def get_signatures(self): + return [TreeSignature(self)] + class MethodContext(FunctionContext): def __init__(self, evaluator, class_context, *args, **kwargs): @@ -365,6 +369,9 @@ class OverloadedFunctionContext(FunctionMixin, ContextWrapper): debug.dbg("Overloading no match: %s@%s (%s)", signature, f.tree_node.start_pos[0], arguments, color='BLUE') + def get_signatures(self): + return [TreeSignature(f) for f in self.overloaded_functions] + def signature_matches(function_context, arguments): unpacked_arguments = arguments.unpack() diff --git a/jedi/evaluate/context/instance.py b/jedi/evaluate/context/instance.py index 99bdd3fd..2869e1e7 100644 --- a/jedi/evaluate/context/instance.py +++ b/jedi/evaluate/context/instance.py @@ -420,6 +420,9 @@ class BoundMethod(FunctionMixin, ContextWrapper): else: yield BoundMethod(self.instance, self.class_context, func) + def get_signatures(self): + return [sig.bind() for sig in self._wrapped_context.get_signatures()] + def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self._wrapped_context) diff --git a/jedi/evaluate/context/klass.py b/jedi/evaluate/context/klass.py index 0475d67e..1325ab1b 100644 --- a/jedi/evaluate/context/klass.py +++ b/jedi/evaluate/context/klass.py @@ -301,3 +301,9 @@ class ClassContext(use_metaclass(CachedMetaClass, ClassMixin, TreeContext)): given_types=tuple(remap_type_vars()) ) return self + + def get_signatures(self): + init_funcs = self.py__getattribute__('__init__') + return [ + s for f in init_funcs for s in f.get_signatures() + ]