|
3 | 3 | " Maintainer: Dávid Szabó ( complex857 AT gmail DOT com ) |
4 | 4 | " Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) |
5 | 5 | " URL: https://github.com/shawncplus/phpcomplete.vim |
6 | | -" Last Change: 2015 Feb 28 |
| 6 | +" Last Change: 2015 Apr 02 |
7 | 7 | " |
8 | 8 | " OPTIONS: |
9 | 9 | " |
@@ -141,71 +141,80 @@ function! phpcomplete#CompletePHP(findstart, base) " {{{ |
141 | 141 | if a:base != "" |
142 | 142 | let context = substitute(context, '\s*[$a-zA-Z_0-9\x7f-\xff]*$', '', '') |
143 | 143 | end |
| 144 | + else |
| 145 | + let context = '' |
144 | 146 | end |
145 | 147 |
|
146 | | - let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(getline(0, line('.'))) |
| 148 | + try |
| 149 | + let winheight = winheight(0) |
| 150 | + let winnr = winnr() |
147 | 151 |
|
148 | | - if context =~? '^use\s' || context ==? 'use' |
149 | | - return phpcomplete#CompleteUse(a:base) |
150 | | - endif |
| 152 | + let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(getline(0, line('.'))) |
151 | 153 |
|
152 | | - if context =~ '\(->\|::\)$' |
153 | | - " {{{ |
154 | | - " Get name of the class |
155 | | - let classname = phpcomplete#GetClassName(line('.'), context, current_namespace, imports) |
156 | | - |
157 | | - " Get location of class definition, we have to iterate through all |
158 | | - if classname != '' |
159 | | - if classname =~ '\' |
160 | | - " split the last \ segment as a classname, everything else is the namespace |
161 | | - let classname_parts = split(classname, '\') |
162 | | - let namespace = join(classname_parts[0:-2], '\') |
163 | | - let classname = classname_parts[-1] |
164 | | - else |
165 | | - let namespace = '\' |
166 | | - endif |
167 | | - let classlocation = phpcomplete#GetClassLocation(classname, namespace) |
168 | | - else |
169 | | - let classlocation = '' |
| 154 | + if context =~? '^use\s' || context ==? 'use' |
| 155 | + return phpcomplete#CompleteUse(a:base) |
170 | 156 | endif |
171 | 157 |
|
172 | | - if classlocation != '' |
173 | | - if classlocation == 'VIMPHP_BUILTINOBJECT' && has_key(g:php_builtin_classes, tolower(classname)) |
174 | | - return phpcomplete#CompleteBuiltInClass(context, classname, a:base) |
| 158 | + if context =~ '\(->\|::\)$' |
| 159 | + " {{{ |
| 160 | + " Get name of the class |
| 161 | + let classname = phpcomplete#GetClassName(line('.'), context, current_namespace, imports) |
| 162 | + |
| 163 | + " Get location of class definition, we have to iterate through all |
| 164 | + if classname != '' |
| 165 | + if classname =~ '\' |
| 166 | + " split the last \ segment as a classname, everything else is the namespace |
| 167 | + let classname_parts = split(classname, '\') |
| 168 | + let namespace = join(classname_parts[0:-2], '\') |
| 169 | + let classname = classname_parts[-1] |
| 170 | + else |
| 171 | + let namespace = '\' |
| 172 | + endif |
| 173 | + let classlocation = phpcomplete#GetClassLocation(classname, namespace) |
| 174 | + else |
| 175 | + let classlocation = '' |
175 | 176 | endif |
176 | 177 |
|
177 | | - if filereadable(classlocation) |
178 | | - let classfile = readfile(classlocation) |
179 | | - let classcontent = '' |
180 | | - let classcontent .= "\n".phpcomplete#GetClassContents(classlocation, classname) |
181 | | - let sccontent = split(classcontent, "\n") |
182 | | - let visibility = expand('%:p') == fnamemodify(classlocation, ':p') ? 'private' : 'public' |
| 178 | + if classlocation != '' |
| 179 | + if classlocation == 'VIMPHP_BUILTINOBJECT' && has_key(g:php_builtin_classes, tolower(classname)) |
| 180 | + return phpcomplete#CompleteBuiltInClass(context, classname, a:base) |
| 181 | + endif |
183 | 182 |
|
184 | | - return phpcomplete#CompleteUserClass(context, a:base, sccontent, visibility) |
185 | | - endif |
186 | | - endif |
| 183 | + if filereadable(classlocation) |
| 184 | + let classfile = readfile(classlocation) |
| 185 | + let classcontent = '' |
| 186 | + let classcontent .= "\n".phpcomplete#GetClassContents(classlocation, classname) |
| 187 | + let sccontent = split(classcontent, "\n") |
| 188 | + let visibility = expand('%:p') == fnamemodify(classlocation, ':p') ? 'private' : 'public' |
187 | 189 |
|
188 | | - return phpcomplete#CompleteUnknownClass(a:base, context) |
189 | | - " }}} |
190 | | - elseif context =~? 'implements' |
191 | | - return phpcomplete#CompleteClassName(a:base, ['i'], current_namespace, imports) |
192 | | - elseif context =~? 'extends\s\+.\+$' && a:base == '' |
193 | | - return ['implements'] |
194 | | - elseif context =~? 'extends' |
195 | | - let kinds = context =~? 'class\s' ? ['c'] : ['i'] |
196 | | - return phpcomplete#CompleteClassName(a:base, kinds, current_namespace, imports) |
197 | | - elseif context =~? 'class [a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' |
198 | | - " special case when you've typed the class keyword and the name too, only extends and implements allowed there |
199 | | - return filter(['extends', 'implements'], 'stridx(v:val, a:base) == 0') |
200 | | - elseif context =~? 'new' |
201 | | - return phpcomplete#CompleteClassName(a:base, ['c'], current_namespace, imports) |
202 | | - endif |
| 190 | + return phpcomplete#CompleteUserClass(context, a:base, sccontent, visibility) |
| 191 | + endif |
| 192 | + endif |
203 | 193 |
|
204 | | - if a:base =~ '^\$' |
205 | | - return phpcomplete#CompleteVariable(a:base) |
206 | | - else |
207 | | - return phpcomplete#CompleteGeneral(a:base, current_namespace, imports) |
208 | | - endif |
| 194 | + return phpcomplete#CompleteUnknownClass(a:base, context) |
| 195 | + " }}} |
| 196 | + elseif context =~? 'implements' |
| 197 | + return phpcomplete#CompleteClassName(a:base, ['i'], current_namespace, imports) |
| 198 | + elseif context =~? 'extends\s\+.\+$' && a:base == '' |
| 199 | + return ['implements'] |
| 200 | + elseif context =~? 'extends' |
| 201 | + let kinds = context =~? 'class\s' ? ['c'] : ['i'] |
| 202 | + return phpcomplete#CompleteClassName(a:base, kinds, current_namespace, imports) |
| 203 | + elseif context =~? 'class [a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' |
| 204 | + " special case when you've typed the class keyword and the name too, only extends and implements allowed there |
| 205 | + return filter(['extends', 'implements'], 'stridx(v:val, a:base) == 0') |
| 206 | + elseif context =~? 'new' |
| 207 | + return phpcomplete#CompleteClassName(a:base, ['c'], current_namespace, imports) |
| 208 | + endif |
| 209 | + |
| 210 | + if a:base =~ '^\$' |
| 211 | + return phpcomplete#CompleteVariable(a:base) |
| 212 | + else |
| 213 | + return phpcomplete#CompleteGeneral(a:base, current_namespace, imports) |
| 214 | + endif |
| 215 | + finally |
| 216 | + silent! exec winnr.'resize '.winheight |
| 217 | + endtry |
209 | 218 | endfunction |
210 | 219 | " }}} |
211 | 220 |
|
@@ -1523,21 +1532,19 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor |
1523 | 1532 | return '' |
1524 | 1533 | endif |
1525 | 1534 |
|
1526 | | - if line =~? '\v^\s*(abstract\s+|final\s+)*\s*class' |
1527 | | - let class_name = matchstr(line, '\c\s*class\s*\zs'.class_name_pattern.'\ze') |
| 1535 | + if line =~? '\v^\s*(abstract\s+|final\s+)*\s*class\s' |
| 1536 | + let class_name = matchstr(line, '\cclass\s\+\zs'.class_name_pattern.'\ze') |
1528 | 1537 | let extended_class = matchstr(line, '\cclass\s\+'.class_name_pattern.'\s\+extends\s\+\zs'.class_name_pattern.'\ze') |
1529 | 1538 |
|
1530 | 1539 | let classname_candidate = a:context =~? 'parent::' ? extended_class : class_name |
1531 | | - else |
1532 | | - let i += 1 |
1533 | | - continue |
| 1540 | + if classname_candidate != '' |
| 1541 | + let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) |
| 1542 | + " return absolute classname, without leading \ |
| 1543 | + return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate |
| 1544 | + endif |
1534 | 1545 | endif |
1535 | 1546 |
|
1536 | | - if classname_candidate != '' |
1537 | | - let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) |
1538 | | - " return absolute classname, without leading \ |
1539 | | - return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate |
1540 | | - endif |
| 1547 | + let i += 1 |
1541 | 1548 | endwhile |
1542 | 1549 | elseif a:context =~? '(\s*new\s\+'.class_name_pattern.'\s*)->' |
1543 | 1550 | let classname_candidate = matchstr(a:context, '\cnew\s\+\zs'.class_name_pattern.'\ze') |
@@ -2031,7 +2038,7 @@ function! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_nam |
2031 | 2038 | " remember the window we started at |
2032 | 2039 | let phpcomplete_original_window = winnr() |
2033 | 2040 |
|
2034 | | - silent! tab 1new |
| 2041 | + silent! below 1new |
2035 | 2042 | silent! 0put =cfile |
2036 | 2043 | call search('\c\(class\|interface\|trait\)\_s\+'.a:class_name.'\(\>\|$\)') |
2037 | 2044 | let cfline = line('.') |
@@ -2370,7 +2377,7 @@ endfunction! |
2370 | 2377 | function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{ |
2371 | 2378 | let original_window = winnr() |
2372 | 2379 |
|
2373 | | - silent! tab 1new |
| 2380 | + silent! below 1new |
2374 | 2381 | silent! 0put =a:file_lines |
2375 | 2382 | normal! G |
2376 | 2383 |
|
|
0 commit comments