@@ -16,13 +16,42 @@ endfunction
1616" let g:ConqueTerm_CloseOnEnd=1
1717" let g:alchemist_iex_term_size = 15
1818
19+
20+
1921function ! vimide#elixir#tagbarFilter (tags ) " {{{
20- " remove OTP callbacks from ordinary function list
21- call filter (a: tags , ' !(v:val.fields.kind == "f" && v:val.name =~ "\\v(handle_call|handle_info|handle_cast|init|terminate)") ' )
2222
23- function ! Arity_extract (idx, tag )
24- if a: tag .fields.kind == ' f' || a: tag .fields.kind == ' g'
25- let args_string = substitute (a: tag .pattern, " ^.*defp\\ ?[ \t ]*" .a: tag .name." [ \t ]*" , " " , " " )
23+ function ! SkipOTPCallbackAsFunction (index , line )
24+ if a: line = ~# ' ^!_TAG_'
25+ return 1
26+ endif
27+
28+ let parts = split (a: line , ' ;"' )
29+ if len (parts) != 2 " Is a valid tag line
30+ return 1
31+ endif
32+
33+ let [name, fname, pattern] = split (parts[0 ], ' \t' )
34+ let fields = split (parts[1 ], ' \t' )
35+
36+ return ! (fields[0 ] == ' f' && name = ~ " \\ v(handle_call|handle_info|handle_cast|init|terminate)" )
37+ endfunction
38+
39+ function ! ArityExtract (idx, line )
40+ if a: line = ~# ' ^!_TAG_'
41+ return line
42+ endif
43+
44+ let parts = split (a: line , ' ;"' )
45+ if len (parts) != 2 " Is a valid tag line
46+ return line
47+ endif
48+
49+ let [name, fname, pattern] = split (parts[0 ], ' \t' )
50+ let fields = split (parts[1 ], ' \t' )
51+ let kind = fields[0 ]
52+
53+ if kind == ' f' || kind == ' g'
54+ let args_string = substitute (pattern, " ^.*defp\\ ?[ \t ]*" .name." [ \t ]*" , " " , " " )
2655 let args_string = substitute (args_string, " do[ \t ]*\\\\ [$]$" , " " , " " ) " multiline
2756" TODO: remove
2857" if a:tag.pattern =~ "defp reply"
@@ -34,7 +63,7 @@ function! vimide#elixir#tagbarFilter(tags) " {{{
3463 let args_len = len (args_string)
3564
3665 if args_len == 0
37- let a: tag . name = a: tag . name." /0"
66+ let name = name." /0"
3867 else
3968 let old_args_len = -10000
4069 while args_len != old_args_len
@@ -45,17 +74,78 @@ function! vimide#elixir#tagbarFilter(tags) " {{{
4574 endwhile
4675
4776 let comma_count = len (substitute (args_string, " [^,]" , " " , " g" ))
48- let a: tag . name = a: tag . name . " /" . (comma_count + 1 )
77+ let name = name . " /" . (comma_count + 1 )
4978 endif
5079
51- return a: tag
80+ let new_line = join ([ join ([name, fname, pattern], " \t " ), parts[1 ] ], ' ;"' )
81+
82+ return new_line
5283 else
53- return a: tag
84+ return a: line
5485 endif
5586 endfunction
5687
88+ function ! ParseKindNameLine (line )
89+ if a: line = ~# ' ^!_TAG_'
90+ return []
91+ endif
92+
93+ let parts = split (a: line , ' ;"' )
94+ if len (parts) != 2 " Is a valid tag line
95+ return []
96+ endif
97+
98+ let [name, fname, pattern] = split (parts[0 ], ' \t' )
99+ let fields = split (parts[1 ], ' \t' )
100+ let kind = fields[0 ]
101+ let line_no = fields[1 ]
102+
103+ if line_no !~ ' ^line:\d\+'
104+ return []
105+ endif
106+
107+ let line_no = split (line_no, ' :' )
108+
109+ return [ kind, name, line_no[1 ] ]
110+ endfunction
111+
112+ " remove OTP callbacks from ordinary function list
113+ call filter (a: tags , function (" SkipOTPCallbackAsFunction" ))
114+
57115 " replaces function names with function_name/arity notation
58- call map (a: tags , function (' Arity_extract' ))
116+ call map (a: tags , function (' ArityExtract' ))
117+
118+ " ---------- create list of first lines when we seen function name ----
119+ let seen_fnames = {}
120+ for line in a: tags
121+ let parsedLine = ParseKindNameLine (line )
122+ if parsedLine != []
123+ let [ kind, name, line_no ] = parsedLine
124+
125+ if ! has_key (seen_fnames, kind.name)
126+ let seen_fnames[kind.name] = line_no
127+ endif
128+ endif
129+ endfor
130+
131+ " leaves only first definition of function with same arity
132+ function ! FilterFun (seen_hash, idx, line )
133+ let parsedLine = ParseKindNameLine (a: line )
134+ if parsedLine != []
135+ let [ kind, name, line_no ] = parsedLine
136+ let key = kind . name
137+ return a: seen_hash [key ] == line_no
138+ endif
139+ endfunction
140+
141+ call filter (a: tags , function (' FilterFun' , [seen_fnames]))
142+
143+ return a: tags
144+ endfunction
145+
146+ function ! vimide#elixir#tagbarFilterOld (tags )
147+ " remove OTP callbacks from ordinary function list
148+
59149
60150 let seen_list = map (copy (a: tags ), ' [v:val.fields.kind, v:val.name, v:val.fields.line]' )
61151
@@ -77,7 +167,7 @@ function! vimide#elixir#tagbarFilter(tags) " {{{
77167 call filter (a: tags , function (' Filter_fun' , [seen_fnames]))
78168
79169 return a: tags
80- endfunction " }}}
170+ endfunction
81171
82172function ! vimide#elixir#installTagbarIntegration ()
83173 " ####################################################################
@@ -103,8 +193,7 @@ function! vimide#elixir#installTagbarIntegration()
103193 \ ' s:structs' ,
104194 \ ' p:protocols' ,
105195 \ ' r:records' ,
106- \ ' T:types' ,
107- \ ' z:foo'
196+ \ ' T:types'
108197 \ ]
109198 \ }
110199
@@ -162,3 +251,10 @@ function! s:setGlobal(name, default) " {{{
162251 endif
163252 endif
164253endfunction " }}}
254+
255+ " let s:var1 == readfile("")
256+ "
257+ " let rawtaglist = split(s:var1, '\n\+')
258+ "
259+
260+
0 commit comments