summaryrefslogtreecommitdiffstats
path: root/runtime/autoload
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-08-22 19:21:47 +0200
committerBram Moolenaar <Bram@vim.org>2014-08-22 19:21:47 +0200
commitfb539273c95f95e18e9542c2de3318b1b1e73db6 (patch)
tree9b435b3ca96881d563c9416fc876939d0d3f92b6 /runtime/autoload
parentd2e8087b532e676cc513a2b385deaf1bf7afbf94 (diff)
Updated runtime files.
Diffstat (limited to 'runtime/autoload')
-rw-r--r--runtime/autoload/phpcomplete.vim121
1 files changed, 101 insertions, 20 deletions
diff --git a/runtime/autoload/phpcomplete.vim b/runtime/autoload/phpcomplete.vim
index 0bdcd5d5fb..c00e55cc1e 100644
--- a/runtime/autoload/phpcomplete.vim
+++ b/runtime/autoload/phpcomplete.vim
@@ -3,7 +3,7 @@
" Maintainer: Dávid Szabó ( complex857 AT gmail DOT com )
" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
" URL: https://github.com/shawncplus/phpcomplete.vim
-" Last Change: 2014 May 30
+" Last Change: 2014 Jul 24
"
" OPTIONS:
"
@@ -277,7 +277,7 @@ endfunction
" }}}
function! phpcomplete#CompleteGeneral(base, current_namespace, imports) " {{{
- " Complete everything else -
+ " Complete everything
" + functions, DONE
" + keywords of language DONE
" + defines (constant definitions), DONE
@@ -949,12 +949,11 @@ function! phpcomplete#CompleteUserClass(context, base, sccontent, visibility) "
endif
endfor
- let jvars = join(variables, ' ')
- let svars = split(jvars, '\$')
+ let static_vars = split(join(variables, ' '), '\$')
let c_variables = {}
let var_index = 0
- for i in svars
+ for i in static_vars
let c_var = matchstr(i,
\ '^\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
if c_var != ''
@@ -1083,7 +1082,6 @@ endfunction
" }}}
function! phpcomplete#GetTaglist(pattern) " {{{
-
let cache_checksum = ''
if g:phpcomplete_cache_taglists == 1
" build a string with format of "<tagfile>:<mtime>$<tagfile2>:<mtime2>..."
@@ -1447,6 +1445,7 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
" Get class name
" Class name can be detected in few ways:
" @var $myVar class
+ " @var class $myVar
" in the same line (php 5.4 (new Class)-> syntax)
" line above
" or line in tags file
@@ -1525,6 +1524,11 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let object_is_array = (object =~ '\v^[^[]+\[' ? 1 : 0)
let object = matchstr(object, variable_name_pattern)
+ let function_boundary = phpcomplete#GetCurrentFunctionBoundaries()
+ let search_end_line = max([1, function_boundary[0][0]])
+ " -1 makes us ignore the current line (where the completion was invoked
+ let lines = reverse(getline(search_end_line, line('.') - 1))
+
" check Constant lookup
let constant_object = matchstr(a:context, '\zs'.class_name_pattern.'\ze::')
if constant_object != ''
@@ -1533,21 +1537,20 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
if classname_candidate == ''
" scan the file backwards from current line for explicit type declaration (@var $variable Classname)
- let i = 1 " start from the current line - 1
- while i < a:start_line
- let line = getline(a:start_line - i)
+ for line in lines
" in file lookup for /* @var $foo Class */
if line =~# '@var\s\+'.object.'\s\+'.class_name_pattern
let classname_candidate = matchstr(line, '@var\s\+'.object.'\s\+\zs'.class_name_pattern.'\(\[\]\)\?')
let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
break
- elseif line !~ '^\s*$'
- " type indicator comments should be next to the variable
- " non empty lines break the search
+ endif
+ " in file lookup for /* @var Class $foo */
+ if line =~# '@var\s\+'.class_name_pattern.'\s\+'.object
+ let classname_candidate = matchstr(line, '@var\s\+\zs'.class_name_pattern.'\(\[\]\)\?\ze'.'\s\+'.object)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
break
endif
- let i += 1
- endwhile
+ endfor
endif
if classname_candidate != ''
@@ -1555,12 +1558,9 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
" return absolute classname, without leading \
return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
endif
-
" scan the file backwards from the current line
let i = 1
- while i < a:start_line " {{{
- let line = getline(a:start_line - i)
-
+ for line in lines " {{{
" do in-file lookup of $var = new Class
if line =~# '^\s*'.object.'\s*=\s*new\s\+'.class_name_pattern && !object_is_array
let classname_candidate = matchstr(line, object.'\c\s*=\s*new\s*\zs'.class_name_pattern.'\ze')
@@ -1722,7 +1722,7 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
endif
let i += 1
- endwhile " }}}
+ endfor " }}}
if classname_candidate != ''
let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack)
@@ -1962,7 +1962,9 @@ function! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_nam
let namespace = '\'
endif
let classlocation = phpcomplete#GetClassLocation(extends_class, namespace)
- if classlocation != '' && filereadable(classlocation)
+ if classlocation == "VIMPHP_BUILTINOBJECT"
+ let result += [phpcomplete#GenerateBuiltinClassStub(g:php_builtin_classes[tolower(extends_class)])]
+ elseif classlocation != '' && filereadable(classlocation)
let full_file_path = fnamemodify(classlocation, ':p')
let result += phpcomplete#GetClassContentsStructure(full_file_path, readfile(full_file_path), extends_class)
elseif tolower(current_namespace) == tolower(namespace)
@@ -1985,6 +1987,51 @@ function! phpcomplete#GetClassContents(classlocation, class_name) " {{{
endfunction
" }}}
+function! phpcomplete#GenerateBuiltinClassStub(class_info) " {{{
+ let re = 'class '.a:class_info['name']." {"
+ for [name, initializer] in items(a:class_info.constants)
+ let re .= "\n\tconst ".name." = ".initializer.";"
+ endfor
+ for [name, info] in items(a:class_info.properties)
+ let re .= "\n\t// @var $".name." ".info.type
+ let re .= "\n\tpublic $".name.";"
+ endfor
+ for [name, info] in items(a:class_info.static_properties)
+ let re .= "\n\t// @var ".name." ".info.type
+ let re .= "\n\tpublic static ".name." = ".info.initializer.";"
+ endfor
+ for [name, info] in items(a:class_info.methods)
+ if name =~ '^__'
+ continue
+ endif
+ let re .= "\n\t/**"
+ let re .= "\n\t * ".name
+ let re .= "\n\t *"
+ let re .= "\n\t * @return ".info.return_type
+ let re .= "\n\t */"
+ let re .= "\n\tpublic function ".name."(".info.signature."){"
+ let re .= "\n\t}"
+ endfor
+ for [name, info] in items(a:class_info.static_methods)
+ let re .= "\n\t/**"
+ let re .= "\n\t * ".name
+ let re .= "\n\t *"
+ let re .= "\n\t * @return ".info.return_type
+ let re .= "\n\t */"
+ let re .= "\n\tpublic static function ".name."(".info.signature."){"
+ let re .= "\n\t}"
+ endfor
+ let re .= "\n}"
+
+ return { 'class': a:class_info['name'],
+ \ 'content': re,
+ \ 'namespace': '',
+ \ 'imports': {},
+ \ 'file': 'VIMPHP_BUILTINOBJECT',
+ \ 'mtime': 0,
+ \ }
+endfunction " }}}
+
function! phpcomplete#GetDocBlock(sccontent, search) " {{{
let i = 0
let l = 0
@@ -2307,6 +2354,40 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
endfunction
" }}}
+function! phpcomplete#GetCurrentFunctionBoundaries() " {{{
+ let old_cursor_pos = [line('.'), col('.')]
+ let current_line_no = old_cursor_pos[0]
+ let function_pattern = '\c\(.*\%#\)\@!\_^\s*\zs\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\_.\{-}(\_.\{-})\_.\{-}{'
+
+ let func_start_pos = searchpos(function_pattern, 'Wbc')
+ if func_start_pos == [0, 0]
+ call cursor(old_cursor_pos[0], old_cursor_pos[1])
+ return 0
+ endif
+
+ " get the line where the function declaration actually started
+ call search('\cfunction\_.\{-}(\_.\{-})\_.\{-}{', 'Wce')
+
+ " get the position of the function block's closing "}"
+ let func_end_pos = searchpairpos('{', '', '}', 'W')
+ if func_end_pos == [0, 0]
+ " there is a function start but no end found, assume that we are in a
+ " function but the user did not typed the closing "}" yet and the
+ " function runs to the end of the file
+ let func_end_pos = [line('$'), len(getline(line('$')))]
+ endif
+
+ " Decho func_start_pos[0].' <= '.current_line_no.' && '.current_line_no.' <= '.func_end_pos[0]
+ if func_start_pos[0] <= current_line_no && current_line_no <= func_end_pos[0]
+ call cursor(old_cursor_pos[0], old_cursor_pos[1])
+ return [func_start_pos, func_end_pos]
+ endif
+
+ call cursor(old_cursor_pos[0], old_cursor_pos[1])
+ return 0
+endfunction
+" }}}
+
function! phpcomplete#ExpandClassName(classname, current_namespace, imports) " {{{
" if there's an imported class, just use that class's information
if has_key(a:imports, a:classname) && (a:imports[a:classname].kind == 'c' || a:imports[a:classname].kind == 'i')