dotar/vim/autoload/railmoon/oscan/extractor/definition_declaration.vim
2011-11-17 16:00:49 -06:00

122 lines
3.5 KiB
VimL
Executable File

" Author: Mykola Golubyev ( Nickolay Golubev )
" Email: golubev.nikolay@gmail.com
" Site: www.railmoon.com
" Plugin: oscan
" Module: extractor#definition_declaration
" Purpose: extract ctags record from buffer
function! railmoon#oscan#extractor#definition_declaration#create()
let new_extractor = copy(s:tag_scan_definition_declaration_extractor)
let new_extractor.file_name = expand("%:p")
let new_extractor.buffer_number = bufnr('%')
let new_extractor.file_extension = expand("%:e")
let new_extractor.filetype = &filetype
let new_extractor.description = 'Go to possible definition/declaration for current function'
return new_extractor
endfunction
let s:tag_scan_definition_declaration_extractor = {}
function! s:tag_scan_definition_declaration_extractor.process(record)
call railmoon#oscan#extractor#ctags#process(a:record.data)
endfunction
function! s:get_nearest_ctags_tag()
let filename = @%
let linenumber = line('.')
let self.language = railmoon#oscan#extractor#ctags#language_by_current_buffer()
let ctags_tags = railmoon#ctags_util#taglist_for_file(filename, language, railmoon#oscan#extractor#ctags#kind_types_for_langauge(language), 'sikaS')
let i = len(ctags_tags) - 1
while i >= 0
let tag_item = ctags_tags[i]
if linenumber >= tag_item.cmd
return tag_item
endif
let i -= 1
endwhile
return {}
endfunction
function! s:is_equal_tag_attribute(tag_left, tag_right, attribute)
let left_has_attribute = has_key(a:tag_left, a:attribute)
let right_has_attribute = has_key(a:tag_right, a:attribute)
if left_has_attribute && right_has_attribute
return a:tag_left[a:attribute] == a:tag_right[a:attribute]
endif
if ! left_has_attribute && ! right_has_attribute
return 1
endif
return 0
endfunction
function! s:return_definitions(ctags_tag)
let result = []
let similar_tags = taglist('\<'.a:ctags_tag.name.'\>')
for tag_item in similar_tags
if tag_item.kind == 'p'
continue
endif
if s:is_equal_tag_attribute(a:ctags_tag, tag_item, 'class') &&
\ s:is_equal_tag_attribute(a:ctags_tag, tag_item, 'namespace')
call add(result, tag_item)
endif
endfor
return result
endfunction
function! s:return_declarations(ctags_tag)
let result = []
let similar_tags = taglist('\<'.a:ctags_tag.name.'\>')
for tag_item in similar_tags
if tag_item.kind != 'p'
continue
endif
if s:is_equal_tag_attribute(a:ctags_tag, tag_item, 'class') &&
\ s:is_equal_tag_attribute(a:ctags_tag, tag_item, 'namespace')
call add(result, tag_item)
endif
endfor
return result
endfunction
function! s:tag_scan_definition_declaration_extractor.extract()
let result = []
let extension = self.file_extension
let language = railmoon#oscan#extractor#ctags#language_by_extension(extension)
let self.language = language
let nearest_tag = s:get_nearest_ctags_tag()
let ctags_tags = nearest_tag.kind =~ 'p' ? s:return_definitions(nearest_tag) : s:return_declarations(nearest_tag)
for item in ctags_tags
let record = railmoon#oscan#extractor#ctags#record_for_language_tag(language, item)
call add(result, record)
endfor
return result
endfunction
function! s:tag_scan_definition_declaration_extractor.colorize()
let &filetype = self.filetype
call railmoon#oscan#extractor#ctags#colorize_keywords(self.language)
endfunction