Skip to content

Commit 10e08e3

Browse files
committed
refactored completion code
1 parent 0ea0e30 commit 10e08e3

File tree

7 files changed

+138
-41
lines changed

7 files changed

+138
-41
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
[Tt]est[Rr]esult
2222
[Bb]uild[Ll]og.*
2323

24+
*.pyc
2425
*_i.c
2526
*_p.c
2627
*.ilk

autoload/OmniSharp.vim

+1-6
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,7 @@ function! OmniSharp#Complete(findstart, base)
2323

2424
return start
2525
else
26-
let words=[]
27-
python getCompletions("words", "s:column", "a:base")
28-
if len(words) == 0
29-
return -3
30-
endif
31-
return words
26+
return pyeval('Completion().get_completions("s:column", "a:base")')
3227
endif
3328
endfunction
3429

plugin/OmniSharp.vim

+7-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@ augroup END
1010
let g:OmniSharp_loaded = 1
1111

1212
"Load python/OmniSharp.py
13-
let s:py_path = join([expand('<sfile>:p:h:h'), "python", "OmniSharp.py"], '/')
14-
exec "pyfile " . fnameescape(s:py_path)
13+
let s:py_path = join([expand('<sfile>:p:h:h'), "python"], '/')
14+
exec "python sys.path.append('" . s:py_path . "')"
15+
"exec "python from ..python.async.asyncrequest import *"
16+
"exec "pyfile " . fnameescape(s:py_path . "/asyncrequest.py")
17+
exec "pyfile " . fnameescape(s:py_path . "/Completion.py")
18+
exec "pyfile " . fnameescape(s:py_path . "/OmniSharp.py")
19+
1520

1621
let g:OmniSharp_port = get(g:, 'OmniSharp_port', 2000)
1722

python/Completion.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import vim, syncrequest, types
2+
class Completion:
3+
def get_completions(self, column, partialWord):
4+
parameters = {}
5+
parameters['column'] = vim.eval(column)
6+
parameters['wordToComplete'] = vim.eval(partialWord)
7+
8+
parameters['WantDocumentationForEveryCompletionResult'] = \
9+
bool(int(vim.eval('g:omnicomplete_fetch_full_documentation')))
10+
11+
parameters['buffer'] = '\r\n'.join(vim.eval('s:textBuffer')[:])
12+
13+
response = syncrequest.get_response('/autocomplete', parameters)
14+
15+
16+
enc = vim.eval('&encoding')
17+
vim_completions = []
18+
if response is not None:
19+
for completion in response:
20+
complete = {
21+
'word': completion['CompletionText'],
22+
'menu' : completion['DisplayText'],
23+
'info': completion['Description'].replace('\r\n', '\n'),
24+
'icase': 1,
25+
'dup':1
26+
}
27+
vim_completions.append(complete)
28+
29+
return vim_completions

python/OmniSharp.py

+5-33
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import vim, urllib2, urllib, urlparse, logging, json, os, os.path, cgi, types
1+
import vim, urllib2, urllib, urlparse, logging, json, os, os.path, cgi, types, threading
2+
import asyncrequest
23

34
logger = logging.getLogger('omnisharp')
45
logger.setLevel(logging.WARNING)
@@ -12,7 +13,8 @@
1213
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
1314
hdlr.setFormatter(formatter)
1415

15-
def getResponse(endPoint, additional_parameters=None, timeout=None ):
16+
17+
def getResponse(endPoint, additional_parameters=None, timeout=None):
1618
parameters = {}
1719
parameters['line'] = vim.eval('line(".")')
1820
parameters['column'] = vim.eval('col(".")')
@@ -40,37 +42,7 @@ def getResponse(endPoint, additional_parameters=None, timeout=None ):
4042
return response.read()
4143
except Exception:
4244
vim.command("let g:serverSeenRunning = 0")
43-
return ''
44-
45-
46-
#All of these functions take vim variable names as parameters
47-
def getCompletions(ret, column, partialWord):
48-
parameters = {}
49-
parameters['column'] = vim.eval(column)
50-
parameters['wordToComplete'] = vim.eval(partialWord)
51-
52-
parameters['WantDocumentationForEveryCompletionResult'] = \
53-
bool(int(vim.eval('g:omnicomplete_fetch_full_documentation')))
54-
55-
parameters['buffer'] = '\r\n'.join(vim.eval('s:textBuffer')[:])
56-
js = getResponse('/autocomplete', parameters)
57-
58-
command_base = ("add(" + ret +
59-
", {'word': '%(CompletionText)s', 'menu': '%(DisplayText)s', 'info': \"%(Description)s\", 'icase': 1, 'dup':1 })")
60-
enc = vim.eval('&encoding')
61-
if js != '':
62-
completions = json.loads(js)
63-
for completion in completions:
64-
try:
65-
completion['Description'] = \
66-
completion['Description'].replace('\r\n', '\n')
67-
command = command_base % completion
68-
if type(command) == types.StringType:
69-
vim.eval(command)
70-
else:
71-
vim.eval(command.encode(enc))
72-
except:
73-
logger.error(command)
45+
return None
7446

