Skip to content

Commit f5c7dcb

Browse files
committed
Merge branch 'development'
2 parents a6668af + 68a568f commit f5c7dcb

File tree

19 files changed

+498
-104
lines changed

19 files changed

+498
-104
lines changed

README.md

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ Add this to your `.vimrc` file:
9494

9595
To enable inserting class imports with F4, add:
9696

97-
`nnoremap <F4> :call javacomplete#AddImport()<cr>`
97+
`nnoremap <F4> :JCAddImport<cr>`
98+
`inoremap <F4> <esc>:JCaddImportI<cr>`
9899

99100
### Optional
100101

@@ -110,29 +111,21 @@ To enable inserting class imports with F4, add:
110111

111112
## Commands
112113

113-
manually run server:
114+
`JCimportsAddMissing` - add all missing 'imports';
115+
`JCimportsRemoveUnused` - remove all unsused 'imports';
116+
`JCimportAdd` - add 'import' for classname that is under cursor, or before it;
117+
`JCimportAddI` - the same, but enable insert mode after 'import' was added;
114118

115-
javacomplete#StartServer()
119+
`JCserverShowPort` - show port, through which vim plugin communicates with server;
120+
`JCserverShowPID` - show server process identificator;
121+
`JCserverStart` - start server manually;
122+
`JCserverTerminate` - stop server manually;
123+
`JCserverCompile` - compile server manually;
116124

117-
manually stop server:
125+
`JCdebugSetLogLevel` - enable logs;
126+
`JCdebugGetLogContent` - get debug logs;
118127

119-
javacomplete#TerminateServer()
120-
121-
insert class import:
122-
123-
javacomplete#AddImport()
124-
125-
show port used for javavi server:
126-
127-
javacomplete#ShowPort()
128-
129-
show javavi server process id:
130-
131-
javacomplete#ShowPID()
132-
133-
manually run server compilation:
134-
135-
javacomplete#CompileJavavi()
128+
`JCcacheClear` - clear cache manually.
136129

137130
## Limitations:
138131

autoload/javacomplete.vim

Lines changed: 126 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
" Vim completion script
2-
" Version: 2.3
2+
" Version: 2.3.1
33
" Language: Java
44
" Maintainer: artur shaik <ashaihullin@gmail.com>
5-
" Last Change: 2015-07-29
5+
" Last Change: 2015-09-08
66
" Copyright: Copyright (C) 2006-2015 cheng fang, artur shaik. All rights reserved.
77
" License: Vim License (see vim's :help license)
88

@@ -251,13 +251,13 @@ endfunction
251251

252252
function! javacomplete#ShowPort()
253253
if s:PollServer()
254-
JavacompletePy vim.command('echom "Javavi port: %d"' % bridgeState.port())
254+
JavacompletePy vim.command('echo "Javavi port: %d"' % bridgeState.port())
255255
endif
256256
endfunction
257257

258258
function! javacomplete#ShowPID()
259259
if s:PollServer()
260-
JavacompletePy vim.command('echom "Javavi pid: %d"' % bridgeState.pid())
260+
JavacompletePy vim.command('echo "Javavi pid: %d"' % bridgeState.pid())
261261
endif
262262
endfunction
263263

@@ -266,19 +266,40 @@ function! s:GetClassNameWithScope(...)
266266
let curline = getline('.')
267267
let word_l = offset - 1
268268
let word_r = offset - 2
269-
while curline[word_l - 1] =~ '[.@A-Za-z0-9_]'
269+
while curline[word_l - 1] =~ '[@A-Za-z0-9_]'
270270
if curline[word_l - 1] == '@'
271271
break
272272
endif
273273
let word_l -= 1
274274
endwhile
275-
while curline[word_r + 1] =~ '[.A-Za-z0-9_]'
275+
while curline[word_r + 1] =~ '[A-Za-z0-9_]'
276276
let word_r += 1
277277
endwhile
278278

279279
return curline[word_l : word_r]
280280
endfunction
281281

