dotfiles/.vim/bundle/eclim/eclim/autoload/eclim/java/util.vim
2014-01-24 18:18:21 -05:00

352 lines
10 KiB
VimL

" Author: Eric Van Dewoestine
"
" Description: {{{
" Utility functions for java eclim ftplugins.
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:keywords = '\(abstract\|assert\|boolean\|case\|catch\|char\|class\|do\|double\|enum\|extends\|final\|finally\|float\|for\|if\|implements\|import\|int\|interface\|long\|new\|null\|package\|private\|protected\|public\|return\|short\|static\|switch\|throw\|throws\|try\|void\|while\)'
let s:class_declaration = '^\s*\(public\|private\|protected\)\?\(\s\+abstract\)\?\s\+\(class\|interface\|enum\)\s\+[A-Z]'
let s:command_src_exists = '-command java_src_exists -f "<file>"'
let s:command_list_installs = '-command java_list_installs'
let s:command_classpath = '-command java_classpath -p "<project>"'
let s:command_read_class = '-command java_class_prototype -c <class>'
let s:command_complete_package = '-command java_complete_package -p "<project>"'
let s:import_pattern = '^\s*import\_s\+<import>\_s*;'
" }}}
function! eclim#java#util#FileExists(name) " {{{
let command = substitute(s:command_src_exists, '<file>', a:name, '')
let result = eclim#Execute(command)
return result =~ '^true$'
endfunction " }}}
function! eclim#java#util#GetClassname(...) " {{{
if a:0 > 0
return fnamemodify(a:1, ":t:r")
endif
return expand("%:t:r")
endfunction " }}}
function! eclim#java#util#GetClassDeclarationPosition(movecursor) " {{{
let pos = getpos('.')
call cursor(1,1)
let position = search(s:class_declaration)
if !a:movecursor || !position
call setpos('.', pos)
endif
return position
endfunction " }}}
function! eclim#java#util#GetFullyQualifiedClassname(...) " {{{
if a:0 > 0
return eclim#java#util#GetPackage(a:1) . '.' . eclim#java#util#GetClassname(a:1)
endif
return eclim#java#util#GetPackage() . '.' . eclim#java#util#GetClassname()
endfunction " }}}
function! eclim#java#util#GetPackage(...) " {{{
if a:0 > 0
let winreset = winrestcmd()
silent exec "sview " . a:1
endif
let pos = getpos('.')
call cursor(1,1)
let package = ""
let packageLine = search('^\s*\<package\>', 'w')
if packageLine > 0
let package =
\ substitute(getline('.'), '.*\<package\>\s\+\(.\{-\}\)[ ;].*', '\1', '')
endif
if a:0 > 0
close
silent exec winreset
" not necessary and may screw up display (see autoload/project.vim)
"redraw
else
call setpos('.', pos)
endif
return package
endfunction " }}}
function! eclim#java#util#GetPackageFromImport(class) " {{{
let pattern = '^\s*import\s\+\([0-9A-Za-z._]*\)\.' . a:class . '\s*;'
let found = search(pattern, 'wn')
if found
return substitute(getline(found), pattern, '\1', '')
endif
return ""
endfunction " }}}
function! eclim#java#util#GetSelectedFields(first, last) range " {{{
" normalize each field statement into a single line.
let selection = ''
let index = a:first
let blockcomment = 0
while index <= a:last
let line = getline(index)
" ignore comment lines
if line =~ '^\s*/\*'
let blockcomment = 1
endif
if blockcomment && line =~ '\*/\s*$'
let blockcomment = 0
endif
if line !~ '^\s*//' && !blockcomment
" remove quoted values.
let line = substitute(line, '".\{-}"', '', 'g')
" strip off trailing comments
let line = substitute(line, '//.*', '', '')
let line = substitute(line, '/\*.*\*/', '', '')
let selection = selection . line
endif
let index += 1
endwhile
" compact comma separated multi field declarations
let selection = substitute(selection, ',\s*', ',', 'g')
" break fields back up into their own line.
let selection = substitute(selection, ';', ';\n', 'g')
" remove the assignment portion of the field.
let selection = substitute(selection, '\(.\{-}\)\s*=.\{-};', '\1;', 'g')
" extract field names
let properties = []
let lines = split(selection, '\n')
for line in lines
if line !~ '^\s*\/\/'
let fields = substitute(line, '.*\s\(.*\);', '\1', '')
if fields =~ '^[a-zA-Z0-9_,]'
for field in split(fields, ',')
call add(properties, field)
endfor
endif
endif
endfor
return properties
endfunction " }}}
function! eclim#java#util#IsKeyword(word) " {{{
return (a:word =~ '^' . s:keywords . '$\C')
endfunction " }}}
function! eclim#java#util#IsImported(classname) " {{{
" search for fully qualified import
let import_search = s:import_pattern
let import_search = substitute(import_search, '<import>', a:classname, '')
let found = search(import_search, 'wn')
if found
return 1
endif
" search for package.* import
let package = substitute(a:classname, '\(.*\)\..*', '\1', '')
let import_search = s:import_pattern
let import_search = substitute(import_search, '<import>', package . '\\.\\*', '')
let found = search(import_search, 'wn')
if found
return 1
endif
" check if current file and supplied classname are in the same package
if eclim#java#util#GetPackage() == package
return 1
endif
" not imported
return 0
endfunction " }}}
function! eclim#java#util#IsValidIdentifier(word) " {{{
if a:word == '' || a:word =~ '\W' || a:word =~ '^\d\+$' ||
\ eclim#java#util#IsKeyword(a:word)
return 0
endif
return 1
endfunction " }}}
function! eclim#java#util#Java(classname, args) " {{{
let project = eclim#project#util#GetCurrentProjectName()
if project == '' && exists('b:project')
let project = b:project
endif
if project == ''
call eclim#project#util#IsCurrentFileInProject()
return
endif
let args = eclim#util#ParseArgs(a:args)
let classname = a:classname
if classname == '' && len(args)
let arg1 = args[0]
if arg1 == '%'
let args = args[1:]
let classname = exists('b:filename') ?
\ eclim#java#util#GetFullyQualifiedClassname(b:filename) :
\ eclim#java#util#GetFullyQualifiedClassname()
endif
endif
let command = '-command java -p "' . project . '"'
if classname != ''
let command .= ' -c ' . classname
endif
if len(args)
let command .= ' -a'
for arg in args
let arg = substitute(arg, '^-', '\\-', '')
let command .= ' "' . escape(arg, '"') . '"'
endfor
endif
let result = eclim#Execute(command, {'project': project, 'exec': 1, 'raw': 1})
let results = split(result, "\n")
call eclim#util#TempWindow('[Java Output]', results)
let b:project = project
if exists(":Java") != 2
command -buffer -nargs=* Java :call eclim#java#util#Java('', <q-args>)
endif
endfunction " }}}
function! eclim#java#util#Classpath(...) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_classpath
let command = substitute(command, '<project>', project, '')
for arg in a:000
if arg == '\n'
let arg = "\n"
endif
let command .= " \"" . arg . "\""
endfor
let result = eclim#Execute(command)
if result == '0'
return
endif
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#util#ListInstalls() " {{{
let installs = eclim#Execute(s:command_list_installs)
if type(installs) != g:LIST_TYPE
return
endif
if len(installs) == 0
call eclim#util#Echo("No jdk/jre installs found.")
endif
let pad = 0
for install in installs
let name = install.name . ' ' . install.version
if install.default
let name .= ' (default)'
endif
let pad = len(name) > pad ? len(name) : pad
endfor
let output = []
let type = ''
for install in installs
if install.type != type
let type = install.type
call add(output, 'Type: ' . install.type)
endif
let name = install.name . ' ' . install.version
if install.default
let name .= ' (default)'
endif
call add(output, ' ' . eclim#util#Pad(name, pad) . ' - ' . install.dir)
endfor
call eclim#util#Echo(join(output, "\n"))
endfunction " }}}
function! eclim#java#util#ReadClassPrototype() " {{{
let file = substitute(expand('%:p'), '\', '/', 'g')
let command = s:command_read_class
let command = substitute(command, '<class>', expand('%:t:r'), '')
let command .= ' -f "' . file . '"'
let file = eclim#Execute(command)
if string(file) != '0'
let bufnum = bufnr('%')
if has('win32unix')
let file = eclim#cygwin#CygwinPath(file)
endif
silent exec "keepjumps edit! " . escape(file, ' ')
exec 'bdelete ' . bufnum
silent exec "doautocmd BufReadPre " . file
silent exec "doautocmd BufReadPost " . file
call eclim#util#DelayedCommand('set ft=java')
setlocal readonly
setlocal nomodifiable
setlocal noswapfile
endif
endfunction " }}}
function! eclim#java#util#CommandCompleteProject(argLead, cmdLine, cursorPos) " {{{
return eclim#project#util#CommandCompleteProjectByNature(
\ a:argLead, a:cmdLine, a:cursorPos, 'java')
endfunction " }}}
function! eclim#java#util#CommandCompletePackage(argLead, cmdLine, cursorPos) " {{{
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
let project = eclim#project#util#GetCurrentProjectName()
if project == ''
return []
endif
let command = s:command_complete_package
let command = substitute(command, '<project>', project, '')
if argLead != ''
let command .= ' -n ' . argLead
endif
let results = eclim#Execute(command)
return type(results) == g:LIST_TYPE ? results : []
endfunction " }}}
" vim:ft=vim:fdm=marker