@@ -41,15 +41,35 @@ function! youcompleteme#hierarchy#StartRequest( kind )
4141 endif
4242
4343 call youcompleteme#symbol#InitSymbolProperties ()
44- py3 ycm_state.ResetCurrentHierarchy ()
4544 py3 from ycm.client.command_request import GetRawCommandResponse
45+
46+ if a: kind == ' resume'
47+ if s: lines_and_handles != v: null
48+ call s: SetUpMenu ()
49+ endif
50+ return
51+ endif
52+
53+ if a: kind == ' addcall'
54+ let handle = s: lines_and_handles [ s: select - 1 ][ 1 ]
55+ let lines_and_handles = py3eval (
56+ \ ' ycm_state.AddCurrentHierarchy( ' .
57+ \ ' vimsupport.GetIntValue( "handle" ), ' .
58+ \ ' GetRawCommandResponse( ' .
59+ \ ' [ "CallHierarchy" ], False ))' )
60+ let s: lines_and_handles = lines_and_handles
61+ call s: SetUpMenu ()
62+ return
63+ endif
64+
65+ py3 ycm_state.ResetCurrentHierarchy ()
4666 if a: kind == ' call'
4767 let lines_and_handles = py3eval (
4868 \ ' ycm_state.InitializeCurrentHierarchy( GetRawCommandResponse( ' .
4969 \ ' [ "CallHierarchy" ], False ), ' .
5070 \ ' vim.eval( "a:kind" ) )' )
5171 else
52- let lines_and_handles = py3eval (
72+ let lines_and_handles = py3eval (
5373 \ ' ycm_state.InitializeCurrentHierarchy( GetRawCommandResponse( ' .
5474 \ ' [ "TypeHierarchy" ], False ), ' .
5575 \ ' vim.eval( "a:kind" ) )' )
@@ -59,10 +79,29 @@ function! youcompleteme#hierarchy#StartRequest( kind )
5979 let s: kind = a: kind
6080 let s: select = 1
6181 call s: SetUpMenu ()
82+ else
83+ let s: lines_and_handles = v: null
84+ let s: select = -1
85+ let s: kind = ' '
86+ endif
87+ endfunction
88+
89+ function ! s: RedrawMenu ()
90+ let pos = popup_getpos ( s: popup_id )
91+ call win_execute ( s: popup_id ,
92+ \ ' call cursor( [' . string ( s: select ) . ' , 1 ] )' )
93+ call win_execute ( s: popup_id ,
94+ \ ' set cursorline cursorlineopt&' )
95+ if s: select < pos.firstline
96+ call win_execute ( s: popup_id , " normal z\<CR> " )
97+ endif
98+ if s: select >= (pos.firstline + pos.core_height )
99+ call win_execute ( s: popup_id , ' :normal z-' )
62100 endif
63101endfunction
64102
65103function ! s: MenuFilter ( winid, key )
104+ let pos = popup_getpos ( s: popup_id )
66105 if a: key == " \<S-Tab> "
67106 " Root changes if we're showing super-tree of a sub-tree of the root
68107 " (indicated by the handle being positive)
@@ -81,6 +120,20 @@ function! s:MenuFilter( winid, key )
81120 \ [ s: select - 1 , ' resolve_down' , will_change_root ] )
82121 return 1
83122 endif
123+ if a: key == " c"
124+ let will_change_root = 0
125+ call popup_close (
126+ \ s: popup_id ,
127+ \ [ s: select - 1 , ' resolve_close' , will_change_root ] )
128+ return 1
129+ endif
130+ if a: key == " d"
131+ let will_change_root = 0
132+ call popup_close (
133+ \ s: popup_id ,
134+ \ [ s: select - 1 , ' resolve_remove' , will_change_root ] )
135+ return 1
136+ endif
84137 if a: key == " \<CR> "
85138 call popup_close ( s: popup_id , [ s: select - 1 , ' jump' , v: none ] )
86139 return 1
@@ -90,21 +143,31 @@ function! s:MenuFilter( winid, key )
90143 if s: select < 1
91144 let s: select = 1
92145 endif
93- call win_execute ( s: popup_id ,
94- \ ' call cursor( [' . string ( s: select ) . ' , 1 ] )' )
95- call win_execute ( s: popup_id ,
96- \ ' set cursorline cursorlineopt&' )
146+ call s: RedrawMenu ()
147+ return 1
148+ endif
149+ if a: key == " \<PageUp> " || a: key == " \<kPageUp> "
150+ let s: select -= pos.core_height
151+ if s: select < 1
152+ let s: select = 1
153+ endif
154+ call s: RedrawMenu ()
97155 return 1
98156 endif
99157 if a: key == " \<Down> " || a: key == " \<C-n> " || a: key == " \<C-j> " || a: key == " j"
100158 let s: select += 1
101159 if s: select > len ( s: lines_and_handles )
102160 let s: select = len ( s: lines_and_handles )
103161 endif
104- call win_execute ( s: popup_id ,
105- \ ' call cursor( [' . string ( s: select ) . ' , 1 ] )' )
106- call win_execute ( s: popup_id ,
107- \ ' set cursorline cursorlineopt&' )
162+ call s: RedrawMenu ()
163+ return 1
164+ endif
165+ if a: key == " \<PageDown> " || a: key == " \<kPageDown> "
166+ let s: select += pos.core_height
167+ if s: select > len ( s: lines_and_handles )
168+ let s: select = len ( s: lines_and_handles )
169+ endif
170+ call s: RedrawMenu ()
108171 return 1
109172 endif
110173 if index ( s: ingored_keys , a: key ) >= 0
@@ -125,14 +188,15 @@ function! s:MenuCallback( winid, result )
125188 call s: ResolveItem ( selection , ' down' , a: result [ 2 ] )
126189 elseif operation == ' resolve_up'
127190 call s: ResolveItem ( selection , ' up' , a: result [ 2 ] )
191+ elseif operation == ' resolve_close'
192+ call s: ResolveItem ( selection , ' close' , a: result [ 2 ] )
193+ elseif operation == ' resolve_remove'
194+ call s: ResolveItem ( selection , ' remove' , a: result [ 2 ] )
128195 else
129196 if operation == ' jump'
130197 let handle = s: lines_and_handles [ selection ][ 1 ]
131198 py3 ycm_state.JumpToHierarchyItem ( vimsupport.GetIntValue ( " handle" ) )
132199 endif
133- py3 ycm_state.ResetCurrentHierarchy ()
134- let s: kind = ' '
135- let s: select = 1
136200 endif
137201endfunction
138202
@@ -208,6 +272,7 @@ function! s:SetUpMenu()
208272 \ . " \t "
209273 \ .. trunc_desc
210274 call add ( menu_lines, { ' text' : line , ' props' : props } )
275+
211276 endfor
212277 call win_execute ( s: popup_id ,
213278 \ ' setlocal tabstop=' . tabstop )
0 commit comments