282+
function! s:SortImports()
283+
let imports = s:GetImports('imports')
284+
if (len(imports) > 0)
285+
let beginLine = imports[0][1]
286+
let lastLine = imports[len(imports) - 1][1]
287+
let importsList = []
288+
for import in imports
289+
call add(importsList, import[0])
290+
endfor
291+
292+
call sort(importsList)
293+
let saveCursor = getcurpos()
294+
silent execute beginLine.','.lastLine. 'delete _'
295+
for imp in importsList
296+
call append(beginLine - 1, 'import '. imp. ';')
297+
let beginLine += 1
298+
endfor
299+
call setpos('.', saveCursor)
300+
endif
301+
endfunction
302+
282303
function! s:AddImport(import)
283304
let imports_fqn = s:GetImports('imports_fqn')
284305
for import in imports_fqn
@@ -311,22 +332,13 @@ function! s:AddImport(import)
311332
call append(insertline, 'import '. a:import. ';')
312333
call append(insertline, '')
313334
else
314-
let idx = 0
315-
while idx < len(imports)
316-
let i = imports[idx][0]
317-
let list = [i, a:import]
318-
call sort(list)
319-
if list[0] == a:import || idx == len(imports) - 1
320-
call append(imports[idx][1] - 1, 'import '. a:import. ';')
321-
return
322-
endif
323-
let idx += 1
324-
endwhile
335+
let lastLine = imports[len(imports) - 1][1]
336+
call append(lastLine, 'import '. a:import. ';')
325337
endif
326338

327339
endfunction
328340

329-
function! javacomplete#AddImport()
341+
function! javacomplete#AddImport(...)
330342
call javacomplete#StartServer()
331343

332344
let i = 0
@@ -340,24 +352,93 @@ function! javacomplete#AddImport()
340352
let i += 1
341353
endwhile
342354

343-
let response = s:RunReflection("-class-packages", classname, 'Filter packages to add import')
355+
let response = s:CommunicateToServer("-class-packages", classname, 'Filter packages to add import')
344356
if response =~ '^['
345357
let result = eval(response)
358+
let import = ''
346359
if len(result) == 0
347360
echo "JavaComplete: classname '". classname. "' not found in any scope."
348-
return
349-
endif
350361

351-
let import = 0
352-
if len(result) > 1
362+
elseif len(result) == 1
363+
let import = result[0]
364+
365+
else
366+
if exists('g:ClassnameCompleted') && g:ClassnameCompleted
367+
return
368+
endif
369+
353370
let index = 0
354371
for cn in result
355372
echo "candidate [". index. "]: ". cn
356373
let index += 1
357374
endfor
358-
if exists('g:ClassnameCompleted') && g:ClassnameCompleted
375+
let userinput = input('select one candidate [0]: ', '')
376+
if empty(userinput)
359377
let userinput = 0
378+
elseif userinput =~ '^[0-9]*$'
379+
let userinput = str2nr(userinput)
360380
else
381+
let userinput = -1
382+
endif
383+
redraw!
384+
385+
if userinput < 0 || userinput >= len(result)
386+
echo "JavaComplete: wrong input"
387+
else
388+
let import = result[userinput]
389+
endif
390+
endif
391+
392+
if !empty(import)
393+
call s:AddImport(import)
394+
call s:SortImports()
395+
endif
396+
397+
endif
398+
399+
if a:0 > 0 && a:1
400+
let cur = getcurpos()
401+
let cur[2] = cur[2] + 1
402+
execute 'startinsert'
403+
call setpos('.', cur)
404+
endif
405+
endfunction
406+
407+
function! javacomplete#RemoveUnusedImports()
408+
let currentBuf = getline(1,'$')
409+
let current = join(currentBuf, '<_javacomplete-linebreak>')
410+
411+
let response = s:CommunicateToServer('-unused-imports -content', current, 'RemoveUnusedImports')
412+
if response =~ '^['
413+
let saveCursor = getcurpos()
414+
let unused = eval(response)
415+
for unusedImport in unused
416+
let imports = s:GetImports('imports')
417+
for import in imports
418+
if import[0] == unusedImport
419+
silent execute import[1]. 'delete _'
420+
endif
421+
endfor
422+
endfor
423+
let saveCursor[1] = saveCursor[1] - len(unused)
424+
call setpos('.', saveCursor)
425+
endif
426+
endfunction
427+
428+
function! javacomplete#AddMissingImports()
429+
let currentBuf = getline(1,'$')
430+
let current = join(currentBuf, '<_javacomplete-linebreak>')
431+
432+
let response = s:CommunicateToServer('-missing-imports -content', current, 'RemoveUnusedImports')
433+
if response =~ '^['
434+
let missing = eval(response)
435+
for import in missing
436+
if len(import) > 1
437+
let index = 0
438+
for cn in import
439+
echo "candidate [". index. "]: ". cn
440+
let index += 1
441+
endfor
361442
let userinput = input('select one candidate [0]: ', '')
362443
if empty(userinput)
363444
let userinput = 0
@@ -367,20 +448,18 @@ function! javacomplete#AddImport()
367448
let userinput = -1
368449
endif
369450
redraw!
370-
endif
371-
372-
if userinput < 0 || userinput >= len(result)
373-
echo "JavaComplete: wrong input"
374-
return
375-
endif
376451

