Skip to content

Commit 025343d

Browse files
authored
Merge pull request #7 from common-workflow-language/add-didHoges
Implement didOpen/didClose/didChange
2 parents 19d595e + 8aa9f05 commit 025343d

File tree

3 files changed

+99
-8
lines changed

3 files changed

+99
-8
lines changed

cwl_language_server/callbacks.py

Lines changed: 91 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,122 @@
44
from glob import glob
55
from os.path import dirname, basename
66
import sys
7-
from linecache import getline
87
from urllib.parse import urlparse
98

9+
CONTENTS = {} # Hash[uri, Hash[string, Union[integer, TextContent]]]
10+
11+
class TextContent:
12+
# TODO: it should be tested
13+
def __init__(self, text): # Text -> self
14+
self.text = text.split("\n")
15+
16+
def __getitem__(self, i): # integer -> string
17+
return self.text[i]
18+
19+
def __str__(self): # None -> string
20+
return "\n".join(self.text)
21+
22+
def remove_text(self, rng): # Range -> None
23+
stline = rng['start']['line']
24+
stcol = rng['start']['character']
25+
enline = rng['end']['line']
26+
encol = rng['end']['character']
27+
28+
before = self.text[stline][:stcol]
29+
after = self.text[enline][encol:]
30+
31+
self.text[stline] = before+after
32+
for _ in range(enline-stline):
33+
self.text.pop(stline+1)
34+
35+
def insert_text(self, beg, text): # Position -> Text -> None
36+
stline = beg['line']
37+
stcol = beg['character']
38+
39+
before = self.text[stline][:stcol]
40+
after = self.text[stline][stcol:]
41+
lines = text.split("\n")
42+
43+
self.text[stline] = before+lines[0]
44+
idx = stline+1
45+
for l in lines[1:]:
46+
self.text.insert(idx, l)
47+
idx += 1
48+
self.text[idx-1] += after
49+
1050
def initialize(params): # InitializeParams -> InitializeResult
1151
return {
1252
'capabilities': {
53+
'textDocumentSync': {
54+
'openClose': True,
55+
'change': 2,
56+
},
1357
'completionProvider': {
1458
'triggerCharacters': [': ', '- '],
1559
},
1660
},
1761
}
1862

1963
def initialized(params): # InitializedParams -> None
20-
return
64+
pass
65+
66+
def didChangeConfiguration(params): # ConfigurationParams -> None
67+
pass
68+
69+
def didOpen(params): # DidOpenTextDocumentParams -> None
70+
uri = params['textDocument']['uri']
71+
text = params['textDocument']['text']
72+
# print('Contents for {} is added.'.format(uri), file=sys.stderr)
73+
CONTENTS[uri] = {
74+
'version': 0,
75+
'text': TextContent(text),
76+
}
77+
78+
def didClose(params): # DidCloseTextDocumentParams -> None
79+
# print('Contents for {} is removed.'.format(params['uri']), file=sys.stderr)
80+
del CONTENTS[params['uri']]
81+
82+
def didChange(params): # DidChangeTextDocumentParams -> None
83+
uri = params['textDocument']['uri']
84+
version = params['textDocument']['version']
85+
changes = params['contentChanges']
86+
87+
if version is None:
88+
pass # warning
89+
elif CONTENTS[uri]['version']+len(changes) != version:
90+
pass # warning
91+
92+
wholetxt = CONTENTS[uri]['text']
93+
for ch in changes:
94+
txt = ch['text']
95+
if not 'range' in ch or ch['range'] is None:
96+
CONTENTS[uri] = {
97+
'text': TextContent(txt),
98+
'version': 0,
99+
}
100+
wholetxt = CONTENTS[uri]['text']
101+
continue
102+
103+
wholetxt.remove_text(ch['range'])
104+
wholetxt.insert_text(ch['range']['start'], txt)
21105

22106
def completion(params): # CompletionParams -> CompletionList
23107
# print('Params: ', params, file=sys.stderr)
24108
ctx = params.get('context', {})
25109
line = params['position']['line']
26110
col = params['position']['character']
27-
uri = urlparse(params['textDocument']['uri']).path
111+
uri = params['textDocument']['uri']
28112

29-
field = getline(uri, line+1)[0:col].lstrip().rstrip(': ')
113+
# print('Keys: ', CONTENTS.keys(), file=sys.stderr)
114+
field = CONTENTS[uri]['text'][line][0:col].lstrip().rstrip(': ')
30115
if not field:
31116
return structs.CompletionList(False, [])
32117

33118
if field in completion_list:
34119
return completion_list[field]
35120
if field == 'run':
36-
cwls = glob("{}/*.cwl".format(dirname(uri)))
37-
return [structs.CompletionItem(basename(cwl)) for cwl in cwls if cwl != uri]
121+
cwls = glob("{}/*.cwl".format(dirname(urlparse(uri).path)))
122+
return [structs.CompletionItem(basename(cwl)) for cwl in cwls if cwl != urlparse(uri).path]
38123
return structs.CompletionList(False, [])
39124

40125
completion_list = {

cwl_language_server/main.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,14 @@ def main():
1212
lsp_endpoint = pylspclient.LspEndpoint(json_rpc_endpoint,
1313
method_callbacks={
1414
'initialize': callbacks.initialize,
15-
'initialized': callbacks.initialized,
1615
'textDocument/completion': callbacks.completion,
16+
},
17+
notify_callbacks={
18+
'initialized': callbacks.initialized,
19+
'workspace/didChangeConfiguration': callbacks.didChangeConfiguration,
20+
'textDocument/didOpen': callbacks.didOpen,
21+
'textDocument/didChange': callbacks.didChange,
22+
'textDocument/didClose': callbacks.didClose,
1723
})
1824
lsp_endpoint.start()
1925

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
typing-extensions
2-
git+https://github.com/yeger00/pylspclient.git@send-result-wip
2+
git+https://github.com/yeger00/pylspclient.git@

0 commit comments

Comments
 (0)