annotate runtime/autoload/ccomplete.vim @ 610:cd3689efd90a v7.0173

updated for version 7.0173
author vimboss
date Sun, 18 Dec 2005 22:10:00 +0000
parents f43150a669dc
children 9032e4668296
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
1 " Vim completion script
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
2 " Language: C
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
3 " Maintainer: Bram Moolenaar <Bram@vim.org>
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 548
diff changeset
4 " Last Change: 2005 Dec 18
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
5
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
6
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
7 " This function is used for the 'omnifunc' option.
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
8 function! ccomplete#Complete(findstart, base)
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
9 if a:findstart
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
10 " Locate the start of the item, including "." and "->".
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
11 let line = getline('.')
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
12 let start = col('.') - 1
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
13 let lastword = -1
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
14 while start > 0
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
15 if line[start - 1] =~ '\w'
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
16 let start -= 1
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
17 elseif line[start - 1] =~ '\.'
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
18 if lastword == -1
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
19 let lastword = start
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
20 endif
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
21 let start -= 1
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
22 elseif start > 1 && line[start - 2] == '-' && line[start - 1] == '>'
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
23 if lastword == -1
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
24 let lastword = start
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
25 endif
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
26 let start -= 2
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
27 else
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
28 break
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
29 endif
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
30 endwhile
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
31
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
32 " Return the column of the last word, which is going to be changed.
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
33 " Remember the text that comes before it in s:prepended.
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
34 if lastword == -1
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
35 let s:prepended = ''
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
36 return start
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
37 endif
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
38 let s:prepended = strpart(line, start, lastword - start)
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
39 return lastword
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
40 endif
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
41
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
42 " Return list of matches.
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
43
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
44 let base = s:prepended . a:base
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
45
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
46 " Split item in words, keep empty word after "." or "->".
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
47 " "aa" -> ['aa'], "aa." -> ['aa', ''], "aa.bb" -> ['aa', 'bb'], etc.
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
48 let items = split(base, '\.\|->', 1)
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
49 if len(items) <= 1
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
50 " Don't do anything for an empty base, would result in all the tags in the
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
51 " tags file.
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
52 if base == ''
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
53 return []
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
54 endif
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
55
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
56 " Only one part, no "." or "->": complete from tags file.
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
57 " When local completion is wanted CTRL-N would have been used.
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
58 return map(taglist('^' . base), 'v:val["name"]')
502
52e76e2b5b65 updated for version 7.0140
vimboss
parents:
diff changeset
59 endif
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
60
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
61 " Find the variable items[0].
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
62 " 1. in current function (like with "gd")
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
63 " 2. in tags file(s) (like with ":tag")
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
64 " 3. in current file (like with "gD")
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
65 let res = []
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
66 if searchdecl(items[0], 0, 1) == 0
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
67 " Found, now figure out the type.
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
68 " TODO: join previous line if it makes sense
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
69 let line = getline('.')
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
70 let col = col('.')
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
71 let res = s:Nextitem(strpart(line, 0, col), items[1:])
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
72 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
73
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
74 if len(res) == 0
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
75 " Find the variable in the tags file(s)
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
76 let diclist = taglist('^' . items[0] . '$')
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
77
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
78 let res = []
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
79 for i in range(len(diclist))
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
80 " New ctags has the "typename" field.
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
81 if has_key(diclist[i], 'typename')
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
82 call extend(res, s:StructMembers(diclist[i]['typename'], items[1:]))
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
83 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
84
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
85 " For a variable use the command, which must be a search pattern that
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
86 " shows the declaration of the variable.
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
87 if diclist[i]['kind'] == 'v'
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
88 let line = diclist[i]['cmd']
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
89 if line[0] == '/' && line[1] == '^'
610
cd3689efd90a updated for version 7.0173
vimboss
parents: 548
diff changeset
90 let col = match(line, '\<' . items[0] . '\>')
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
91 call extend(res, s:Nextitem(strpart(line, 2, col - 2), items[1:]))
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
92 endif
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
93 endif
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
94 endfor
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
95 endif
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
96
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
97 if len(res) == 0 && searchdecl(items[0], 1) == 0
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
98 " Found, now figure out the type.
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
99 " TODO: join previous line if it makes sense
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
100 let line = getline('.')
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
101 let col = col('.')
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
102 let res = s:Nextitem(strpart(line, 0, col), items[1:])
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
103 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
104
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
105 " If the one and only match was what's already there and it is a composite
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
106 " type, add a "." or "->".
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
107 if len(res) == 1 && res[0]['match'] == items[-1] && len(s:SearchMembers(res, [''])) > 0
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
108 " If there is a '*' before the name use "->".
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
109 if match(res[0]['tagline'], '\*\s*' . res[0]['match']) > 0
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
110 let res[0]['match'] .= '->'
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
111 else
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
112 let res[0]['match'] .= '.'
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
113 endif
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
114 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
115
548
f43150a669dc updated for version 7.0155
vimboss
parents: 523
diff changeset
116 return map(res, 'v:val["match"]')
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
117 endfunc
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
118
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
119 " Find composing type in "lead" and match items[0] with it.
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
120 " Repeat this recursively for items[1], if it's there.
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
121 " Return the list of matches.
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
122 function! s:Nextitem(lead, items)
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
123
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
124 " Use the text up to the variable name and split it in tokens.
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
125 let tokens = split(a:lead, '\s\+\|\<')
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
126
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
127 " Try to recognize the type of the variable. This is rough guessing...
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
128 let res = []
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
129 for tidx in range(len(tokens))
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
130
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
131 " Recognize "struct foobar" and "union foobar".
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
132 if (tokens[tidx] == 'struct' || tokens[tidx] == 'union') && tidx + 1 < len(tokens)
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
133 let res = s:StructMembers(tokens[tidx] . ':' . tokens[tidx + 1], a:items)
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
134 break
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
135 endif
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
136
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
137 " TODO: add more reserved words
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
138 if index(['int', 'float', 'static', 'unsigned', 'extern'], tokens[tidx]) >= 0
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
139 continue
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
140 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
141
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
142 " Use the tags file to find out if this is a typedef.
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
143 let diclist = taglist('^' . tokens[tidx] . '$')
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
144 for tagidx in range(len(diclist))
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
145 " New ctags has the "typename" field.
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
146 if has_key(diclist[tagidx], 'typename')
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
147 call extend(res, s:StructMembers(diclist[tagidx]['typename'], a:items))
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
148 continue
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
149 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
150
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
151 " Only handle typedefs here.
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
152 if diclist[tagidx]['kind'] != 't'
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
153 continue
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
154 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
155
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
156 " For old ctags we recognize "typedef struct aaa" and
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
157 " "typedef union bbb" in the tags file command.
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
158 let cmd = diclist[tagidx]['cmd']
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
159 let ei = matchend(cmd, 'typedef\s\+')
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
160 if ei > 1
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
161 let cmdtokens = split(strpart(cmd, ei), '\s\+\|\<')
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
162 if len(cmdtokens) > 1
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
163 if cmdtokens[0] == 'struct' || cmdtokens[0] == 'union'
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
164 let name = ''
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
165 " Use the first identifier after the "struct" or "union"
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
166 for ti in range(len(cmdtokens) - 1)
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
167 if cmdtokens[ti] =~ '^\w'
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
168 let name = cmdtokens[ti]
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
169 break
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
170 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
171 endfor
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
172 if name != ''
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
173 call extend(res, s:StructMembers(cmdtokens[0] . ':' . name, a:items))
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
174 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
175 else
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
176 " Could be "typedef other_T some_T".
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
177 call extend(res, s:Nextitem(cmdtokens[0], a:items))
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
178 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
179 endif
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
180 endif
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
181 endfor
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
182 if len(res) > 0
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
183 break
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
184 endif
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
185 endfor
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
186
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
187 return res
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
188 endfunction
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
189
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
190
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
191 " Return a list with resulting matches.
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
192 " Each match is a dictionary with "match" and "tagline" entries.
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
193 function! s:StructMembers(typename, items)
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
194 " Todo: What about local structures?
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
195 let fnames = join(map(tagfiles(), 'escape(v:val, " \\")'))
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
196 if fnames == ''
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
197 return []
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
198 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
199
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
200 let typename = a:typename
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
201 let qflist = []
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
202 while 1
520
07134f5e78da updated for version 7.0145
vimboss
parents: 516
diff changeset
203 exe 'silent! vimgrep /\t' . typename . '\(\t\|$\)/j ' . fnames
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
204 let qflist = getqflist()
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
205 if len(qflist) > 0 || match(typename, "::") < 0
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
206 break
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
207 endif
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
208 " No match for "struct:context::name", remove "context::" and try again.
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
209 let typename = substitute(typename, ':[^:]*::', ':', '')
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
210 endwhile
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
211
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
212 let matches = []
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
213 for l in qflist
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
214 let memb = matchstr(l['text'], '[^\t]*')
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
215 if memb =~ '^' . a:items[0]
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
216 call add(matches, {'match': memb, 'tagline': l['text']})
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
217 endif
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
218 endfor
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
219
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
220 if len(matches) > 0
516
b7abd41f91da updated for version 7.0144
vimboss
parents: 511
diff changeset
221 " No further items, return the result.
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
222 if len(a:items) == 1
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
223 return matches
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
224 endif
505
7e6d264ec0a2 updated for version 7.0141
vimboss
parents: 502
diff changeset
225
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
226 " More items following. For each of the possible members find the
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
227 " matching following members.
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
228 return s:SearchMembers(matches, a:items[1:])
511
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
229 endif
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
230
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
231 " Failed to find anything.
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
232 return []
32cf0d2e14b4 updated for version 7.0143
vimboss
parents: 505
diff changeset
233 endfunction
523
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
234
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
235 " For matching members, find matches for following items.
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
236 function! s:SearchMembers(matches, items)
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
237 let res = []
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
238 for i in range(len(a:matches))
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
239 let line = a:matches[i]['tagline']
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
240 let e = matchend(line, '\ttypename:')
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
241 if e > 0
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
242 " Use typename field
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
243 let name = matchstr(line, '[^\t]*', e)
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
244 call extend(res, s:StructMembers(name, a:items))
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
245 else
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
246 " Use the search command (the declaration itself).
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
247 let s = match(line, '\t\zs/^')
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
248 if s > 0
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
249 let e = match(line, a:matches[i]['match'], s)
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
250 if e > 0
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
251 call extend(res, s:Nextitem(strpart(line, s, e - s), a:items))
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
252 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
253 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
254 endif
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
255 endfor
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
256 return res
a7ae7e043e43 updated for version 7.0146
vimboss
parents: 520
diff changeset
257 endfunc