adding completion support, and remove some debug prints
This commit is contained in:
parent
18645522d2
commit
a6286c15e1
@ -4,6 +4,9 @@
|
|||||||
[![image](https://img.shields.io/pypi/v/pylspclient.svg)](https://pypi.org/project/pylspclient/)
|
[![image](https://img.shields.io/pypi/v/pylspclient.svg)](https://pypi.org/project/pylspclient/)
|
||||||
[![Build Status](https://travis-ci.org/yeger00/pylspclient.svg?branch=master)](https://travis-ci.org/yeger00/pylspclient)
|
[![Build Status](https://travis-ci.org/yeger00/pylspclient.svg?branch=master)](https://travis-ci.org/yeger00/pylspclient)
|
||||||
|
|
||||||
|
# What is LSP?
|
||||||
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
```
|
```
|
||||||
pip install pylspclient
|
pip install pylspclient
|
||||||
|
@ -46,7 +46,6 @@ class JsonRpcEndpoint(object):
|
|||||||
:param dict message: The message to send.
|
:param dict message: The message to send.
|
||||||
'''
|
'''
|
||||||
json_string = json.dumps(message, cls=MyEncoder)
|
json_string = json.dumps(message, cls=MyEncoder)
|
||||||
print("sending:", json_string)
|
|
||||||
jsonrpc_req = self.__add_header(json_string)
|
jsonrpc_req = self.__add_header(json_string)
|
||||||
with self.write_lock:
|
with self.write_lock:
|
||||||
self.stdin.write(jsonrpc_req.encode())
|
self.stdin.write(jsonrpc_req.encode())
|
||||||
@ -63,7 +62,6 @@ class JsonRpcEndpoint(object):
|
|||||||
line = self.stdout.readline()
|
line = self.stdout.readline()
|
||||||
if not line:
|
if not line:
|
||||||
return None
|
return None
|
||||||
print(line)
|
|
||||||
line = line.decode()
|
line = line.decode()
|
||||||
# TODO: handle content type as well.
|
# TODO: handle content type as well.
|
||||||
match = re.match(JSON_RPC_RES_REGEX, line)
|
match = re.match(JSON_RPC_RES_REGEX, line)
|
||||||
|
@ -102,7 +102,7 @@ class LspClient(object):
|
|||||||
The goto definition request is sent from the client to the server to resolve the definition location of a symbol at a given text document position.
|
The goto definition request is sent from the client to the server to resolve the definition location of a symbol at a given text document position.
|
||||||
|
|
||||||
:param TextDocumentItem textDocument: The text document.
|
:param TextDocumentItem textDocument: The text document.
|
||||||
:param Position position: The position inside the text document..
|
:param Position position: The position inside the text document.
|
||||||
"""
|
"""
|
||||||
result_dict = self.lsp_endpoint.call_method("textDocument/definition", textDocument=textDocument, position=position)
|
result_dict = self.lsp_endpoint.call_method("textDocument/definition", textDocument=textDocument, position=position)
|
||||||
return [lsp_structs.Location(**l) for l in result_dict]
|
return [lsp_structs.Location(**l) for l in result_dict]
|
||||||
@ -113,7 +113,7 @@ class LspClient(object):
|
|||||||
The goto type definition request is sent from the client to the server to resolve the type definition location of a symbol at a given text document position.
|
The goto type definition request is sent from the client to the server to resolve the type definition location of a symbol at a given text document position.
|
||||||
|
|
||||||
:param TextDocumentItem textDocument: The text document.
|
:param TextDocumentItem textDocument: The text document.
|
||||||
:param Position position: The position inside the text document..
|
:param Position position: The position inside the text document.
|
||||||
"""
|
"""
|
||||||
result_dict = self.lsp_endpoint.call_method("textDocument/definition", textDocument=textDocument, position=position)
|
result_dict = self.lsp_endpoint.call_method("textDocument/definition", textDocument=textDocument, position=position)
|
||||||
return [lsp_structs.Location(**l) for l in result_dict]
|
return [lsp_structs.Location(**l) for l in result_dict]
|
||||||
@ -124,7 +124,23 @@ class LspClient(object):
|
|||||||
The signature help request is sent from the client to the server to request signature information at a given cursor position.
|
The signature help request is sent from the client to the server to request signature information at a given cursor position.
|
||||||
|
|
||||||
:param TextDocumentItem textDocument: The text document.
|
:param TextDocumentItem textDocument: The text document.
|
||||||
:param Position position: The position inside the text document..
|
:param Position position: The position inside the text document.
|
||||||
"""
|
"""
|
||||||
result_dict = self.lsp_endpoint.call_method("textDocument/signatureHelp", textDocument=textDocument, position=position)
|
result_dict = self.lsp_endpoint.call_method("textDocument/signatureHelp", textDocument=textDocument, position=position)
|
||||||
return lsp_structs.SignatureHelp(**result_dict)
|
return lsp_structs.SignatureHelp(**result_dict)
|
||||||
|
|
||||||
|
|
||||||
|
def completion(self, textDocument, position, context):
|
||||||
|
"""
|
||||||
|
The signature help request is sent from the client to the server to request signature information at a given cursor position.
|
||||||
|
|
||||||
|
:param TextDocumentItem textDocument: The text document.
|
||||||
|
:param Position position: The position inside the text document.
|
||||||
|
:param CompletionContext context: The completion context. This is only available if the client specifies
|
||||||
|
to send this using `ClientCapabilities.textDocument.completion.contextSupport === true`
|
||||||
|
"""
|
||||||
|
result_dict = self.lsp_endpoint.call_method("textDocument/completion", textDocument=textDocument, position=position, context=context)
|
||||||
|
if "isIncomplete" in result_dict:
|
||||||
|
return lsp_structs.CompletionList (**result_dict)
|
||||||
|
|
||||||
|
return [lsp_structs.CompletionItem(**l) for l in result_dict]
|
||||||
|
@ -10,7 +10,6 @@ class LspEndpoint(threading.Thread):
|
|||||||
self.event_dict = {}
|
self.event_dict = {}
|
||||||
self.response_dict = {}
|
self.response_dict = {}
|
||||||
self.next_id = 0
|
self.next_id = 0
|
||||||
# self.daemon = True
|
|
||||||
self.shutdown_flag = False
|
self.shutdown_flag = False
|
||||||
|
|
||||||
|
|
||||||
@ -34,7 +33,6 @@ class LspEndpoint(threading.Thread):
|
|||||||
print("server quit")
|
print("server quit")
|
||||||
break
|
break
|
||||||
|
|
||||||
print("recieved message:", jsonrpc_message)
|
|
||||||
if "result" in jsonrpc_message or "error" in jsonrpc_message:
|
if "result" in jsonrpc_message or "error" in jsonrpc_message:
|
||||||
self.handle_result(jsonrpc_message)
|
self.handle_result(jsonrpc_message)
|
||||||
elif "method" in jsonrpc_message:
|
elif "method" in jsonrpc_message:
|
||||||
@ -44,7 +42,6 @@ class LspEndpoint(threading.Thread):
|
|||||||
self.default_callback(jsonrpc_message)
|
self.default_callback(jsonrpc_message)
|
||||||
else:
|
else:
|
||||||
print("unknown jsonrpc message")
|
print("unknown jsonrpc message")
|
||||||
print(jsonrpc_message)
|
|
||||||
|
|
||||||
|
|
||||||
def send_message(self, method_name, params, id = None):
|
def send_message(self, method_name, params, id = None):
|
||||||
|
@ -314,3 +314,114 @@ class SignatureHelp(object):
|
|||||||
self.signatures = [to_type(signature, SignatureInformation) for signature in signatures]
|
self.signatures = [to_type(signature, SignatureInformation) for signature in signatures]
|
||||||
self.activeSignature = activeSignature
|
self.activeSignature = activeSignature
|
||||||
self.activeParameter = activeParameter
|
self.activeParameter = activeParameter
|
||||||
|
|
||||||
|
|
||||||
|
class CompletionTriggerKind(object):
|
||||||
|
Invoked = 1
|
||||||
|
TriggerCharacter = 2
|
||||||
|
TriggerForIncompleteCompletions = 3
|
||||||
|
|
||||||
|
|
||||||
|
class CompletionContext(object):
|
||||||
|
"""
|
||||||
|
Contains additional information about the context in which a completion request is triggered.
|
||||||
|
"""
|
||||||
|
def __init__(self, triggerKind, triggerCharacter=None):
|
||||||
|
"""
|
||||||
|
Constructs a new CompletionContext instance.
|
||||||
|
|
||||||
|
:param CompletionTriggerKind triggerKind: How the completion was triggered.
|
||||||
|
:param str triggerCharacter: The trigger character (a single character) that has trigger code complete.
|
||||||
|
Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
|
||||||
|
"""
|
||||||
|
self.triggerKind = triggerKind
|
||||||
|
if triggerCharacter:
|
||||||
|
self.triggerCharacter = triggerCharacter
|
||||||
|
|
||||||
|
|
||||||
|
class TextEdit(object):
|
||||||
|
"""
|
||||||
|
A textual edit applicable to a text document.
|
||||||
|
"""
|
||||||
|
def __init__(self, range, newText):
|
||||||
|
"""
|
||||||
|
:param Range range: The range of the text document to be manipulated. To insert
|
||||||
|
text into a document create a range where start === end.
|
||||||
|
:param str newText: The string to be inserted. For delete operations use an empty string.
|
||||||
|
"""
|
||||||
|
self.range = range
|
||||||
|
self.newText = newText
|
||||||
|
|
||||||
|
|
||||||
|
class InsertTextFormat(object):
|
||||||
|
PlainText = 1
|
||||||
|
Snippet = 2
|
||||||
|
|
||||||
|
|
||||||
|
class CompletionItem(object):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
def __init__(self, label, kind=None, detail=None, documentation=None, deprecated=None, presented=None, sortText=None, filterText=None, insertText=None, insertTextFormat=None, textEdit=None, additionalTextEdits=None, commitCharacters=None, command=None, data=None):
|
||||||
|
"""
|
||||||
|
:param str label: The label of this completion item. By default also the text that is inserted when selecting
|
||||||
|
this completion.
|
||||||
|
:param int kind: The kind of this completion item. Based of the kind an icon is chosen by the editor.
|
||||||
|
:param str detail: A human-readable string with additional information about this item, like type or symbol information.
|
||||||
|
:param tr ocumentation: A human-readable string that represents a doc-comment.
|
||||||
|
:param bool deprecated: Indicates if this item is deprecated.
|
||||||
|
:param bool presented: Select this item when showing. Note: that only one completion item can be selected and that the
|
||||||
|
tool / client decides which item that is. The rule is that the first item of those that match best is selected.
|
||||||
|
:param str sortText: A string that should be used when comparing this item with other items. When `falsy` the label is used.
|
||||||
|
:param str filterText: A string that should be used when filtering a set of completion items. When `falsy` the label is used.
|
||||||
|
:param str insertText: A string that should be inserted into a document when selecting this completion. When `falsy` the label is used.
|
||||||
|
The `insertText` is subject to interpretation by the client side. Some tools might not take the string literally. For example
|
||||||
|
VS Code when code complete is requested in this example `con<cursor position>` and a completion item with an `insertText` of `console` is provided it
|
||||||
|
will only insert `sole`. Therefore it is recommended to use `textEdit` instead since it avoids additional client side interpretation.
|
||||||
|
@deprecated Use textEdit instead.
|
||||||
|
:param InsertTextFormat isertTextFormat: The format of the insert text. The format applies to both the `insertText` property
|
||||||
|
and the `newText` property of a provided `textEdit`.
|
||||||
|
:param TextEdit textEdit: An edit which is applied to a document when selecting this completion. When an edit is provided the value of `insertText` is ignored.
|
||||||
|
Note:* The range of the edit must be a single line range and it must contain the position at which completion
|
||||||
|
has been requested.
|
||||||
|
:param TextEdit additionalTextEdits: An optional array of additional text edits that are applied when selecting this completion.
|
||||||
|
Edits must not overlap (including the same insert position) with the main edit nor with themselves.
|
||||||
|
Additional text edits should be used to change text unrelated to the current cursor position
|
||||||
|
(for example adding an import statement at the top of the file if the completion item will
|
||||||
|
insert an unqualified type).
|
||||||
|
:param str commitCharacters: An optional set of characters that when pressed while this completion is active will accept it first and
|
||||||
|
then type that character. *Note* that all commit characters should have `length=1` and that superfluous
|
||||||
|
characters will be ignored.
|
||||||
|
:param Command command: An optional command that is executed *after* inserting this completion. Note: that
|
||||||
|
additional modifications to the current document should be described with the additionalTextEdits-property.
|
||||||
|
:param data: An data entry field that is preserved on a completion item between a completion and a completion resolve request.
|
||||||
|
"""
|
||||||
|
self.label = label
|
||||||
|
self.kind = kind
|
||||||
|
self.detail = detail
|
||||||
|
self.documentation = documentation
|
||||||
|
self.deprecated = deprecated
|
||||||
|
self.presented = presented
|
||||||
|
self.sortText = sortText
|
||||||
|
self.filterText = filterText
|
||||||
|
self.insertText = insertText
|
||||||
|
self.insertTextFormat = insertTextFormat
|
||||||
|
self.textEdit = textEdit
|
||||||
|
self.additionalTextEdits = additionalTextEdits
|
||||||
|
self.commitCharacters = commitCharacters
|
||||||
|
self.command = command
|
||||||
|
self.data = data
|
||||||
|
|
||||||
|
|
||||||
|
class CompletionList(object):
|
||||||
|
"""
|
||||||
|
Represents a collection of [completion items](#CompletionItem) to be presented in the editor.
|
||||||
|
"""
|
||||||
|
def __init__(self, isIncomplete, items):
|
||||||
|
"""
|
||||||
|
Constructs a new CompletionContext instance.
|
||||||
|
|
||||||
|
:param bool isIncomplete: This list it not complete. Further typing should result in recomputing this list.
|
||||||
|
:param CompletionItem items: The completion items.
|
||||||
|
"""
|
||||||
|
self.isIncomplete = isIncomplete
|
||||||
|
self.items = [to_type(i, CompletionItem) for i in items]
|
||||||
|
Loading…
Reference in New Issue
Block a user