def pyls_hover(document, position): definitions = document.jedi_script(position).goto_definitions() word = document.word_at_position(position) if LooseVersion(_utils.JEDI_VERSION) >= LooseVersion('0.15.0'): # Find first exact matching definition definition = next((x for x in definitions if x.name == word), None) if not definition: return {'contents': ''} # raw docstring returns only doc, without signature doc = _utils.format_docstring(definition.docstring(raw=True)) # Find first exact matching signature signature = next((x.to_string() for x in definition.get_signatures() if x.name == word), '') contents = [] if signature: contents.append({ 'language': 'python', 'value': signature, }) if doc: contents.append(doc) if not contents: return {'contents': ''} return {'contents': contents} else: # Find an exact match for a completion for d in definitions: if d.name == word: return {'contents': _utils.format_docstring(d.docstring()) or ''} return {'contents': ''}
def _format_completion(d, include_params=True): completion = { 'label': _label(d), 'kind': _TYPE_MAP.get(d.type), 'detail': _detail(d), 'documentation': _utils.format_docstring(d.docstring()), 'sortText': _sort_text(d), 'insertText': d.name } if include_params and hasattr(d, 'params') and d.params: positional_args = [ param for param in d.params if '=' not in param.description ] # For completions with params, we can generate a snippet instead completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet snippet = d.name + '(' for i, param in enumerate(positional_args): snippet += '${%s:%s}' % (i + 1, param.name) if i < len(positional_args) - 1: snippet += ', ' snippet += ')$0' completion['insertText'] = snippet return completion
def pyls_signature_help(document, position): signatures = document.jedi_script(position).call_signatures() if not signatures: return {'signatures': []} s = signatures[0] # Docstring contains one or more lines of signature, followed by empty line, followed by docstring function_sig_lines = (s.docstring().split('\n\n') or [''])[0].splitlines() function_sig = ' '.join([line.strip() for line in function_sig_lines]) sig = { 'label': function_sig, 'documentation': _utils.format_docstring(s.docstring(raw=True)) } # If there are params, add those if s.params: sig['parameters'] = [{ 'label': p.name, 'documentation': _param_docs(s.docstring(), p.name) } for p in s.params] # We only return a single signature because Python doesn't allow overloading sig_info = {'signatures': [sig], 'activeSignature': 0} if s.index is not None and s.params: # Then we know which parameter we're looking at sig_info['activeParameter'] = s.index return sig_info
def pyls_signature_help(document, position): signatures = document.jedi_script(position).call_signatures() if not signatures: return {'signatures': []} s = signatures[0] sig = { 'label': s.docstring().splitlines()[0], 'documentation': _utils.format_docstring(s.docstring(raw=True)) } # If there are params, add those if s.params: sig['parameters'] = [{ 'label': p.name, 'documentation': _param_docs(s.docstring(), p.name) } for p in s.params] # We only return a single signature because Python doesn't allow overloading sig_info = {'signatures': [sig], 'activeSignature': 0} if s.index is not None and s.params: # Then we know which parameter we're looking at sig_info['activeParameter'] = s.index return sig_info
def pyls_hover(document, position): definitions = document.jedi_script(position).goto_definitions() word = document.word_at_position(position) # Find first exact matching definition definition = next((x for x in definitions if x.name == word), None) if not definition: return {'contents': ''} # raw docstring returns only doc, without signature doc = _utils.format_docstring(definition.docstring(raw=True)) # Find first exact matching signature signature = next((x.to_string() for x in definition.get_signatures() if x.name == word), '') contents = [] if signature: contents.append({ 'language': 'python', 'value': signature, }) if doc: contents.append(doc) if not contents: return {'contents': ''} return {'contents': contents}
def pyls_completions(config, document, position): definitions = document.jedi_script(position).completions() if not definitions: return None settings = config.plugin_settings('jedi_completion', document_path=document.path) include_params = settings.get('include_params', True) completions = [] for d in definitions: completion = { 'label': _label(d), 'kind': _kind(d), 'detail': _detail(d), 'documentation': _utils.format_docstring(d.docstring()), 'sortText': _sort_text(d), 'insertText': d.name } if include_params and hasattr(d, 'params') and d.params: # For completions with params, we can generate a snippet instead completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet snippet = d.name + '(' for i, param in enumerate(d.params): snippet += '${%s:%s}' % (i + 1, param.name) if i < len(d.params) - 1: snippet += ', ' snippet += ')$0' completion['insertText'] = snippet completions.append(completion) return completions or None
def pyls_completions(document, position): definitions = document.jedi_script(position).completions() return [{ 'label': _label(d), 'kind': _kind(d), 'detail': _detail(d), 'documentation': _utils.format_docstring(d.docstring()), 'sortText': _sort_text(d), 'insertText': d.name } for d in definitions] or None
def pyls_hover(document, position): definitions = document.jedi_script(position).goto_definitions() word = document.word_at_position(position) # Find an exact match for a completion for d in definitions: if d.name == word: return {'contents': _utils.format_docstring(d.docstring()) or ''} return {'contents': ''}
def pyls_hover(document, position): definitions = document.jedi_script(position).goto_definitions() word = document.word_at_position(position) if LooseVersion(_utils.JEDI_VERSION) >= LooseVersion('0.15.0'): # Find first exact matching definition definition = next((x for x in definitions if x.name == word), None) # Ensure a definition is used if only one is available # even if the word doesn't match. An example of this case is 'np' # where 'numpy' doesn't match with 'np'. Same for NumPy ufuncs if len(definitions) == 1: definition = definitions[0] if not definition: return {'contents': ''} # raw docstring returns only doc, without signature doc = _utils.format_docstring(definition.docstring(raw=True)) # Find first exact matching signature signature = next((x.to_string() for x in definition.get_signatures() if x.name == word), '') contents = [] if signature: contents.append({ 'language': 'python', 'value': signature, }) if doc: contents.append(doc) if not contents: return {'contents': ''} return {'contents': contents} else: # Find an exact match for a completion for d in definitions: if d.name == word: return {'contents': _utils.format_docstring(d.docstring()) or ''} return {'contents': ''}
def pyls_completions(document, position): log.debug('Launching Jedi') definitions = document.jedi_script(position).completions() definitions = [{ 'label': _label(d), 'kind': _kind(d), 'detail': _detail(d), 'documentation': _utils.format_docstring(d.docstring()), 'sortText': _sort_text(d), 'insertText': d.name } for d in definitions] log.debug('Jedi finished') return definitions
def _format_completion(d, include_params=True): completion = { 'label': _label(d), 'kind': _TYPE_MAP.get(d.type), 'detail': _detail(d), 'documentation': _utils.format_docstring(d.docstring()), 'sortText': _sort_text(d), 'insertText': d.name } if d.type == 'path': path = osp.normpath(d.name) path = path.replace('\\', '\\\\') path = path.replace('/', '\\/') completion['insertText'] = path sig = d.get_signatures() if (include_params and sig and not is_exception_class(d.name)): positional_args = [ param for param in sig[0].params if '=' not in param.description and param.name not in {'/', '*'} ] if len(positional_args) > 1: # For completions with params, we can generate a snippet instead completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet snippet = d.name + '(' for i, param in enumerate(positional_args): snippet += '${%s:%s}' % (i + 1, param.name) if i < len(positional_args) - 1: snippet += ', ' snippet += ')$0' completion['insertText'] = snippet elif len(positional_args) == 1: completion['insertTextFormat'] = lsp.InsertTextFormat.Snippet completion['insertText'] = d.name + '($0)' else: completion['insertText'] = d.name + '()' return completion
def pyls_hover(document, position): code_position = _utils.position_to_jedi_linecolumn(document, position) definitions = document.jedi_script().infer(**code_position) word = document.word_at_position(position) # Find first exact matching definition definition = next((x for x in definitions if x.name == word), None) # Ensure a definition is used if only one is available # even if the word doesn't match. An example of this case is 'np' # where 'numpy' doesn't match with 'np'. Same for NumPy ufuncs if len(definitions) == 1: definition = definitions[0] if not definition: return {'contents': ''} # raw docstring returns only doc, without signature doc = _utils.format_docstring(definition.docstring(raw=True)) # Find first exact matching signature signature = next( (x.to_string() for x in definition.get_signatures() if x.name == word), '') contents = [] if signature: contents.append({ 'language': 'python', 'value': signature, }) if doc: contents.append(doc) if not contents: return {'contents': ''} return {'contents': contents}