7547
def findUsages(ret):
7648
parameters = {}

python/asyncrequest.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import vim, urllib2, urllib, urlparse, logging, json, os, os.path, cgi, types, threading
2+
3+
class ThreadUrl(threading.Thread):
4+
5+
def __init__(self, url, callback, data, timeout):
6+
threading.Thread.__init__(self)
7+
self.url = url
8+
self.data = data
9+
self.timeout = timeout
10+
self.callback = callback
11+
12+
def run(self):
13+
try:
14+
proxy = urllib2.ProxyHandler({})
15+
opener = urllib2.build_opener(proxy)
16+
response = opener.open(self.url, self.data, self.timeout)
17+
self.callback(response.read())
18+
except:
19+
self.callback(None)
20+
21+
def urlopen_async(url, callback, data, timeout):
22+
thread = ThreadUrl(url, callback, data, timeout)
23+
thread.start()
24+
25+
def get_response_async(endPoint, callback, params=None, timeout=None):
26+
parameters = {}
27+
parameters['line'] = vim.eval('line(".")')
28+
parameters['column'] = vim.eval('col(".")')
29+
parameters['buffer'] = '\r\n'.join(vim.eval("getline(1,'$')")[:])
30+
parameters['filename'] = vim.current.buffer.name
31+
32+
if params is not None:
33+
parameters.update(params)
34+
35+
if timeout == None:
36+
timeout = int(vim.eval('g:OmniSharp_timeout'))
37+
38+
host = vim.eval('g:OmniSharp_host')
39+
40+
if vim.eval('exists("b:OmniSharp_host")') == '1':
41+
host = vim.eval('b:OmniSharp_host')
42+
43+
target = urlparse.urljoin(host, endPoint)
44+
data = urllib.urlencode(parameters).encode('utf-8')
45+
46+
def urlopen_callback(data):
47+
#print(data)
48+
if data is None:
49+
vim.command("let g:serverSeenRunning = 0")
50+
callback(None)
51+
else:
52+
vim.command("let g:serverSeenRunning = 1")
53+
#jsonStr = data.decode('utf-8')
54+
jsonObj = json.loads(data)
55+
callback(jsonObj)
56+
57+
urlopen_async(
58+
target,
59+
urlopen_callback,
60+
data,
61+
timeout)

python/syncrequest.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import vim, urllib2, urllib, urlparse, json
2+
3+
def get_response(endPoint, params=None, timeout=None):
4+
parameters = {}
5+
parameters['line'] = vim.eval('line(".")')
6+
parameters['column'] = vim.eval('col(".")')
7+
parameters['buffer'] = '\r\n'.join(vim.eval("getline(1,'$')")[:])
8+
parameters['filename'] = vim.current.buffer.name
9+
10+
if params is not None:
11+
parameters.update(params)
12+
13+
if timeout == None:
14+
timeout = int(vim.eval('g:OmniSharp_timeout'))
15+
16+
host = vim.eval('g:OmniSharp_host')
17+
18+
if vim.eval('exists("b:OmniSharp_host")') == '1':
19+
host = vim.eval('b:OmniSharp_host')
20+
21+
target = urlparse.urljoin(host, endPoint)
22+
data = urllib.urlencode(parameters).encode('utf-8')
23+
24+
proxy = urllib2.ProxyHandler({})
25+
opener = urllib2.build_opener(proxy)
26+
try:
27+
response = opener.open(target, data, timeout)
28+
vim.command("let g:serverSeenRunning = 1")
29+
except Exception:
30+
vim.command("let g:serverSeenRunning = 0")
31+
return None
32+
33+
json_string = response.read()
34+
return json.loads(json_string)

0 commit comments

Comments
 (0)