377-
let import = result[userinput]
378-
else
379-
let import = result[0]
380-
endif
381-
382-
call s:AddImport(import)
452+
if userinput < 0 || userinput >= len(import)
453+
echo "JavaComplete: wrong input"
454+
continue
455+
endif
383456

457+
call s:AddImport(import[userinput])
458+
else
459+
call s:AddImport(import[0])
460+
endif
461+
endfor
462+
call s:SortImports()
384463
endif
385464
endfunction
386465

@@ -528,9 +607,9 @@ function! javacomplete#Complete(findstart, base)
528607
" Try to complete incomplete class name
529608
if b:context_type == s:CONTEXT_COMPLETE_CLASS && a:base =~ '^[@A-Z][A-Za-z0-9_]*$'
530609
if a:base =~ s:RE_ANNOTATION
531-
let response = s:RunReflection("-similar-annotations", a:base[1:], 'Filter packages by incomplete class name')
610+
let response = s:CommunicateToServer("-similar-annotations", a:base[1:], 'Filter packages by incomplete class name')
532611
else
533-
let response = s:RunReflection("-similar-classes", a:base, 'Filter packages by incomplete class name')
612+
let response = s:CommunicateToServer("-similar-classes", a:base, 'Filter packages by incomplete class name')
534613
endif
535614
if response =~ '^['
536615
let result = eval(response)
@@ -1387,7 +1466,7 @@ fu! s:SearchStaticImports(name, fullmatch)
13871466
endif
13881467
endfor
13891468
if commalist != ''
1390-
let res = s:RunReflection('-E', commalist, 's:SearchStaticImports in Batch')
1469+
let res = s:CommunicateToServer('-E', commalist, 's:SearchStaticImports in Batch')
13911470
if res =~ "^{'"
13921471
let dict = eval(res)
13931472
for key in keys(dict)
@@ -2621,15 +2700,16 @@ fu! s:Sort(ci)
26212700
return ci
26222701
endfu
26232702

2624-
" Function to run Reflection {{{2
2625-
fu! s:RunReflection(option, args, log)
2703+
" Function for server communication {{{2
2704+
fu! s:CommunicateToServer(option, args, log)
26262705
if !s:PollServer()
26272706
call javacomplete#StartServer()
26282707
endif
26292708

26302709
if s:PollServer()
2631-
let cmd = a:option. ' "'. a:args. '"'
2632-
call s:Info("RunReflection: ". cmd. " [". a:log. "]")
2710+
let args = substitute(a:args, '"', '\\"', 'g')
2711+
let cmd = a:option. ' "'. args. '"'
2712+
call s:Info("CommunicateToServer: ". cmd. " [". a:log. "]")
26332713
let a:result = ""
26342714
JavacompletePy << EOPC
26352715
vim.command('let a:result = "%s"' % bridgeState.send(vim.eval("cmd")))
@@ -2713,7 +2793,7 @@ fu! s:FetchClassInfo(fqn)
27132793
return s:cache[a:fqn]
27142794
endif
27152795

2716-
let res = s:RunReflection('-E', a:fqn, 'FetchClassInfo in Batch')
2796+
let res = s:CommunicateToServer('-E', a:fqn, 'FetchClassInfo in Batch')
27172797
if res =~ "^{'"
27182798
let dict = eval(res)
27192799
for key in keys(dict)
@@ -2930,7 +3010,7 @@ endfunction
29303010
" See ClassInfoFactory.getClassInfo() in insenvim.
29313011
function! s:DoGetReflectionClassInfo(fqn)
29323012
if !has_key(s:cache, a:fqn)
2933-
let res = s:RunReflection('-C', a:fqn, 's:DoGetReflectionClassInfo')
3013+
let res = s:CommunicateToServer('-C', a:fqn, 's:DoGetReflectionClassInfo')
29343014
if res =~ '^{'
29353015
let s:cache[a:fqn] = s:Sort(eval(res))
29363016
elseif res =~ '^['
@@ -3092,7 +3172,7 @@ fu! s:DoGetInfoByReflection(class, option)
30923172
return s:cache[a:class]
30933173
endif
30943174

3095-
let res = s:RunReflection(a:option, a:class, 's:DoGetInfoByReflection')
3175+
let res = s:CommunicateToServer(a:option, a:class, 's:DoGetInfoByReflection')
30963176
if res =~ '^[{\[]'
30973177
let v = eval(res)
30983178
if type(v) == type([])

0 commit comments

Comments
 (0)