1362e1a30SBram Moolenaar" Vim completion script 2362e1a30SBram Moolenaar" Language: PHP 3a6878375SBram Moolenaar" Maintainer: Dávid Szabó ( complex857 AT gmail DOT com ) 4a6878375SBram Moolenaar" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) 5e968e36aSBram Moolenaar" URL: https://github.com/shawncplus/phpcomplete.vim 6942db23cSBram Moolenaar" Last Change: 2021 Feb 08 7a6878375SBram Moolenaar" 8a6878375SBram Moolenaar" OPTIONS: 9a6878375SBram Moolenaar" 10a6878375SBram Moolenaar" let g:phpcomplete_relax_static_constraint = 1/0 [default 0] 11a6878375SBram Moolenaar" Enables completion for non-static methods when completing for static context (::). 12*6c391a74SBram Moolenaar" This generates E_STRICT level warning, but php calls these methods nonetheless. 13a6878375SBram Moolenaar" 14a6878375SBram Moolenaar" let g:phpcomplete_complete_for_unknown_classes = 1/0 [default 0] 15a6878375SBram Moolenaar" Enables completion of variables and functions in "everything under the sun" fashion 16a6878375SBram Moolenaar" when completing for an instance or static class context but the code can't tell the class 17a6878375SBram Moolenaar" or locate the file that it lives in. 18a6878375SBram Moolenaar" The completion list generated this way is only filtered by the completion base 19a6878375SBram Moolenaar" and generally not much more accurate then simple keyword completion. 20a6878375SBram Moolenaar" 21a6878375SBram Moolenaar" let g:phpcomplete_search_tags_for_variables = 1/0 [default 0] 22a6878375SBram Moolenaar" Enables use of tags when the plugin tries to find variables. 23a6878375SBram Moolenaar" When enabled the plugin will search for the variables in the tag files with kind 'v', 24a6878375SBram Moolenaar" lines like $some_var = new Foo; but these usually yield highly inaccurate results and 25a6878375SBram Moolenaar" can be fairly slow. 26a6878375SBram Moolenaar" 27a6878375SBram Moolenaar" let g:phpcomplete_min_num_of_chars_for_namespace_completion = n [default 1] 28a6878375SBram Moolenaar" This option controls the number of characters the user needs to type before 29a6878375SBram Moolenaar" the tags will be searched for namespaces and classes in typed out namespaces in 30a6878375SBram Moolenaar" "use ..." context. Setting this to 0 is not recommended because that means the code 31*6c391a74SBram Moolenaar" have to scan every tag, and vim's taglist() function runs extremely slow with a 32a6878375SBram Moolenaar" "match everything" pattern. 33a6878375SBram Moolenaar" 34a6878375SBram Moolenaar" let g:phpcomplete_parse_docblock_comments = 1/0 [default 0] 35a6878375SBram Moolenaar" When enabled the preview window's content will include information 36a6878375SBram Moolenaar" extracted from docblock comments of the completions. 37a6878375SBram Moolenaar" Enabling this option will add return types to the completion menu for functions too. 38a6878375SBram Moolenaar" 39a6878375SBram Moolenaar" let g:phpcomplete_cache_taglists = 1/0 [default 1] 40a6878375SBram Moolenaar" When enabled the taglist() lookups will be cached and subsequent searches 41a6878375SBram Moolenaar" for the same pattern will not check the tagfiles any more, thus making the 42a6878375SBram Moolenaar" lookups faster. Cache expiration is based on the mtimes of the tag files. 43362e1a30SBram Moolenaar" 44ceaf7b8bSBram Moolenaar" TODO: 45ceaf7b8bSBram Moolenaar" - Switching to HTML (XML?) completion (SQL) inside of phpStrings 46b21e5843SBram Moolenaar" - allow also for XML completion <- better do html_flavor for HTML 47b21e5843SBram Moolenaar" completion 48362e1a30SBram Moolenaar" - outside of <?php?> getting parent tag may cause problems. Heh, even in 49362e1a30SBram Moolenaar" perfect conditions GetLastOpenTag doesn't cooperate... Inside of 50362e1a30SBram Moolenaar" phpStrings this can be even a bonus but outside of <?php?> it is not the 51362e1a30SBram Moolenaar" best situation 52362e1a30SBram Moolenaar 53a6878375SBram Moolenaarif !exists('g:phpcomplete_relax_static_constraint') 54a6878375SBram Moolenaar let g:phpcomplete_relax_static_constraint = 0 55a6878375SBram Moolenaarendif 56a6878375SBram Moolenaar 57a6878375SBram Moolenaarif !exists('g:phpcomplete_complete_for_unknown_classes') 58a6878375SBram Moolenaar let g:phpcomplete_complete_for_unknown_classes = 0 59a6878375SBram Moolenaarendif 60a6878375SBram Moolenaar 61a6878375SBram Moolenaarif !exists('g:phpcomplete_search_tags_for_variables') 62a6878375SBram Moolenaar let g:phpcomplete_search_tags_for_variables = 0 63a6878375SBram Moolenaarendif 64a6878375SBram Moolenaar 65a6878375SBram Moolenaarif !exists('g:phpcomplete_min_num_of_chars_for_namespace_completion') 66a6878375SBram Moolenaar let g:phpcomplete_min_num_of_chars_for_namespace_completion = 1 67a6878375SBram Moolenaarendif 68a6878375SBram Moolenaar 69a6878375SBram Moolenaarif !exists('g:phpcomplete_parse_docblock_comments') 70a6878375SBram Moolenaar let g:phpcomplete_parse_docblock_comments = 0 71a6878375SBram Moolenaarendif 72a6878375SBram Moolenaar 73a6878375SBram Moolenaarif !exists('g:phpcomplete_cache_taglists') 74a6878375SBram Moolenaar let g:phpcomplete_cache_taglists = 1 75a6878375SBram Moolenaarendif 76a6878375SBram Moolenaar 77a6878375SBram Moolenaarif !exists('s:cache_classstructures') 78a6878375SBram Moolenaar let s:cache_classstructures = {} 79a6878375SBram Moolenaarendif 80a6878375SBram Moolenaar 81a6878375SBram Moolenaarif !exists('s:cache_tags') 82a6878375SBram Moolenaar let s:cache_tags = {} 83a6878375SBram Moolenaarendif 84a6878375SBram Moolenaar 85a6878375SBram Moolenaarif !exists('s:cache_tags_checksum') 86a6878375SBram Moolenaar let s:cache_tags_checksum = '' 87a6878375SBram Moolenaarendif 88a6878375SBram Moolenaar 89a6878375SBram Moolenaarlet s:script_path = fnamemodify(resolve(expand('<sfile>:p')), ':h') 90a6878375SBram Moolenaar 91a6878375SBram Moolenaarfunction! phpcomplete#CompletePHP(findstart, base) " {{{ 92362e1a30SBram Moolenaar if a:findstart 93362e1a30SBram Moolenaar unlet! b:php_menu 94362e1a30SBram Moolenaar " Check if we are inside of PHP markup 95362e1a30SBram Moolenaar let pos = getpos('.') 96ceaf7b8bSBram Moolenaar let phpbegin = searchpairpos('<?', '', '?>', 'bWn', 9791e15e13SBram Moolenaar \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"') 98ceaf7b8bSBram Moolenaar let phpend = searchpairpos('<?', '', '?>', 'Wn', 9991e15e13SBram Moolenaar \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"') 100362e1a30SBram Moolenaar 101362e1a30SBram Moolenaar if phpbegin == [0,0] && phpend == [0,0] 102362e1a30SBram Moolenaar " We are outside of any PHP markup. Complete HTML 103362e1a30SBram Moolenaar let htmlbegin = htmlcomplete#CompleteTags(1, '') 104362e1a30SBram Moolenaar let cursor_col = pos[2] 105362e1a30SBram Moolenaar let base = getline('.')[htmlbegin : cursor_col] 106362e1a30SBram Moolenaar let b:php_menu = htmlcomplete#CompleteTags(0, base) 107362e1a30SBram Moolenaar return htmlbegin 108362e1a30SBram Moolenaar else 109362e1a30SBram Moolenaar " locate the start of the word 110362e1a30SBram Moolenaar let line = getline('.') 111362e1a30SBram Moolenaar let start = col('.') - 1 112362e1a30SBram Moolenaar let compl_begin = col('.') - 2 113a6878375SBram Moolenaar while start >= 0 && line[start - 1] =~ '[\\a-zA-Z_0-9\x7f-\xff$]' 114362e1a30SBram Moolenaar let start -= 1 115362e1a30SBram Moolenaar endwhile 116a6878375SBram Moolenaar let b:phpbegin = phpbegin 117822ff866SBram Moolenaar let b:compl_context = phpcomplete#GetCurrentInstruction(line('.'), max([0, col('.') - 2]), phpbegin) 118362e1a30SBram Moolenaar 119a6878375SBram Moolenaar return start 120362e1a30SBram Moolenaar " We can be also inside of phpString with HTML tags. Deal with 121e48ec1faSBram Moolenaar " it later (time, not lines). 122362e1a30SBram Moolenaar endif 123910f66f9SBram Moolenaar endif 124a6878375SBram Moolenaar 125362e1a30SBram Moolenaar " If exists b:php_menu it means completion was already constructed we 126362e1a30SBram Moolenaar " don't need to do anything more 127362e1a30SBram Moolenaar if exists("b:php_menu") 128362e1a30SBram Moolenaar return b:php_menu 129362e1a30SBram Moolenaar endif 130362e1a30SBram Moolenaar 131ceaf7b8bSBram Moolenaar if !exists('g:php_builtin_functions') 132ceaf7b8bSBram Moolenaar call phpcomplete#LoadData() 133ceaf7b8bSBram Moolenaar endif 134e48ec1faSBram Moolenaar 135a6878375SBram Moolenaar " a:base is very short - we need context 136a6878375SBram Moolenaar if exists("b:compl_context") 137a6878375SBram Moolenaar let context = b:compl_context 138a6878375SBram Moolenaar unlet! b:compl_context 139a6878375SBram Moolenaar " chop of the "base" from the end of the current instruction 140a6878375SBram Moolenaar if a:base != "" 141e968e36aSBram Moolenaar let context = substitute(context, '\s*[$a-zA-Z_0-9\x7f-\xff]*$', '', '') 142a6878375SBram Moolenaar end 14383d1b190SBram Moolenaar else 14483d1b190SBram Moolenaar let context = '' 145a6878375SBram Moolenaar end 146ceaf7b8bSBram Moolenaar 14783d1b190SBram Moolenaar try 1482c64ca18SBram Moolenaar let eventignore = &eventignore 1492c64ca18SBram Moolenaar let &eventignore = 'all' 15083d1b190SBram Moolenaar 151a6878375SBram Moolenaar let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(getline(0, line('.'))) 152e48ec1faSBram Moolenaar 153f3c2afb7SBram Moolenaar if context =~? '^use\s' || context ==? 'use' 154a6878375SBram Moolenaar return phpcomplete#CompleteUse(a:base) 15583e138c6SBram Moolenaar endif 156e48ec1faSBram Moolenaar 157a6878375SBram Moolenaar if context =~ '\(->\|::\)$' 158a6878375SBram Moolenaar " {{{ 159910f66f9SBram Moolenaar " Get name of the class 160a6878375SBram Moolenaar let classname = phpcomplete#GetClassName(line('.'), context, current_namespace, imports) 161910f66f9SBram Moolenaar 162910f66f9SBram Moolenaar " Get location of class definition, we have to iterate through all 163910f66f9SBram Moolenaar if classname != '' 164a6878375SBram Moolenaar if classname =~ '\' 165a6878375SBram Moolenaar " split the last \ segment as a classname, everything else is the namespace 166a6878375SBram Moolenaar let classname_parts = split(classname, '\') 167a6878375SBram Moolenaar let namespace = join(classname_parts[0:-2], '\') 168a6878375SBram Moolenaar let classname = classname_parts[-1] 169a6878375SBram Moolenaar else 170a6878375SBram Moolenaar let namespace = '\' 171a6878375SBram Moolenaar endif 172a6878375SBram Moolenaar let classlocation = phpcomplete#GetClassLocation(classname, namespace) 173910f66f9SBram Moolenaar else 174910f66f9SBram Moolenaar let classlocation = '' 175910f66f9SBram Moolenaar endif 176910f66f9SBram Moolenaar 177a6878375SBram Moolenaar if classlocation != '' 178a6878375SBram Moolenaar if classlocation == 'VIMPHP_BUILTINOBJECT' && has_key(g:php_builtin_classes, tolower(classname)) 179a6878375SBram Moolenaar return phpcomplete#CompleteBuiltInClass(context, classname, a:base) 18083e138c6SBram Moolenaar endif 18183e138c6SBram Moolenaar 182910f66f9SBram Moolenaar if filereadable(classlocation) 183910f66f9SBram Moolenaar let classcontent = '' 184a6878375SBram Moolenaar let classcontent .= "\n".phpcomplete#GetClassContents(classlocation, classname) 185910f66f9SBram Moolenaar let sccontent = split(classcontent, "\n") 186a6878375SBram Moolenaar let visibility = expand('%:p') == fnamemodify(classlocation, ':p') ? 'private' : 'public' 187910f66f9SBram Moolenaar 188a6878375SBram Moolenaar return phpcomplete#CompleteUserClass(context, a:base, sccontent, visibility) 189a6878375SBram Moolenaar endif 190a6878375SBram Moolenaar endif 191a6878375SBram Moolenaar 192a6878375SBram Moolenaar return phpcomplete#CompleteUnknownClass(a:base, context) 193a6878375SBram Moolenaar " }}} 194a6878375SBram Moolenaar elseif context =~? 'implements' 195a6878375SBram Moolenaar return phpcomplete#CompleteClassName(a:base, ['i'], current_namespace, imports) 196dc083288SBram Moolenaar elseif context =~? 'instanceof' 197dc083288SBram Moolenaar return phpcomplete#CompleteClassName(a:base, ['c', 'n'], current_namespace, imports) 198f3c2afb7SBram Moolenaar elseif context =~? 'extends\s\+.\+$' && a:base == '' 199a6878375SBram Moolenaar return ['implements'] 200a6878375SBram Moolenaar elseif context =~? 'extends' 201a6878375SBram Moolenaar let kinds = context =~? 'class\s' ? ['c'] : ['i'] 202a6878375SBram Moolenaar return phpcomplete#CompleteClassName(a:base, kinds, current_namespace, imports) 203a6878375SBram Moolenaar elseif context =~? 'class [a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' 204a6878375SBram Moolenaar " special case when you've typed the class keyword and the name too, only extends and implements allowed there 205a6878375SBram Moolenaar return filter(['extends', 'implements'], 'stridx(v:val, a:base) == 0') 206a6878375SBram Moolenaar elseif context =~? 'new' 207a6878375SBram Moolenaar return phpcomplete#CompleteClassName(a:base, ['c'], current_namespace, imports) 208a6878375SBram Moolenaar endif 209a6878375SBram Moolenaar 210a6878375SBram Moolenaar if a:base =~ '^\$' 211a6878375SBram Moolenaar return phpcomplete#CompleteVariable(a:base) 212a6878375SBram Moolenaar else 213a6878375SBram Moolenaar return phpcomplete#CompleteGeneral(a:base, current_namespace, imports) 214a6878375SBram Moolenaar endif 21583d1b190SBram Moolenaar finally 2162c64ca18SBram Moolenaar let &eventignore = eventignore 21783d1b190SBram Moolenaar endtry 218a6878375SBram Moolenaarendfunction 219a6878375SBram Moolenaar" }}} 220a6878375SBram Moolenaar 221a6878375SBram Moolenaarfunction! phpcomplete#CompleteUse(base) " {{{ 222a6878375SBram Moolenaar " completes builtin class names regadless of g:phpcomplete_min_num_of_chars_for_namespace_completion 223a6878375SBram Moolenaar " completes namespaces from tags 224a6878375SBram Moolenaar " * requires patched ctags 225a6878375SBram Moolenaar " completes classnames from tags within the already typed out namespace using the "namespace" field of tags 226a6878375SBram Moolenaar " * requires patched ctags 227a6878375SBram Moolenaar 228a6878375SBram Moolenaar let res = [] 229a6878375SBram Moolenaar 230a6878375SBram Moolenaar " class and namespace names are always considered absoltute in use ... expressions, leading slash is not recommended 231a6878375SBram Moolenaar " by the php manual, so we gonna get rid of that 232a6878375SBram Moolenaar if a:base =~? '^\' 233a6878375SBram Moolenaar let base = substitute(a:base, '^\', '', '') 234a6878375SBram Moolenaar else 235a6878375SBram Moolenaar let base = a:base 236a6878375SBram Moolenaar endif 237a6878375SBram Moolenaar 238a6878375SBram Moolenaar let namespace_match_pattern = substitute(base, '\\', '\\\\', 'g') 239a6878375SBram Moolenaar let classname_match_pattern = matchstr(base, '[^\\]\+$') 240a6878375SBram Moolenaar let namespace_for_class = substitute(substitute(namespace_match_pattern, '\\\\', '\\', 'g'), '\\*'.classname_match_pattern.'$', '', '') 241a6878375SBram Moolenaar 242a6878375SBram Moolenaar if len(namespace_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion 243a6878375SBram Moolenaar if len(classname_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion 244a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^\('.namespace_match_pattern.'\|'.classname_match_pattern.'\)') 245a6878375SBram Moolenaar else 246a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^'.namespace_match_pattern) 247a6878375SBram Moolenaar endif 248a6878375SBram Moolenaar 249a6878375SBram Moolenaar let patched_ctags_detected = 0 250a6878375SBram Moolenaar let namespaced_matches = [] 251a6878375SBram Moolenaar let no_namespace_matches = [] 252a6878375SBram Moolenaar for tag in tags 253a6878375SBram Moolenaar if has_key(tag, 'namespace') 254a6878375SBram Moolenaar let patched_ctags_detected = 1 255a6878375SBram Moolenaar endif 256f3c2afb7SBram Moolenaar 257a6878375SBram Moolenaar if tag.kind ==? 'n' && tag.name =~? '^'.namespace_match_pattern 258a6878375SBram Moolenaar let patched_ctags_detected = 1 259a6878375SBram Moolenaar call add(namespaced_matches, {'word': tag.name, 'kind': 'n', 'menu': tag.filename, 'info': tag.filename }) 260f3c2afb7SBram Moolenaar elseif has_key(tag, 'namespace') && (tag.kind ==? 'c' || tag.kind ==? 'i' || tag.kind ==? 't') && tag.namespace ==? namespace_for_class 261a6878375SBram Moolenaar call add(namespaced_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename }) 262f3c2afb7SBram Moolenaar elseif (tag.kind ==? 'c' || tag.kind ==? 'i' || tag.kind ==? 't') 263a6878375SBram Moolenaar call add(no_namespace_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename }) 264910f66f9SBram Moolenaar endif 265910f66f9SBram Moolenaar endfor 266*6c391a74SBram Moolenaar " if it seems that the tags file have namespace information we can safely throw 267a6878375SBram Moolenaar " away namespaceless tag matches since we can be sure they are invalid 268a6878375SBram Moolenaar if patched_ctags_detected 269a6878375SBram Moolenaar no_namespace_matches = [] 270910f66f9SBram Moolenaar endif 271a6878375SBram Moolenaar let res += namespaced_matches + no_namespace_matches 272a6878375SBram Moolenaar endif 273a6878375SBram Moolenaar 274a6878375SBram Moolenaar if base !~ '\' 275a6878375SBram Moolenaar let builtin_classnames = filter(keys(copy(g:php_builtin_classnames)), 'v:val =~? "^'.classname_match_pattern.'"') 276a6878375SBram Moolenaar for classname in builtin_classnames 277822ff866SBram Moolenaar call add(res, {'word': g:php_builtin_classes[tolower(classname)].name, 'kind': 'c'}) 278a6878375SBram Moolenaar endfor 279a6878375SBram Moolenaar let builtin_interfacenames = filter(keys(copy(g:php_builtin_interfacenames)), 'v:val =~? "^'.classname_match_pattern.'"') 280a6878375SBram Moolenaar for interfacename in builtin_interfacenames 281822ff866SBram Moolenaar call add(res, {'word': g:php_builtin_interfaces[tolower(interfacename)].name, 'kind': 'i'}) 282a6878375SBram Moolenaar endfor 283a6878375SBram Moolenaar endif 284a6878375SBram Moolenaar 285f3c2afb7SBram Moolenaar for comp in res 286f3c2afb7SBram Moolenaar let comp.word = substitute(comp.word, '^\\', '', '') 287f3c2afb7SBram Moolenaar endfor 288f3c2afb7SBram Moolenaar 289a6878375SBram Moolenaar return res 290a6878375SBram Moolenaarendfunction 291a6878375SBram Moolenaar" }}} 292a6878375SBram Moolenaar 293a6878375SBram Moolenaarfunction! phpcomplete#CompleteGeneral(base, current_namespace, imports) " {{{ 294fb539273SBram Moolenaar " Complete everything 295a6878375SBram Moolenaar " + functions, DONE 296a6878375SBram Moolenaar " + keywords of language DONE 297a6878375SBram Moolenaar " + defines (constant definitions), DONE 298a6878375SBram Moolenaar " + extend keywords for predefined constants, DONE 299a6878375SBram Moolenaar " + classes (after new), DONE 300a6878375SBram Moolenaar " + limit choice after -> and :: to funcs and vars DONE 301a6878375SBram Moolenaar 302a6878375SBram Moolenaar " Internal solution for finding functions in current file. 303a6878375SBram Moolenaar 304a6878375SBram Moolenaar if a:base =~? '^\' 305a6878375SBram Moolenaar let leading_slash = '\' 306a6878375SBram Moolenaar else 307a6878375SBram Moolenaar let leading_slash = '' 308a6878375SBram Moolenaar endif 309a6878375SBram Moolenaar 310a6878375SBram Moolenaar let file = getline(1, '$') 311a6878375SBram Moolenaar call filter(file, 312a6878375SBram Moolenaar \ 'v:val =~ "function\\s\\+&\\?[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*("') 313a6878375SBram Moolenaar let jfile = join(file, ' ') 314a6878375SBram Moolenaar let int_values = split(jfile, 'function\s\+') 315a6878375SBram Moolenaar let int_functions = {} 316a6878375SBram Moolenaar for i in int_values 317a6878375SBram Moolenaar let f_name = matchstr(i, 318a6878375SBram Moolenaar \ '^&\?\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze') 319a6878375SBram Moolenaar if f_name =~? '^'.substitute(a:base, '\\', '\\\\', 'g') 320a6878375SBram Moolenaar let f_args = matchstr(i, 321dd1616e6SBram Moolenaar \ '^&\?[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*(\zs.\{-}\ze)\_s*\(;\|{\|$\)') 322a6878375SBram Moolenaar let int_functions[f_name.'('] = f_args.')' 323a6878375SBram Moolenaar endif 324a6878375SBram Moolenaar endfor 325a6878375SBram Moolenaar 326a6878375SBram Moolenaar " Internal solution for finding constants in current file 327a6878375SBram Moolenaar let file = getline(1, '$') 328a6878375SBram Moolenaar call filter(file, 'v:val =~ "define\\s*("') 329a6878375SBram Moolenaar let jfile = join(file, ' ') 330a6878375SBram Moolenaar let int_values = split(jfile, 'define\s*(\s*') 331a6878375SBram Moolenaar let int_constants = {} 332a6878375SBram Moolenaar for i in int_values 333a6878375SBram Moolenaar let c_name = matchstr(i, '\(["'']\)\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze\1') 334a6878375SBram Moolenaar if c_name != '' && c_name =~# '^'.substitute(a:base, '\\', '\\\\', 'g') 335a6878375SBram Moolenaar let int_constants[leading_slash.c_name] = '' 336a6878375SBram Moolenaar endif 337a6878375SBram Moolenaar endfor 338a6878375SBram Moolenaar 339a6878375SBram Moolenaar " Prepare list of functions from tags file 340a6878375SBram Moolenaar let ext_functions = {} 341a6878375SBram Moolenaar let ext_constants = {} 342a6878375SBram Moolenaar let ext_classes = {} 343f3c2afb7SBram Moolenaar let ext_traits = {} 344a6878375SBram Moolenaar let ext_interfaces = {} 345a6878375SBram Moolenaar let ext_namespaces = {} 346a6878375SBram Moolenaar 347a6878375SBram Moolenaar let base = substitute(a:base, '^\\', '', '') 348a6878375SBram Moolenaar let [tag_match_pattern, namespace_for_tag] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports) 349a6878375SBram Moolenaar let namespace_match_pattern = substitute((namespace_for_tag == '' ? '' : namespace_for_tag.'\').tag_match_pattern, '\\', '\\\\', 'g') 350a6878375SBram Moolenaar 351a6878375SBram Moolenaar let tags = [] 352a6878375SBram Moolenaar if len(namespace_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion && len(tag_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion && tag_match_pattern != namespace_match_pattern 353a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('\c^\('.tag_match_pattern.'\|'.namespace_match_pattern.'\)') 354a6878375SBram Moolenaar elseif len(namespace_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion 355a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('\c^'.namespace_match_pattern) 356a6878375SBram Moolenaar elseif len(tag_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion 357a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('\c^'.tag_match_pattern) 358a6878375SBram Moolenaar endif 359a6878375SBram Moolenaar 360a6878375SBram Moolenaar for tag in tags 361a6878375SBram Moolenaar if !has_key(tag, 'namespace') || tag.namespace ==? a:current_namespace || tag.namespace ==? namespace_for_tag 362a6878375SBram Moolenaar if has_key(tag, 'namespace') 363a6878375SBram Moolenaar let full_name = tag.namespace.'\'.tag.name " absolute namespaced name (without leading '\') 364a6878375SBram Moolenaar 365a6878375SBram Moolenaar let base_parts = split(a:base, '\') 366a6878375SBram Moolenaar if len(base_parts) > 1 367a6878375SBram Moolenaar let namespace_part = join(base_parts[0:-2], '\') 368a6878375SBram Moolenaar else 369a6878375SBram Moolenaar let namespace_part = '' 370a6878375SBram Moolenaar endif 371a6878375SBram Moolenaar let relative_name = (namespace_part == '' ? '' : namespace_part.'\').tag.name 372a6878375SBram Moolenaar endif 373a6878375SBram Moolenaar 374a6878375SBram Moolenaar if tag.kind ==? 'n' && tag.name =~? '^'.namespace_match_pattern 375a6878375SBram Moolenaar let info = tag.name.' - '.tag.filename 376a6878375SBram Moolenaar " patched ctag provides absolute namespace names as tag name, namespace tags dont have namespace fields 377a6878375SBram Moolenaar let full_name = tag.name 378a6878375SBram Moolenaar 379a6878375SBram Moolenaar let base_parts = split(a:base, '\') 380a6878375SBram Moolenaar let full_name_parts = split(full_name, '\') 381a6878375SBram Moolenaar if len(base_parts) > 1 382a6878375SBram Moolenaar " the first segment could be a renamed import, take the first segment from the user provided input 383a6878375SBram Moolenaar " so if it's a sub namespace of a renamed namespace, just use the typed in segments in place of the absolute path 384a6878375SBram Moolenaar " for example: 385a6878375SBram Moolenaar " you have a namespace NS1\SUBNS as SUB 386a6878375SBram Moolenaar " you have a sub-sub-namespace NS1\SUBNS\SUBSUB 387a6878375SBram Moolenaar " typed in SUB\SU 388a6878375SBram Moolenaar " the tags will return NS1\SUBNS\SUBSUB 389a6878375SBram Moolenaar " the completion should be: SUB\SUBSUB by replacing the NS1\SUBSN to SUB as in the import 390a6878375SBram Moolenaar if has_key(a:imports, base_parts[0]) && a:imports[base_parts[0]].kind == 'n' 391a6878375SBram Moolenaar let import = a:imports[base_parts[0]] 392a6878375SBram Moolenaar let relative_name = substitute(full_name, '^'.substitute(import.name, '\\', '\\\\', 'g'), base_parts[0], '') 393a6878375SBram Moolenaar else 394a6878375SBram Moolenaar let relative_name = strpart(full_name, stridx(full_name, a:base)) 395a6878375SBram Moolenaar endif 396a6878375SBram Moolenaar else 397a6878375SBram Moolenaar let relative_name = strpart(full_name, stridx(full_name, a:base)) 398a6878375SBram Moolenaar endif 399a6878375SBram Moolenaar 400a6878375SBram Moolenaar if leading_slash == '' 401a6878375SBram Moolenaar let ext_namespaces[relative_name.'\'] = info 402a6878375SBram Moolenaar else 403a6878375SBram Moolenaar let ext_namespaces['\'.full_name.'\'] = info 404a6878375SBram Moolenaar endif 405a6878375SBram Moolenaar elseif tag.kind ==? 'f' && !has_key(tag, 'class') " class related functions (methods) completed elsewhere, only works with patched ctags 406a6878375SBram Moolenaar if has_key(tag, 'signature') 407a6878375SBram Moolenaar let prototype = tag.signature[1:-2] " drop the ()s around the string 408a6878375SBram Moolenaar else 409a6878375SBram Moolenaar let prototype = matchstr(tag.cmd, 410a6878375SBram Moolenaar \ 'function\s\+&\?[^[:space:]]\+\s*(\s*\zs.\{-}\ze\s*)\s*{\?') 411a6878375SBram Moolenaar endif 412a6878375SBram Moolenaar let info = prototype.') - '.tag.filename 413a6878375SBram Moolenaar 414a6878375SBram Moolenaar if !has_key(tag, 'namespace') 415a6878375SBram Moolenaar let ext_functions[tag.name.'('] = info 416a6878375SBram Moolenaar else 417a6878375SBram Moolenaar if tag.namespace ==? namespace_for_tag 418a6878375SBram Moolenaar if leading_slash == '' 419a6878375SBram Moolenaar let ext_functions[relative_name.'('] = info 420a6878375SBram Moolenaar else 421a6878375SBram Moolenaar let ext_functions['\'.full_name.'('] = info 422a6878375SBram Moolenaar endif 423a6878375SBram Moolenaar endif 424a6878375SBram Moolenaar endif 425a6878375SBram Moolenaar elseif tag.kind ==? 'd' 426a6878375SBram Moolenaar let info = ' - '.tag.filename 427a6878375SBram Moolenaar if !has_key(tag, 'namespace') 428a6878375SBram Moolenaar let ext_constants[tag.name] = info 429a6878375SBram Moolenaar else 430a6878375SBram Moolenaar if tag.namespace ==? namespace_for_tag 431a6878375SBram Moolenaar if leading_slash == '' 432a6878375SBram Moolenaar let ext_constants[relative_name] = info 433a6878375SBram Moolenaar else 434a6878375SBram Moolenaar let ext_constants['\'.full_name] = info 435a6878375SBram Moolenaar endif 436a6878375SBram Moolenaar endif 437a6878375SBram Moolenaar endif 438f3c2afb7SBram Moolenaar elseif tag.kind ==? 'c' || tag.kind ==? 'i' || tag.kind ==? 't' 439a6878375SBram Moolenaar let info = ' - '.tag.filename 440a6878375SBram Moolenaar 441a6878375SBram Moolenaar let key = '' 442a6878375SBram Moolenaar if !has_key(tag, 'namespace') 443a6878375SBram Moolenaar let key = tag.name 444a6878375SBram Moolenaar else 445a6878375SBram Moolenaar if tag.namespace ==? namespace_for_tag 446a6878375SBram Moolenaar if leading_slash == '' 447a6878375SBram Moolenaar let key = relative_name 448a6878375SBram Moolenaar else 449a6878375SBram Moolenaar let key = '\'.full_name 450a6878375SBram Moolenaar endif 451a6878375SBram Moolenaar endif 452a6878375SBram Moolenaar endif 453a6878375SBram Moolenaar 454a6878375SBram Moolenaar if key != '' 455a6878375SBram Moolenaar if tag.kind ==? 'c' 456a6878375SBram Moolenaar let ext_classes[key] = info 457a6878375SBram Moolenaar elseif tag.kind ==? 'i' 458a6878375SBram Moolenaar let ext_interfaces[key] = info 459f3c2afb7SBram Moolenaar elseif tag.kind ==? 't' 460f3c2afb7SBram Moolenaar let ext_traits[key] = info 461a6878375SBram Moolenaar endif 462a6878375SBram Moolenaar endif 463a6878375SBram Moolenaar endif 464a6878375SBram Moolenaar endif 465a6878375SBram Moolenaar endfor 466a6878375SBram Moolenaar 467a6878375SBram Moolenaar let builtin_constants = {} 468a6878375SBram Moolenaar let builtin_classnames = {} 469a6878375SBram Moolenaar let builtin_interfaces = {} 470a6878375SBram Moolenaar let builtin_functions = {} 471a6878375SBram Moolenaar let builtin_keywords = {} 472a6878375SBram Moolenaar let base = substitute(a:base, '^\', '', '') 473a6878375SBram Moolenaar if a:current_namespace == '\' || (a:base =~ '^\\' && a:base =~ '^\\[^\\]*$') 474a6878375SBram Moolenaar 475a6878375SBram Moolenaar " Add builtin class names 476a6878375SBram Moolenaar for [classname, info] in items(g:php_builtin_classnames) 477a6878375SBram Moolenaar if classname =~? '^'.base 478822ff866SBram Moolenaar let builtin_classnames[leading_slash.g:php_builtin_classes[tolower(classname)].name] = info 479a6878375SBram Moolenaar endif 480a6878375SBram Moolenaar endfor 481a6878375SBram Moolenaar for [interfacename, info] in items(g:php_builtin_interfacenames) 482a6878375SBram Moolenaar if interfacename =~? '^'.base 483f3c2afb7SBram Moolenaar let builtin_interfaces[leading_slash.g:php_builtin_interfaces[tolower(interfacename)].name] = info 484a6878375SBram Moolenaar endif 485a6878375SBram Moolenaar endfor 486a6878375SBram Moolenaar endif 487a6878375SBram Moolenaar 488a6878375SBram Moolenaar " Prepare list of constants from built-in constants 489a6878375SBram Moolenaar for [constant, info] in items(g:php_constants) 490a6878375SBram Moolenaar if constant =~# '^'.base 491a6878375SBram Moolenaar let builtin_constants[leading_slash.constant] = info 492a6878375SBram Moolenaar endif 493a6878375SBram Moolenaar endfor 494a6878375SBram Moolenaar 495a6878375SBram Moolenaar if leading_slash == '' " keywords should not be completed when base starts with '\' 496a6878375SBram Moolenaar " Treat keywords as constants 497a6878375SBram Moolenaar for [constant, info] in items(g:php_keywords) 498a6878375SBram Moolenaar if constant =~? '^'.a:base 499a6878375SBram Moolenaar let builtin_keywords[constant] = info 500a6878375SBram Moolenaar endif 501a6878375SBram Moolenaar endfor 502a6878375SBram Moolenaar endif 503a6878375SBram Moolenaar 504a6878375SBram Moolenaar for [function_name, info] in items(g:php_builtin_functions) 505a6878375SBram Moolenaar if function_name =~? '^'.base 506a6878375SBram Moolenaar let builtin_functions[leading_slash.function_name] = info 507a6878375SBram Moolenaar endif 508a6878375SBram Moolenaar endfor 509a6878375SBram Moolenaar 510a6878375SBram Moolenaar " All constants 511a6878375SBram Moolenaar call extend(int_constants, ext_constants) 512a6878375SBram Moolenaar 513a6878375SBram Moolenaar " All functions 514a6878375SBram Moolenaar call extend(int_functions, ext_functions) 515a6878375SBram Moolenaar call extend(int_functions, builtin_functions) 516a6878375SBram Moolenaar 517a6878375SBram Moolenaar for [imported_name, import] in items(a:imports) 518a6878375SBram Moolenaar if imported_name =~? '^'.base 519a6878375SBram Moolenaar if import.kind ==? 'c' 520a6878375SBram Moolenaar if import.builtin 521a6878375SBram Moolenaar let builtin_classnames[imported_name] = ' '.import.name 522a6878375SBram Moolenaar else 523a6878375SBram Moolenaar let ext_classes[imported_name] = ' '.import.name.' - '.import.filename 524a6878375SBram Moolenaar endif 525a6878375SBram Moolenaar elseif import.kind ==? 'i' 526a6878375SBram Moolenaar if import.builtin 527a6878375SBram Moolenaar let builtin_interfaces[imported_name] = ' '.import.name 528a6878375SBram Moolenaar else 529a6878375SBram Moolenaar let ext_interfaces[imported_name] = ' '.import.name.' - '.import.filename 530a6878375SBram Moolenaar endif 531f3c2afb7SBram Moolenaar elseif import.kind ==? 't' 532f3c2afb7SBram Moolenaar let ext_traits[imported_name] = ' '.import.name.' - '.import.filename 533a6878375SBram Moolenaar endif 534a6878375SBram Moolenaar 535a6878375SBram Moolenaar " no builtin interfaces 536a6878375SBram Moolenaar if import.kind == 'n' 537a6878375SBram Moolenaar let ext_namespaces[imported_name.'\'] = ' '.import.name.' - '.import.filename 538a6878375SBram Moolenaar endif 539a6878375SBram Moolenaar end 540910f66f9SBram Moolenaar endfor 541910f66f9SBram Moolenaar 542910f66f9SBram Moolenaar let all_values = {} 543910f66f9SBram Moolenaar 544a6878375SBram Moolenaar " Add functions found in this file 545a6878375SBram Moolenaar call extend(all_values, int_functions) 546910f66f9SBram Moolenaar 547a6878375SBram Moolenaar " Add namespaces from tags 548a6878375SBram Moolenaar call extend(all_values, ext_namespaces) 549a6878375SBram Moolenaar 550a6878375SBram Moolenaar " Add constants from the current file 551a6878375SBram Moolenaar call extend(all_values, int_constants) 552a6878375SBram Moolenaar 553a6878375SBram Moolenaar " Add built-in constants 554a6878375SBram Moolenaar call extend(all_values, builtin_constants) 555a6878375SBram Moolenaar 556a6878375SBram Moolenaar " Add external classes 557a6878375SBram Moolenaar call extend(all_values, ext_classes) 558a6878375SBram Moolenaar 559a6878375SBram Moolenaar " Add external interfaces 560a6878375SBram Moolenaar call extend(all_values, ext_interfaces) 561a6878375SBram Moolenaar 562f3c2afb7SBram Moolenaar " Add external traits 563f3c2afb7SBram Moolenaar call extend(all_values, ext_traits) 564f3c2afb7SBram Moolenaar 565a6878375SBram Moolenaar " Add built-in classes 566a6878375SBram Moolenaar call extend(all_values, builtin_classnames) 567a6878375SBram Moolenaar 568a6878375SBram Moolenaar " Add built-in interfaces 569a6878375SBram Moolenaar call extend(all_values, builtin_interfaces) 570a6878375SBram Moolenaar 571a6878375SBram Moolenaar " Add php keywords 572a6878375SBram Moolenaar call extend(all_values, builtin_keywords) 573910f66f9SBram Moolenaar 574910f66f9SBram Moolenaar let final_list = [] 575a6878375SBram Moolenaar let int_list = sort(keys(all_values)) 576a6878375SBram Moolenaar for i in int_list 577a6878375SBram Moolenaar if has_key(ext_namespaces, i) 578a6878375SBram Moolenaar let final_list += [{'word':i, 'kind':'n', 'menu': ext_namespaces[i], 'info': ext_namespaces[i]}] 579a6878375SBram Moolenaar elseif has_key(int_functions, i) 580910f66f9SBram Moolenaar let final_list += 581910f66f9SBram Moolenaar \ [{'word':i, 582a6878375SBram Moolenaar \ 'info':i.int_functions[i], 583a6878375SBram Moolenaar \ 'menu':int_functions[i], 584910f66f9SBram Moolenaar \ 'kind':'f'}] 585a6878375SBram Moolenaar elseif has_key(ext_classes, i) || has_key(builtin_classnames, i) 586a6878375SBram Moolenaar let info = has_key(ext_classes, i) ? ext_classes[i] : builtin_classnames[i].' - builtin' 587a6878375SBram Moolenaar let final_list += [{'word':i, 'kind': 'c', 'menu': info, 'info': i.info}] 588a6878375SBram Moolenaar elseif has_key(ext_interfaces, i) || has_key(builtin_interfaces, i) 589a6878375SBram Moolenaar let info = has_key(ext_interfaces, i) ? ext_interfaces[i] : builtin_interfaces[i].' - builtin' 590a6878375SBram Moolenaar let final_list += [{'word':i, 'kind': 'i', 'menu': info, 'info': i.info}] 591f3c2afb7SBram Moolenaar elseif has_key(ext_traits, i) 592f3c2afb7SBram Moolenaar let final_list += [{'word':i, 'kind': 't', 'menu': ext_traits[i], 'info': ext_traits[i]}] 593a6878375SBram Moolenaar elseif has_key(int_constants, i) || has_key(builtin_constants, i) 594a6878375SBram Moolenaar let info = has_key(int_constants, i) ? int_constants[i] : ' - builtin' 595a6878375SBram Moolenaar let final_list += [{'word':i, 'kind': 'd', 'menu': info, 'info': i.info}] 596a6878375SBram Moolenaar else 597a6878375SBram Moolenaar let final_list += [{'word':i}] 598910f66f9SBram Moolenaar endif 599910f66f9SBram Moolenaar endfor 600910f66f9SBram Moolenaar 601910f66f9SBram Moolenaar return final_list 602a6878375SBram Moolenaarendfunction 603a6878375SBram Moolenaar" }}} 604910f66f9SBram Moolenaar 605a6878375SBram Moolenaarfunction! phpcomplete#CompleteUnknownClass(base, context) " {{{ 606a6878375SBram Moolenaar let res = [] 607910f66f9SBram Moolenaar 608a6878375SBram Moolenaar if g:phpcomplete_complete_for_unknown_classes != 1 609a6878375SBram Moolenaar return [] 610910f66f9SBram Moolenaar endif 611910f66f9SBram Moolenaar 612ceaf7b8bSBram Moolenaar if a:base =~ '^\$' 613ceaf7b8bSBram Moolenaar let adddollar = '$' 614ceaf7b8bSBram Moolenaar else 615ceaf7b8bSBram Moolenaar let adddollar = '' 616ceaf7b8bSBram Moolenaar endif 617a6878375SBram Moolenaar 618e48ec1faSBram Moolenaar let file = getline(1, '$') 619a6878375SBram Moolenaar 620a6878375SBram Moolenaar " Internal solution for finding object properties in current file. 621a6878375SBram Moolenaar if a:context =~ '::' 622a6878375SBram Moolenaar let variables = filter(deepcopy(file), 623a6878375SBram Moolenaar \ 'v:val =~ "^\\s*\\(static\\|static\\s\\+\\(public\\|var\\)\\|\\(public\\|var\\)\\s\\+static\\)\\s\\+\\$"') 624a6878375SBram Moolenaar elseif a:context =~ '->' 625a6878375SBram Moolenaar let variables = filter(deepcopy(file), 626a6878375SBram Moolenaar \ 'v:val =~ "^\\s*\\(public\\|var\\)\\s\\+\\$"') 627a6878375SBram Moolenaar endif 628a6878375SBram Moolenaar let jvars = join(variables, ' ') 629a6878375SBram Moolenaar let svars = split(jvars, '\$') 630e48ec1faSBram Moolenaar let int_vars = {} 631a6878375SBram Moolenaar for i in svars 632a6878375SBram Moolenaar let c_var = matchstr(i, 633a6878375SBram Moolenaar \ '^\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze') 634a6878375SBram Moolenaar if c_var != '' 635a6878375SBram Moolenaar let int_vars[adddollar.c_var] = '' 636e48ec1faSBram Moolenaar endif 637e48ec1faSBram Moolenaar endfor 638e48ec1faSBram Moolenaar 639e48ec1faSBram Moolenaar " Internal solution for finding functions in current file. 640a6878375SBram Moolenaar call filter(deepcopy(file), 641ceaf7b8bSBram Moolenaar \ 'v:val =~ "function\\s\\+&\\?[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*("') 642e48ec1faSBram Moolenaar let jfile = join(file, ' ') 643e48ec1faSBram Moolenaar let int_values = split(jfile, 'function\s\+') 644e48ec1faSBram Moolenaar let int_functions = {} 645e48ec1faSBram Moolenaar for i in int_values 646ceaf7b8bSBram Moolenaar let f_name = matchstr(i, 647ceaf7b8bSBram Moolenaar \ '^&\?\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze') 648ceaf7b8bSBram Moolenaar let f_args = matchstr(i, 649dd1616e6SBram Moolenaar \ '^&\?[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*(\zs.\{-}\ze)\_s*\(;\|{\|$\)') 650a6878375SBram Moolenaar 651910f66f9SBram Moolenaar let int_functions[f_name.'('] = f_args.')' 652e48ec1faSBram Moolenaar endfor 653e48ec1faSBram Moolenaar 654a6878375SBram Moolenaar " collect external functions from tags 655e48ec1faSBram Moolenaar let ext_functions = {} 656a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^'.substitute(a:base, '^\$', '', '')) 657a6878375SBram Moolenaar for tag in tags 658a6878375SBram Moolenaar if tag.kind ==? 'f' 659a6878375SBram Moolenaar let item = tag.name 660a6878375SBram Moolenaar if has_key(tag, 'signature') 661a6878375SBram Moolenaar let prototype = tag.signature[1:-2] 662a6878375SBram Moolenaar else 663a6878375SBram Moolenaar let prototype = matchstr(tag.cmd, 664ceaf7b8bSBram Moolenaar \ 'function\s\+&\?[^[:space:]]\+\s*(\s*\zs.\{-}\ze\s*)\s*{\?') 665a6878375SBram Moolenaar endif 666a6878375SBram Moolenaar let ext_functions[item.'('] = prototype.') - '.tag['filename'] 667a6878375SBram Moolenaar endif 668e48ec1faSBram Moolenaar endfor 669a6878375SBram Moolenaar 670a6878375SBram Moolenaar " All functions to one hash for later reference when deciding kind 671a6878375SBram Moolenaar call extend(int_functions, ext_functions) 672e48ec1faSBram Moolenaar 673e48ec1faSBram Moolenaar let all_values = {} 674e48ec1faSBram Moolenaar call extend(all_values, int_functions) 675ceaf7b8bSBram Moolenaar call extend(all_values, int_vars) " external variables are already in 676ceaf7b8bSBram Moolenaar call extend(all_values, g:php_builtin_object_functions) 677e48ec1faSBram Moolenaar 678e48ec1faSBram Moolenaar for m in sort(keys(all_values)) 679ceaf7b8bSBram Moolenaar if m =~ '\(^\|::\)'.a:base 680e48ec1faSBram Moolenaar call add(res, m) 681e48ec1faSBram Moolenaar endif 682e48ec1faSBram Moolenaar endfor 683e48ec1faSBram Moolenaar 684ceaf7b8bSBram Moolenaar let start_list = res 685e48ec1faSBram Moolenaar 686e48ec1faSBram Moolenaar let final_list = [] 687e48ec1faSBram Moolenaar for i in start_list 688e48ec1faSBram Moolenaar if has_key(int_vars, i) 689ceaf7b8bSBram Moolenaar let class = ' ' 690ceaf7b8bSBram Moolenaar if all_values[i] != '' 691ceaf7b8bSBram Moolenaar let class = i.' class ' 692ceaf7b8bSBram Moolenaar endif 693ceaf7b8bSBram Moolenaar let final_list += [{'word':i, 'info':class.all_values[i], 'kind':'v'}] 694e48ec1faSBram Moolenaar else 695ceaf7b8bSBram Moolenaar let final_list += 696ceaf7b8bSBram Moolenaar \ [{'word':substitute(i, '.*::', '', ''), 697ceaf7b8bSBram Moolenaar \ 'info':i.all_values[i], 698a6878375SBram Moolenaar \ 'menu':all_values[i], 699a6878375SBram Moolenaar \ 'kind':'f'}] 700a6878375SBram Moolenaar endif 701a6878375SBram Moolenaar endfor 702a6878375SBram Moolenaar return final_list 703a6878375SBram Moolenaarendfunction 704a6878375SBram Moolenaar" }}} 705a6878375SBram Moolenaar 706a6878375SBram Moolenaarfunction! phpcomplete#CompleteVariable(base) " {{{ 707a6878375SBram Moolenaar let res = [] 708a6878375SBram Moolenaar 709a6878375SBram Moolenaar " Internal solution for current file. 710a6878375SBram Moolenaar let file = getline(1, '$') 711a6878375SBram Moolenaar let jfile = join(file, ' ') 712a6878375SBram Moolenaar let int_vals = split(jfile, '\ze\$') 713a6878375SBram Moolenaar let int_vars = {} 714a6878375SBram Moolenaar for i in int_vals 715a6878375SBram Moolenaar if i =~? '^\$[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*=\s*new' 716a6878375SBram Moolenaar let val = matchstr(i, 717a6878375SBram Moolenaar \ '^\$[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*') 718a6878375SBram Moolenaar else 719a6878375SBram Moolenaar let val = matchstr(i, 720a6878375SBram Moolenaar \ '^\$[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*') 721a6878375SBram Moolenaar endif 722a6878375SBram Moolenaar if val != '' 723a6878375SBram Moolenaar let int_vars[val] = '' 724a6878375SBram Moolenaar endif 725a6878375SBram Moolenaar endfor 726a6878375SBram Moolenaar 727a6878375SBram Moolenaar call extend(int_vars, g:php_builtin_vars) 728a6878375SBram Moolenaar 729a6878375SBram Moolenaar " ctags has support for PHP, use tags file for external variables 730a6878375SBram Moolenaar if g:phpcomplete_search_tags_for_variables 731a6878375SBram Moolenaar let ext_vars = {} 732a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('\C^'.substitute(a:base, '^\$', '', '')) 733a6878375SBram Moolenaar for tag in tags 734a6878375SBram Moolenaar if tag.kind ==? 'v' 735a6878375SBram Moolenaar let item = tag.name 736a6878375SBram Moolenaar let m_menu = '' 737a6878375SBram Moolenaar if tag.cmd =~? tag['name'].'\s*=\s*new\s\+' 738a6878375SBram Moolenaar let m_menu = matchstr(tag.cmd, 739a6878375SBram Moolenaar \ '\c=\s*new\s\+\zs[a-zA-Z_0-9\x7f-\xff]\+\ze') 740a6878375SBram Moolenaar endif 741a6878375SBram Moolenaar let ext_vars['$'.item] = m_menu 742a6878375SBram Moolenaar endif 743a6878375SBram Moolenaar endfor 744a6878375SBram Moolenaar call extend(int_vars, ext_vars) 745a6878375SBram Moolenaar endif 746a6878375SBram Moolenaar 747a6878375SBram Moolenaar for m in sort(keys(int_vars)) 748a6878375SBram Moolenaar if m =~# '^\'.a:base 749a6878375SBram Moolenaar call add(res, m) 750a6878375SBram Moolenaar endif 751a6878375SBram Moolenaar endfor 752a6878375SBram Moolenaar 753a6878375SBram Moolenaar let int_list = res 754a6878375SBram Moolenaar 755a6878375SBram Moolenaar let int_dict = [] 756a6878375SBram Moolenaar for i in int_list 757a6878375SBram Moolenaar if int_vars[i] != '' 758a6878375SBram Moolenaar let class = ' ' 759a6878375SBram Moolenaar if int_vars[i] != '' 760a6878375SBram Moolenaar let class = i.' class ' 761a6878375SBram Moolenaar endif 762a6878375SBram Moolenaar let int_dict += [{'word':i, 'info':class.int_vars[i], 'menu':int_vars[i], 'kind':'v'}] 763a6878375SBram Moolenaar else 764a6878375SBram Moolenaar let int_dict += [{'word':i, 'kind':'v'}] 765a6878375SBram Moolenaar endif 766a6878375SBram Moolenaar endfor 767a6878375SBram Moolenaar 768a6878375SBram Moolenaar return int_dict 769a6878375SBram Moolenaarendfunction 770a6878375SBram Moolenaar" }}} 771a6878375SBram Moolenaar 772a6878375SBram Moolenaarfunction! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports) " {{{ 773a6878375SBram Moolenaar let kinds = sort(a:kinds) 774a6878375SBram Moolenaar " Complete class name 775a6878375SBram Moolenaar let res = [] 776a6878375SBram Moolenaar if a:base =~? '^\' 777a6878375SBram Moolenaar let leading_slash = '\' 778a6878375SBram Moolenaar let base = substitute(a:base, '^\', '', '') 779a6878375SBram Moolenaar else 780a6878375SBram Moolenaar let leading_slash = '' 781a6878375SBram Moolenaar let base = a:base 782a6878375SBram Moolenaar endif 783a6878375SBram Moolenaar 784a6878375SBram Moolenaar " Internal solution for finding classes in current file. 785a6878375SBram Moolenaar let file = getline(1, '$') 786a6878375SBram Moolenaar let filterstr = '' 787a6878375SBram Moolenaar 788a6878375SBram Moolenaar if kinds == ['c', 'i'] 789a6878375SBram Moolenaar let filterstr = 'v:val =~? "\\(class\\|interface\\)\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"' 790dc083288SBram Moolenaar elseif kinds == ['c', 'n'] 791dc083288SBram Moolenaar let filterstr = 'v:val =~? "\\(class\\|namespace\\)\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"' 792a6878375SBram Moolenaar elseif kinds == ['c'] 793a6878375SBram Moolenaar let filterstr = 'v:val =~? "class\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"' 794a6878375SBram Moolenaar elseif kinds == ['i'] 795a6878375SBram Moolenaar let filterstr = 'v:val =~? "interface\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"' 796a6878375SBram Moolenaar endif 797a6878375SBram Moolenaar 798a6878375SBram Moolenaar call filter(file, filterstr) 799a6878375SBram Moolenaar 800a6878375SBram Moolenaar for line in file 801a6878375SBram Moolenaar let c_name = matchstr(line, '\c\(class\|interface\)\s*\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*') 802a6878375SBram Moolenaar let kind = (line =~? '^\s*class' ? 'c' : 'i') 803a6878375SBram Moolenaar if c_name != '' && c_name =~? '^'.base 804a6878375SBram Moolenaar call add(res, {'word': c_name, 'kind': kind}) 805a6878375SBram Moolenaar endif 806a6878375SBram Moolenaar endfor 807a6878375SBram Moolenaar 808*6c391a74SBram Moolenaar " resolve the typed in part with namespaces (if there's a \ in it) 809a6878375SBram Moolenaar let [tag_match_pattern, namespace_for_class] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports) 810a6878375SBram Moolenaar 811a6878375SBram Moolenaar let tags = [] 812a6878375SBram Moolenaar if len(tag_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion 813f3c2afb7SBram Moolenaar let tags = phpcomplete#GetTaglist('^\c'.tag_match_pattern) 814a6878375SBram Moolenaar endif 815a6878375SBram Moolenaar 816a6878375SBram Moolenaar if len(tags) 817a6878375SBram Moolenaar let base_parts = split(a:base, '\') 818a6878375SBram Moolenaar if len(base_parts) > 1 819a6878375SBram Moolenaar let namespace_part = join(base_parts[0:-2], '\').'\' 820a6878375SBram Moolenaar else 821a6878375SBram Moolenaar let namespace_part = '' 822a6878375SBram Moolenaar endif 823a6878375SBram Moolenaar let no_namespace_matches = [] 824a6878375SBram Moolenaar let namespaced_matches = [] 825a6878375SBram Moolenaar let seen_namespaced_tag = 0 826a6878375SBram Moolenaar for tag in tags 827a6878375SBram Moolenaar if has_key(tag, 'namespace') 828a6878375SBram Moolenaar let seen_namespaced_tag = 1 829a6878375SBram Moolenaar endif 830a6878375SBram Moolenaar let relative_name = namespace_part.tag.name 831a6878375SBram Moolenaar " match base without the namespace part for namespaced base but not namespaced tags, for tagfiles with old ctags 83291e15e13SBram Moolenaar if !has_key(tag, 'namespace') && index(kinds, tag.kind) != -1 && stridx(tolower(tag.name), tolower(base[len(namespace_part):])) == 0 833a6878375SBram Moolenaar call add(no_namespace_matches, {'word': leading_slash.relative_name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename }) 834a6878375SBram Moolenaar endif 835a6878375SBram Moolenaar if has_key(tag, 'namespace') && index(kinds, tag.kind) != -1 && tag.namespace ==? namespace_for_class 836a6878375SBram Moolenaar let full_name = tag.namespace.'\'.tag.name " absolute namespaced name (without leading '\') 837a6878375SBram Moolenaar call add(namespaced_matches, {'word': leading_slash == '\' ? leading_slash.full_name : relative_name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename }) 838a6878375SBram Moolenaar endif 839a6878375SBram Moolenaar endfor 840a6878375SBram Moolenaar " if there was a tag with namespace field, assume tag files with namespace support, so the matches 841a6878375SBram Moolenaar " without a namespace field are in the global namespace so if there were namespace in the base 842a6878375SBram Moolenaar " we should not add them to the matches 843a6878375SBram Moolenaar if seen_namespaced_tag && namespace_part != '' 844a6878375SBram Moolenaar let no_namespace_matches = [] 845a6878375SBram Moolenaar endif 846a6878375SBram Moolenaar let res += no_namespace_matches + namespaced_matches 847a6878375SBram Moolenaar endif 848a6878375SBram Moolenaar 849a6878375SBram Moolenaar " look for built in classnames and interfaces 850a6878375SBram Moolenaar let base_parts = split(base, '\') 851a6878375SBram Moolenaar if a:current_namespace == '\' || (leading_slash == '\' && len(base_parts) < 2) 852a6878375SBram Moolenaar if index(kinds, 'c') != -1 853a6878375SBram Moolenaar let builtin_classnames = filter(keys(copy(g:php_builtin_classnames)), 'v:val =~? "^'.substitute(a:base, '\\', '', 'g').'"') 854a6878375SBram Moolenaar for classname in builtin_classnames 855a6878375SBram Moolenaar let menu = '' 856a6878375SBram Moolenaar " if we have a constructor for this class, add parameters as to the info 857a6878375SBram Moolenaar if has_key(g:php_builtin_classes[tolower(classname)].methods, '__construct') 858a6878375SBram Moolenaar let menu = g:php_builtin_classes[tolower(classname)]['methods']['__construct']['signature'] 859a6878375SBram Moolenaar endif 860822ff866SBram Moolenaar call add(res, {'word': leading_slash.g:php_builtin_classes[tolower(classname)].name, 'kind': 'c', 'menu': menu}) 861a6878375SBram Moolenaar endfor 862a6878375SBram Moolenaar endif 863a6878375SBram Moolenaar 864a6878375SBram Moolenaar if index(kinds, 'i') != -1 865a6878375SBram Moolenaar let builtin_interfaces = filter(keys(copy(g:php_builtin_interfaces)), 'v:val =~? "^'.substitute(a:base, '\\', '', 'g').'"') 866a6878375SBram Moolenaar for interfacename in builtin_interfaces 867a6878375SBram Moolenaar call add(res, {'word': leading_slash.g:php_builtin_interfaces[interfacename]['name'], 'kind': 'i', 'menu': ''}) 868a6878375SBram Moolenaar endfor 869a6878375SBram Moolenaar endif 870a6878375SBram Moolenaar endif 871a6878375SBram Moolenaar 872a6878375SBram Moolenaar " add matching imported things 873a6878375SBram Moolenaar for [imported_name, import] in items(a:imports) 874a6878375SBram Moolenaar if imported_name =~? '^'.base && index(kinds, import.kind) != -1 875a6878375SBram Moolenaar let menu = import.name.(import.builtin ? ' - builtin' : '') 876a6878375SBram Moolenaar call add(res, {'word': imported_name, 'kind': import.kind, 'menu': menu}) 877a6878375SBram Moolenaar endif 878a6878375SBram Moolenaar endfor 879a6878375SBram Moolenaar 880a6878375SBram Moolenaar let res = sort(res, 'phpcomplete#CompareCompletionRow') 881a6878375SBram Moolenaar return res 882a6878375SBram Moolenaarendfunction 883a6878375SBram Moolenaar" }}} 884a6878375SBram Moolenaar 885a6878375SBram Moolenaarfunction! phpcomplete#CompareCompletionRow(i1, i2) " {{{ 886a6878375SBram Moolenaar return a:i1.word == a:i2.word ? 0 : a:i1.word > a:i2.word ? 1 : -1 887a6878375SBram Moolenaarendfunction 888a6878375SBram Moolenaar" }}} 889a6878375SBram Moolenaar 890f3c2afb7SBram Moolenaarfunction! s:getNextCharWithPos(filelines, current_pos) " {{{ 891f3c2afb7SBram Moolenaar let line_no = a:current_pos[0] 892f3c2afb7SBram Moolenaar let col_no = a:current_pos[1] 893f3c2afb7SBram Moolenaar let last_line = a:filelines[len(a:filelines) - 1] 894f3c2afb7SBram Moolenaar let end_pos = [len(a:filelines) - 1, strlen(last_line) - 1] 895f3c2afb7SBram Moolenaar if line_no > end_pos[0] || line_no == end_pos[0] && col_no > end_pos[1] 896f3c2afb7SBram Moolenaar return ['EOF', 'EOF'] 897f3c2afb7SBram Moolenaar endif 898f3c2afb7SBram Moolenaar 899f3c2afb7SBram Moolenaar " we've not reached the end of the current line break 900f3c2afb7SBram Moolenaar if col_no + 1 < strlen(a:filelines[line_no]) 901f3c2afb7SBram Moolenaar let col_no += 1 902f3c2afb7SBram Moolenaar else 903f3c2afb7SBram Moolenaar " we've reached the end of the current line, jump to the next 904f3c2afb7SBram Moolenaar " non-blank line (blank lines have no position where we can read from, 905f3c2afb7SBram Moolenaar " not even a whitespace. The newline char does not positionable by vim 906f3c2afb7SBram Moolenaar let line_no += 1 907f3c2afb7SBram Moolenaar while strlen(a:filelines[line_no]) == 0 908f3c2afb7SBram Moolenaar let line_no += 1 909f3c2afb7SBram Moolenaar endwhile 910f3c2afb7SBram Moolenaar 911f3c2afb7SBram Moolenaar let col_no = 0 912f3c2afb7SBram Moolenaar endif 913f3c2afb7SBram Moolenaar 914f3c2afb7SBram Moolenaar " return 'EOF' string to signal end of file, normal results only one char 915f3c2afb7SBram Moolenaar " in length 916f3c2afb7SBram Moolenaar if line_no == end_pos[0] && col_no > end_pos[1] 917f3c2afb7SBram Moolenaar return ['EOF', 'EOF'] 918f3c2afb7SBram Moolenaar endif 919f3c2afb7SBram Moolenaar 920f3c2afb7SBram Moolenaar return [[line_no, col_no], a:filelines[line_no][col_no]] 921f3c2afb7SBram Moolenaarendfunction " }}} 922f3c2afb7SBram Moolenaar 923a6878375SBram Moolenaarfunction! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) " {{{ 924*6c391a74SBram Moolenaar " if there's no modifier, and no modifier is allowed and no modifier is required 925a6878375SBram Moolenaar if len(a:modifiers) == 0 && len(a:required_modifiers) == 0 926a6878375SBram Moolenaar return 1 927a6878375SBram Moolenaar else 928*6c391a74SBram Moolenaar " check if every required modifier is present 929a6878375SBram Moolenaar for required_modifier in a:required_modifiers 930a6878375SBram Moolenaar if index(a:modifiers, required_modifier) == -1 931a6878375SBram Moolenaar return 0 932a6878375SBram Moolenaar endif 933a6878375SBram Moolenaar endfor 934a6878375SBram Moolenaar 935a6878375SBram Moolenaar for modifier in a:modifiers 9363e496b0eSBram Moolenaar " if the modifier is prohibited it's a no match 937a6878375SBram Moolenaar if index(a:prohibited_modifiers, modifier) != -1 938a6878375SBram Moolenaar return 0 939a6878375SBram Moolenaar endif 940a6878375SBram Moolenaar endfor 941a6878375SBram Moolenaar 942a6878375SBram Moolenaar " anything that is not explicitly required or prohibited is allowed 943a6878375SBram Moolenaar return 1 944a6878375SBram Moolenaar endif 945a6878375SBram Moolenaarendfunction 946a6878375SBram Moolenaar" }}} 947a6878375SBram Moolenaar 948a6878375SBram Moolenaarfunction! phpcomplete#CompleteUserClass(context, base, sccontent, visibility) " {{{ 949a6878375SBram Moolenaar let final_list = [] 950a6878375SBram Moolenaar let res = [] 951a6878375SBram Moolenaar 952a6878375SBram Moolenaar let required_modifiers = [] 953a6878375SBram Moolenaar let prohibited_modifiers = [] 954a6878375SBram Moolenaar 955a6878375SBram Moolenaar if a:visibility == 'public' 956a6878375SBram Moolenaar let prohibited_modifiers += ['private', 'protected'] 957a6878375SBram Moolenaar endif 958a6878375SBram Moolenaar 959a6878375SBram Moolenaar " limit based on context to static or normal methods 960a6878375SBram Moolenaar let static_con = '' 961a6878375SBram Moolenaar if a:context =~ '::$' && a:context !~? 'parent::$' 962a6878375SBram Moolenaar if g:phpcomplete_relax_static_constraint != 1 963a6878375SBram Moolenaar let required_modifiers += ['static'] 964a6878375SBram Moolenaar endif 965a6878375SBram Moolenaar elseif a:context =~ '->$' 966a6878375SBram Moolenaar let prohibited_modifiers += ['static'] 967a6878375SBram Moolenaar endif 968a6878375SBram Moolenaar 969a6878375SBram Moolenaar let all_function = filter(deepcopy(a:sccontent), 970a6878375SBram Moolenaar \ 'v:val =~ "^\\s*\\(public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)*function"') 971a6878375SBram Moolenaar 972a6878375SBram Moolenaar let functions = [] 973a6878375SBram Moolenaar for i in all_function 974a6878375SBram Moolenaar let modifiers = split(matchstr(tolower(i), '\zs.\+\zefunction'), '\s\+') 975a6878375SBram Moolenaar if phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) == 1 976a6878375SBram Moolenaar call add(functions, i) 977a6878375SBram Moolenaar endif 978a6878375SBram Moolenaar endfor 979a6878375SBram Moolenaar 980a6878375SBram Moolenaar let c_functions = {} 981a6878375SBram Moolenaar let c_doc = {} 982a6878375SBram Moolenaar for i in functions 983a6878375SBram Moolenaar let f_name = matchstr(i, 984a6878375SBram Moolenaar \ 'function\s*&\?\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze') 985a6878375SBram Moolenaar let f_args = matchstr(i, 986dd1616e6SBram Moolenaar \ 'function\s*&\?[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*(\zs.\{-}\ze)\_s*\(;\|{\|\_$\)') 987822ff866SBram Moolenaar if f_name != '' && stridx(f_name, '__') != 0 988a6878375SBram Moolenaar let c_functions[f_name.'('] = f_args 989a6878375SBram Moolenaar if g:phpcomplete_parse_docblock_comments 990822ff866SBram Moolenaar let c_doc[f_name.'('] = phpcomplete#GetDocBlock(a:sccontent, 'function\s*&\?\<'.f_name.'\>') 991a6878375SBram Moolenaar endif 992a6878375SBram Moolenaar endif 993a6878375SBram Moolenaar endfor 994a6878375SBram Moolenaar 995a6878375SBram Moolenaar " limit based on context to static or normal attributes 996a6878375SBram Moolenaar if a:context =~ '::$' && a:context !~? 'parent::$' 997a6878375SBram Moolenaar " variables must have static to be accessed as static unlike functions 998a6878375SBram Moolenaar let required_modifiers += ['static'] 999a6878375SBram Moolenaar endif 1000a6878375SBram Moolenaar let all_variable = filter(deepcopy(a:sccontent), 1001dc083288SBram Moolenaar \ 'v:val =~ "\\(^\\s*\\(var\\s\\+\\|public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)\\+\\$\\|^\\s*\\(\\/\\|\\*\\)*\\s*@property\\s\\+\\S\\+\\s\\S\\{-}\\s*$\\)"') 1002a6878375SBram Moolenaar 1003a6878375SBram Moolenaar let variables = [] 1004a6878375SBram Moolenaar for i in all_variable 1005a6878375SBram Moolenaar let modifiers = split(matchstr(tolower(i), '\zs.\+\ze\$'), '\s\+') 1006a6878375SBram Moolenaar if phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) == 1 1007a6878375SBram Moolenaar call add(variables, i) 1008a6878375SBram Moolenaar endif 1009a6878375SBram Moolenaar endfor 1010a6878375SBram Moolenaar 1011fb539273SBram Moolenaar let static_vars = split(join(variables, ' '), '\$') 1012a6878375SBram Moolenaar let c_variables = {} 1013a6878375SBram Moolenaar 1014a6878375SBram Moolenaar let var_index = 0 1015fb539273SBram Moolenaar for i in static_vars 1016a6878375SBram Moolenaar let c_var = matchstr(i, 1017a6878375SBram Moolenaar \ '^\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze') 1018a6878375SBram Moolenaar if c_var != '' 1019a6878375SBram Moolenaar if a:context =~ '::$' 1020a6878375SBram Moolenaar let c_var = '$'.c_var 1021a6878375SBram Moolenaar endif 1022a6878375SBram Moolenaar let c_variables[c_var] = '' 1023942db23cSBram Moolenaar if g:phpcomplete_parse_docblock_comments && len(get(variables, var_index, '')) > 0 1024a6878375SBram Moolenaar let c_doc[c_var] = phpcomplete#GetDocBlock(a:sccontent, variables[var_index]) 1025a6878375SBram Moolenaar endif 1026a6878375SBram Moolenaar let var_index += 1 1027a6878375SBram Moolenaar endif 1028a6878375SBram Moolenaar endfor 1029a6878375SBram Moolenaar 1030a6878375SBram Moolenaar let constants = filter(deepcopy(a:sccontent), 1031a6878375SBram Moolenaar \ 'v:val =~ "^\\s*const\\s\\+"') 1032a6878375SBram Moolenaar 1033a6878375SBram Moolenaar let jcons = join(constants, ' ') 1034a6878375SBram Moolenaar let scons = split(jcons, 'const') 1035a6878375SBram Moolenaar 1036a6878375SBram Moolenaar let c_constants = {} 1037a6878375SBram Moolenaar let const_index = 0 1038a6878375SBram Moolenaar for i in scons 1039a6878375SBram Moolenaar let c_con = matchstr(i, 1040a6878375SBram Moolenaar \ '^\s*\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze') 1041a6878375SBram Moolenaar if c_con != '' 1042a6878375SBram Moolenaar let c_constants[c_con] = '' 1043a6878375SBram Moolenaar if g:phpcomplete_parse_docblock_comments && len(get(constants, const_index)) > 0 1044a6878375SBram Moolenaar let c_doc[c_con] = phpcomplete#GetDocBlock(a:sccontent, constants[const_index]) 1045a6878375SBram Moolenaar endif 1046a6878375SBram Moolenaar let const_index += 1 1047a6878375SBram Moolenaar endif 1048a6878375SBram Moolenaar endfor 1049a6878375SBram Moolenaar 1050a6878375SBram Moolenaar let all_values = {} 1051a6878375SBram Moolenaar call extend(all_values, c_functions) 1052a6878375SBram Moolenaar call extend(all_values, c_variables) 1053a6878375SBram Moolenaar call extend(all_values, c_constants) 1054a6878375SBram Moolenaar 1055a6878375SBram Moolenaar for m in sort(keys(all_values)) 1056a6878375SBram Moolenaar if stridx(m, a:base) == 0 1057a6878375SBram Moolenaar call add(res, m) 1058a6878375SBram Moolenaar endif 1059a6878375SBram Moolenaar endfor 1060a6878375SBram Moolenaar 1061a6878375SBram Moolenaar let start_list = res 1062a6878375SBram Moolenaar 1063a6878375SBram Moolenaar let final_list = [] 1064a6878375SBram Moolenaar for i in start_list 1065a6878375SBram Moolenaar let docblock = phpcomplete#ParseDocBlock(get(c_doc, i, '')) 1066a6878375SBram Moolenaar if has_key(c_variables, i) 1067a6878375SBram Moolenaar let final_list += 1068a6878375SBram Moolenaar \ [{'word': i, 1069a6878375SBram Moolenaar \ 'info':phpcomplete#FormatDocBlock(docblock), 1070a6878375SBram Moolenaar \ 'menu':get(docblock.var, 'type', ''), 1071a6878375SBram Moolenaar \ 'kind':'v'}] 1072a6878375SBram Moolenaar elseif has_key(c_constants, i) 1073a6878375SBram Moolenaar let info = phpcomplete#FormatDocBlock(docblock) 1074a6878375SBram Moolenaar if info != '' 1075a6878375SBram Moolenaar let info = "\n".info 1076a6878375SBram Moolenaar endif 1077a6878375SBram Moolenaar let final_list += 1078a6878375SBram Moolenaar \ [{'word':i, 1079a6878375SBram Moolenaar \ 'info':i.info, 1080a6878375SBram Moolenaar \ 'menu':all_values[i], 1081a6878375SBram Moolenaar \ 'kind':'d'}] 1082a6878375SBram Moolenaar else 1083a6878375SBram Moolenaar let return_type = get(docblock.return, 'type', '') 1084a6878375SBram Moolenaar if return_type != '' 1085a6878375SBram Moolenaar let return_type = ' | '.return_type 1086a6878375SBram Moolenaar endif 1087a6878375SBram Moolenaar let info = phpcomplete#FormatDocBlock(docblock) 1088a6878375SBram Moolenaar if info != '' 1089a6878375SBram Moolenaar let info = "\n".info 1090a6878375SBram Moolenaar endif 1091a6878375SBram Moolenaar let final_list += 1092a6878375SBram Moolenaar \ [{'word':substitute(i, '.*::', '', ''), 1093a6878375SBram Moolenaar \ 'info':i.all_values[i].')'.info, 1094a6878375SBram Moolenaar \ 'menu':all_values[i].')'.return_type, 1095ceaf7b8bSBram Moolenaar \ 'kind':'f'}] 1096e48ec1faSBram Moolenaar endif 1097e48ec1faSBram Moolenaar endfor 1098e48ec1faSBram Moolenaar 1099e48ec1faSBram Moolenaar return final_list 1100a6878375SBram Moolenaarendfunction 1101a6878375SBram Moolenaar" }}} 1102a6878375SBram Moolenaar 1103a6878375SBram Moolenaarfunction! phpcomplete#CompleteBuiltInClass(context, classname, base) " {{{ 1104a6878375SBram Moolenaar let class_info = g:php_builtin_classes[tolower(a:classname)] 1105a6878375SBram Moolenaar let res = [] 1106a6878375SBram Moolenaar if a:context =~ '->$' " complete for everything instance related 1107a6878375SBram Moolenaar " methods 1108a6878375SBram Moolenaar for [method_name, method_info] in items(class_info.methods) 1109822ff866SBram Moolenaar if stridx(method_name, '__') != 0 && (a:base == '' || method_name =~? '^'.a:base) 1110a6878375SBram Moolenaar call add(res, {'word':method_name.'(', 'kind': 'f', 'menu': method_info.signature, 'info': method_info.signature }) 1111a6878375SBram Moolenaar endif 1112a6878375SBram Moolenaar endfor 1113a6878375SBram Moolenaar " properties 1114a6878375SBram Moolenaar for [property_name, property_info] in items(class_info.properties) 1115a6878375SBram Moolenaar if a:base == '' || property_name =~? '^'.a:base 1116a6878375SBram Moolenaar call add(res, {'word':property_name, 'kind': 'v', 'menu': property_info.type, 'info': property_info.type }) 1117a6878375SBram Moolenaar endif 1118a6878375SBram Moolenaar endfor 1119a6878375SBram Moolenaar elseif a:context =~ '::$' " complete for everything static 1120a6878375SBram Moolenaar " methods 1121a6878375SBram Moolenaar for [method_name, method_info] in items(class_info.static_methods) 1122a6878375SBram Moolenaar if a:base == '' || method_name =~? '^'.a:base 1123a6878375SBram Moolenaar call add(res, {'word':method_name.'(', 'kind': 'f', 'menu': method_info.signature, 'info': method_info.signature }) 1124a6878375SBram Moolenaar endif 1125a6878375SBram Moolenaar endfor 1126a6878375SBram Moolenaar " properties 1127a6878375SBram Moolenaar for [property_name, property_info] in items(class_info.static_properties) 1128a6878375SBram Moolenaar if a:base == '' || property_name =~? '^'.a:base 1129a6878375SBram Moolenaar call add(res, {'word':property_name, 'kind': 'v', 'menu': property_info.type, 'info': property_info.type }) 1130a6878375SBram Moolenaar endif 1131a6878375SBram Moolenaar endfor 1132a6878375SBram Moolenaar " constants 1133a6878375SBram Moolenaar for [constant_name, constant_info] in items(class_info.constants) 1134a6878375SBram Moolenaar if a:base == '' || constant_name =~? '^'.a:base 1135a6878375SBram Moolenaar call add(res, {'word':constant_name, 'kind': 'd', 'menu': constant_info, 'info': constant_info}) 1136a6878375SBram Moolenaar endif 1137a6878375SBram Moolenaar endfor 1138a6878375SBram Moolenaar endif 1139a6878375SBram Moolenaar return res 1140a6878375SBram Moolenaarendfunction 1141a6878375SBram Moolenaar" }}} 1142a6878375SBram Moolenaar 1143a6878375SBram Moolenaarfunction! phpcomplete#GetTaglist(pattern) " {{{ 1144a6878375SBram Moolenaar let cache_checksum = '' 1145a6878375SBram Moolenaar if g:phpcomplete_cache_taglists == 1 1146a6878375SBram Moolenaar " build a string with format of "<tagfile>:<mtime>$<tagfile2>:<mtime2>..." 1147a6878375SBram Moolenaar " to validate that the tags are not changed since the time we saved the results in cache 1148a6878375SBram Moolenaar for tagfile in sort(tagfiles()) 1149a6878375SBram Moolenaar let cache_checksum .= fnamemodify(tagfile, ':p').':'.getftime(tagfile).'$' 1150a6878375SBram Moolenaar endfor 1151a6878375SBram Moolenaar 1152a6878375SBram Moolenaar if s:cache_tags_checksum != cache_checksum 1153a6878375SBram Moolenaar " tag file(s) changed 1154a6878375SBram Moolenaar " since we don't know where individual tags coming from when calling taglist() we zap the whole cache 1155a6878375SBram Moolenaar " no way to clear only the entries originating from the changed tag file 1156a6878375SBram Moolenaar let s:cache_tags = {} 1157e48ec1faSBram Moolenaar endif 1158e48ec1faSBram Moolenaar 1159a6878375SBram Moolenaar if has_key(s:cache_tags, a:pattern) 1160a6878375SBram Moolenaar return s:cache_tags[a:pattern] 1161a6878375SBram Moolenaar endif 1162a6878375SBram Moolenaar endif 1163a6878375SBram Moolenaar 1164a6878375SBram Moolenaar let tags = taglist(a:pattern) 1165dc083288SBram Moolenaar for tag in tags 1166dc083288SBram Moolenaar for prop in keys(tag) 1167dc083288SBram Moolenaar if prop == 'cmd' || prop == 'static' || prop == 'kind' || prop == 'builtin' 1168dc083288SBram Moolenaar continue 1169dc083288SBram Moolenaar endif 1170dc083288SBram Moolenaar let tag[prop] = substitute(tag[prop], '\\\\', '\\', 'g') 1171dc083288SBram Moolenaar endfor 1172dc083288SBram Moolenaar endfor 1173a6878375SBram Moolenaar let s:cache_tags[a:pattern] = tags 1174a6878375SBram Moolenaar let has_key = has_key(s:cache_tags, a:pattern) 1175a6878375SBram Moolenaar let s:cache_tags_checksum = cache_checksum 1176a6878375SBram Moolenaar return tags 1177a6878375SBram Moolenaarendfunction 1178a6878375SBram Moolenaar" }}} 1179a6878375SBram Moolenaar 1180a6878375SBram Moolenaarfunction! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) " {{{ 1181a6878375SBram Moolenaar " locate the current instruction (up until the previous non comment or string ";" or php region start (<?php or <?) without newlines 1182a6878375SBram Moolenaar let col_number = a:col_number 1183a6878375SBram Moolenaar let line_number = a:line_number 1184a6878375SBram Moolenaar let line = getline(a:line_number) 1185a6878375SBram Moolenaar let current_char = -1 1186a6878375SBram Moolenaar let instruction = '' 1187a6878375SBram Moolenaar let parent_depth = 0 1188a6878375SBram Moolenaar let bracket_depth = 0 1189a6878375SBram Moolenaar let stop_chars = [ 1190a6878375SBram Moolenaar \ '!', '@', '%', '^', '&', 1191a6878375SBram Moolenaar \ '*', '/', '-', '+', '=', 1192a6878375SBram Moolenaar \ ':', '>', '<', '.', '?', 1193a6878375SBram Moolenaar \ ';', '(', '|', '[' 1194a6878375SBram Moolenaar \ ] 1195a6878375SBram Moolenaar 1196a6878375SBram Moolenaar let phpbegin_length = len(matchstr(getline(a:phpbegin[0]), '\zs<?\(php\)\?\ze')) 1197a6878375SBram Moolenaar let phpbegin_end = [a:phpbegin[0], a:phpbegin[1] - 1 + phpbegin_length] 1198a6878375SBram Moolenaar 1199a6878375SBram Moolenaar " will hold the first place where a coma could have ended the match 1200a6878375SBram Moolenaar let first_coma_break_pos = -1 1201a6878375SBram Moolenaar let next_char = len(line) < col_number ? line[col_number + 1] : '' 1202a6878375SBram Moolenaar 1203a6878375SBram Moolenaar while !(line_number == 1 && col_number == 1) 1204a6878375SBram Moolenaar if current_char != -1 1205a6878375SBram Moolenaar let next_char = current_char 1206a6878375SBram Moolenaar endif 1207a6878375SBram Moolenaar 1208a6878375SBram Moolenaar let current_char = line[col_number] 1209a6878375SBram Moolenaar let synIDName = synIDattr(synID(line_number, col_number + 1, 0), 'name') 1210a6878375SBram Moolenaar 1211a6878375SBram Moolenaar if col_number - 1 == -1 1212a6878375SBram Moolenaar let prev_line_number = line_number - 1 1213a6878375SBram Moolenaar let prev_line = getline(line_number - 1) 1214a6878375SBram Moolenaar let prev_col_number = strlen(prev_line) 1215a6878375SBram Moolenaar else 1216a6878375SBram Moolenaar let prev_line_number = line_number 1217a6878375SBram Moolenaar let prev_col_number = col_number - 1 1218a6878375SBram Moolenaar let prev_line = line 1219a6878375SBram Moolenaar endif 1220a6878375SBram Moolenaar let prev_char = prev_line[prev_col_number] 1221a6878375SBram Moolenaar 1222a6878375SBram Moolenaar " skip comments 1223a6878375SBram Moolenaar if synIDName =~? 'comment\|phpDocTags' 1224a6878375SBram Moolenaar let current_char = '' 1225a6878375SBram Moolenaar endif 1226a6878375SBram Moolenaar 1227a6878375SBram Moolenaar " break on the last char of the "and" and "or" operators 1228a6878375SBram Moolenaar if synIDName == 'phpOperator' && (current_char == 'r' || current_char == 'd') 1229a6878375SBram Moolenaar break 1230a6878375SBram Moolenaar endif 1231a6878375SBram Moolenaar 1232a6878375SBram Moolenaar " break on statements as "return" or "throws" 1233a6878375SBram Moolenaar if synIDName == 'phpStatement' || synIDName == 'phpException' 1234a6878375SBram Moolenaar break 1235a6878375SBram Moolenaar endif 1236a6878375SBram Moolenaar 1237a6878375SBram Moolenaar " if the current char should be considered 1238a6878375SBram Moolenaar if current_char != '' && parent_depth >= 0 && bracket_depth >= 0 && synIDName !~? 'comment\|string' 1239a6878375SBram Moolenaar " break if we are on a "naked" stop_char (operators, colon, openparent...) 1240a6878375SBram Moolenaar if index(stop_chars, current_char) != -1 1241a6878375SBram Moolenaar let do_break = 1 1242ed32d942SBram Moolenaar " dont break if it does look like a "->" 1243a6878375SBram Moolenaar if (prev_char == '-' && current_char == '>') || (current_char == '-' && next_char == '>') 1244a6878375SBram Moolenaar let do_break = 0 1245a6878375SBram Moolenaar endif 1246ed32d942SBram Moolenaar " dont break if it does look like a "::" 1247a6878375SBram Moolenaar if (prev_char == ':' && current_char == ':') || (current_char == ':' && next_char == ':') 1248a6878375SBram Moolenaar let do_break = 0 1249a6878375SBram Moolenaar endif 1250a6878375SBram Moolenaar 1251a6878375SBram Moolenaar if do_break 1252a6878375SBram Moolenaar break 1253a6878375SBram Moolenaar endif 1254a6878375SBram Moolenaar endif 1255a6878375SBram Moolenaar 1256*6c391a74SBram Moolenaar " save the coma position for later use if there's a "naked" , possibly separating a parameter and it is not in a parented part 1257a6878375SBram Moolenaar if first_coma_break_pos == -1 && current_char == ',' 1258a6878375SBram Moolenaar let first_coma_break_pos = len(instruction) 1259a6878375SBram Moolenaar endif 1260a6878375SBram Moolenaar endif 1261a6878375SBram Moolenaar 1262a6878375SBram Moolenaar " count nested darenthesis and brackets so we can tell if we need to break on a ';' or not (think of for (;;) loops) 1263a6878375SBram Moolenaar if synIDName =~? 'phpBraceFunc\|phpParent\|Delimiter' 1264a6878375SBram Moolenaar if current_char == '(' 1265a6878375SBram Moolenaar let parent_depth += 1 1266a6878375SBram Moolenaar elseif current_char == ')' 1267a6878375SBram Moolenaar let parent_depth -= 1 1268a6878375SBram Moolenaar 1269a6878375SBram Moolenaar elseif current_char == '[' 1270a6878375SBram Moolenaar let bracket_depth += 1 1271a6878375SBram Moolenaar elseif current_char == ']' 1272a6878375SBram Moolenaar let bracket_depth -= 1 1273a6878375SBram Moolenaar endif 1274a6878375SBram Moolenaar endif 1275a6878375SBram Moolenaar 1276a6878375SBram Moolenaar " stop collecting chars if we see a function start { (think of first line in a function) 1277a6878375SBram Moolenaar if (current_char == '{' || current_char == '}') && synIDName =~? 'phpBraceFunc\|phpParent\|Delimiter' 1278a6878375SBram Moolenaar break 1279a6878375SBram Moolenaar endif 1280a6878375SBram Moolenaar 1281a6878375SBram Moolenaar " break if we are reached the php block start (<?php or <?) 1282a6878375SBram Moolenaar if [line_number, col_number] == phpbegin_end 1283a6878375SBram Moolenaar break 1284a6878375SBram Moolenaar endif 1285a6878375SBram Moolenaar 1286a6878375SBram Moolenaar let instruction = current_char.instruction 1287a6878375SBram Moolenaar 1288a6878375SBram Moolenaar " step a char or a line back if we are on the first column of the line already 1289a6878375SBram Moolenaar let col_number -= 1 1290a6878375SBram Moolenaar if col_number == -1 1291a6878375SBram Moolenaar let line_number -= 1 1292a6878375SBram Moolenaar let line = getline(line_number) 1293a6878375SBram Moolenaar let col_number = strlen(line) 1294a6878375SBram Moolenaar endif 1295a6878375SBram Moolenaar endwhile 1296a6878375SBram Moolenaar 1297a6878375SBram Moolenaar " strip leading whitespace 1298a6878375SBram Moolenaar let instruction = substitute(instruction, '^\s\+', '', '') 1299a6878375SBram Moolenaar 1300a6878375SBram Moolenaar " there were a "naked" coma in the instruction 1301a6878375SBram Moolenaar if first_coma_break_pos != -1 1302*6c391a74SBram Moolenaar if instruction !~? '^use' && instruction !~? '^class' " use ... statements and class declarations should not be broken up by comas 1303a6878375SBram Moolenaar let pos = (-1 * first_coma_break_pos) + 1 1304a6878375SBram Moolenaar let instruction = instruction[pos :] 1305a6878375SBram Moolenaar endif 1306a6878375SBram Moolenaar endif 1307a6878375SBram Moolenaar 1308a6878375SBram Moolenaar " HACK to remove one line conditionals from code like "if ($foo) echo 'bar'" 1309a6878375SBram Moolenaar " what the plugin really need is a proper php tokenizer 1310a6878375SBram Moolenaar if instruction =~? '\c^\(if\|while\|foreach\|for\)\s*(' 1311a6878375SBram Moolenaar " clear everything up until the first ( 1312a6878375SBram Moolenaar let instruction = substitute(instruction, '^\(if\|while\|foreach\|for\)\s*(\s*', '', '') 1313a6878375SBram Moolenaar 1314*6c391a74SBram Moolenaar " lets iterate through the instruction until we can find the pair for the opening ( 1315a6878375SBram Moolenaar let i = 0 1316a6878375SBram Moolenaar let depth = 1 1317a6878375SBram Moolenaar while i < len(instruction) 1318a6878375SBram Moolenaar if instruction[i] == '(' 1319a6878375SBram Moolenaar let depth += 1 1320a6878375SBram Moolenaar endif 1321a6878375SBram Moolenaar if instruction[i] == ')' 1322a6878375SBram Moolenaar let depth -= 1 1323a6878375SBram Moolenaar endif 1324a6878375SBram Moolenaar if depth == 0 1325a6878375SBram Moolenaar break 1326a6878375SBram Moolenaar end 1327a6878375SBram Moolenaar let i += 1 1328a6878375SBram Moolenaar endwhile 1329a6878375SBram Moolenaar let instruction = instruction[i + 1 : len(instruction)] 1330a6878375SBram Moolenaar endif 1331a6878375SBram Moolenaar 1332a6878375SBram Moolenaar " trim whitespace from the ends 1333a6878375SBram Moolenaar let instruction = substitute(instruction, '\v^(^\s+)|(\s+)$', '', 'g') 1334a6878375SBram Moolenaar 1335a6878375SBram Moolenaar return instruction 1336a6878375SBram Moolenaarendfunction " }}} 1337a6878375SBram Moolenaar 1338a6878375SBram Moolenaarfunction! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, imports, methodstack) " {{{ 1339a6878375SBram Moolenaar " Tries to get the classname and namespace for a chained method call like: 1340a6878375SBram Moolenaar " $this->foo()->bar()->baz()-> 1341a6878375SBram Moolenaar 1342a6878375SBram Moolenaar let classname_candidate = a:classname_candidate 1343a6878375SBram Moolenaar let class_candidate_namespace = a:class_candidate_namespace 1344a6878375SBram Moolenaar let methodstack = a:methodstack 1345a6878375SBram Moolenaar let unknown_result = ['', ''] 1346a6878375SBram Moolenaar let prev_method_is_array = (methodstack[0] =~ '\v^[^([]+\[' ? 1 : 0) 1347a6878375SBram Moolenaar let classname_candidate_is_array = (classname_candidate =~ '\[\]$' ? 1 : 0) 1348a6878375SBram Moolenaar 1349a6878375SBram Moolenaar if prev_method_is_array 1350a6878375SBram Moolenaar if classname_candidate_is_array 1351a6878375SBram Moolenaar let classname_candidate = substitute(classname_candidate, '\[\]$', '', '') 1352a6878375SBram Moolenaar else 1353a6878375SBram Moolenaar return unknown_result 1354a6878375SBram Moolenaar endif 1355a6878375SBram Moolenaar endif 1356a6878375SBram Moolenaar 1357a6878375SBram Moolenaar if (len(methodstack) == 1) 1358a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, a:imports) 1359a6878375SBram Moolenaar return [classname_candidate, class_candidate_namespace] 1360a6878375SBram Moolenaar else 1361a6878375SBram Moolenaar call remove(methodstack, 0) 1362a6878375SBram Moolenaar let method_is_array = (methodstack[0] =~ '\v^[^[]+\[' ? 1 : 0) 1363a6878375SBram Moolenaar let method = matchstr(methodstack[0], '\v^\$*\zs[^[(]+\ze') 1364a6878375SBram Moolenaar 1365a6878375SBram Moolenaar let classlocation = phpcomplete#GetClassLocation(classname_candidate, class_candidate_namespace) 1366a6878375SBram Moolenaar 1367a6878375SBram Moolenaar if classlocation == 'VIMPHP_BUILTINOBJECT' && has_key(g:php_builtin_classes, tolower(classname_candidate)) 1368a6878375SBram Moolenaar let class_info = g:php_builtin_classes[tolower(classname_candidate)] 1369a6878375SBram Moolenaar if has_key(class_info['methods'], method) 1370a6878375SBram Moolenaar return phpcomplete#GetCallChainReturnType(class_info['methods'][method].return_type, '\', a:imports, methodstack) 1371a6878375SBram Moolenaar endif 1372a6878375SBram Moolenaar if has_key(class_info['properties'], method) 1373a6878375SBram Moolenaar return phpcomplete#GetCallChainReturnType(class_info['properties'][method].type, '\', a:imports, methodstack) 1374a6878375SBram Moolenaar endif 1375a6878375SBram Moolenaar if has_key(class_info['static_methods'], method) 1376a6878375SBram Moolenaar return phpcomplete#GetCallChainReturnType(class_info['static_methods'][method].return_type, '\', a:imports, methodstack) 1377a6878375SBram Moolenaar endif 1378a6878375SBram Moolenaar if has_key(class_info['static_properties'], method) 1379a6878375SBram Moolenaar return phpcomplete#GetCallChainReturnType(class_info['static_properties'][method].type, '\', a:imports, methodstack) 1380a6878375SBram Moolenaar endif 1381a6878375SBram Moolenaar 1382a6878375SBram Moolenaar return unknown_result 1383a6878375SBram Moolenaar 1384822ff866SBram Moolenaar elseif classlocation != '' && filereadable(classlocation) 1385a6878375SBram Moolenaar " Read the next method from the stack and extract only the name 1386a6878375SBram Moolenaar 1387a6878375SBram Moolenaar let classcontents = phpcomplete#GetCachedClassContents(classlocation, classname_candidate) 1388a6878375SBram Moolenaar 1389a6878375SBram Moolenaar " Get Structured information of all classes and subclasses including namespace and includes 1390a6878375SBram Moolenaar " try to find the method's return type in docblock comment 1391a6878375SBram Moolenaar for classstructure in classcontents 1392dc083288SBram Moolenaar let docblock_target_pattern = 'function\s\+&\?'.method.'\>\|\(public\|private\|protected\|var\).\+\$'.method.'\>\|@property.\+\$'.method.'\>' 1393dd1616e6SBram Moolenaar let doc_str = phpcomplete#GetDocBlock(split(classstructure.content, '\n'), docblock_target_pattern) 13942c64ca18SBram Moolenaar let return_type_hint = phpcomplete#GetFunctionReturnTypeHint(split(classstructure.content, '\n'), 'function\s\+&\?'.method.'\>') 13952c64ca18SBram Moolenaar if doc_str != '' || return_type_hint != '' 1396a6878375SBram Moolenaar break 1397a6878375SBram Moolenaar endif 1398a6878375SBram Moolenaar endfor 13992c64ca18SBram Moolenaar if doc_str != '' || return_type_hint != '' 1400a6878375SBram Moolenaar let docblock = phpcomplete#ParseDocBlock(doc_str) 14012c64ca18SBram Moolenaar if has_key(docblock.return, 'type') || has_key(docblock.var, 'type') || len(docblock.properties) > 0 || return_type_hint != '' 14022c64ca18SBram Moolenaar if return_type_hint == '' 1403dc083288SBram Moolenaar let type = has_key(docblock.return, 'type') ? docblock.return.type : has_key(docblock.var, 'type') ? docblock.var.type : '' 1404dc083288SBram Moolenaar 1405dc083288SBram Moolenaar if type == '' 1406dc083288SBram Moolenaar for property in docblock.properties 1407dc083288SBram Moolenaar if property.description =~? method 1408dc083288SBram Moolenaar let type = property.type 1409dc083288SBram Moolenaar break 1410dc083288SBram Moolenaar endif 1411dc083288SBram Moolenaar endfor 1412dc083288SBram Moolenaar endif 14132c64ca18SBram Moolenaar else 14142c64ca18SBram Moolenaar let type = return_type_hint 14152c64ca18SBram Moolenaar end 1416a6878375SBram Moolenaar 1417a6878375SBram Moolenaar " there's a namespace in the type, threat the type as FQCN 1418a6878375SBram Moolenaar if type =~ '\\' 1419a6878375SBram Moolenaar let parts = split(substitute(type, '^\\', '', ''), '\') 1420a6878375SBram Moolenaar let class_candidate_namespace = join(parts[0:-2], '\') 1421a6878375SBram Moolenaar let classname_candidate = parts[-1] 1422*6c391a74SBram Moolenaar " check for renamed namespace in imports 1423a6878375SBram Moolenaar if has_key(classstructure.imports, class_candidate_namespace) 1424a6878375SBram Moolenaar let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name 1425a6878375SBram Moolenaar endif 1426a6878375SBram Moolenaar else 1427a6878375SBram Moolenaar " no namespace in the type, threat it as a relative classname 1428a6878375SBram Moolenaar let returnclass = type 1429a6878375SBram Moolenaar if has_key(classstructure.imports, returnclass) 1430a6878375SBram Moolenaar if has_key(classstructure.imports[returnclass], 'namespace') 1431a6878375SBram Moolenaar let fullnamespace = classstructure.imports[returnclass].namespace 1432a6878375SBram Moolenaar else 1433a6878375SBram Moolenaar let fullnamespace = class_candidate_namespace 1434a6878375SBram Moolenaar endif 1435a6878375SBram Moolenaar else 1436a6878375SBram Moolenaar let fullnamespace = class_candidate_namespace 1437a6878375SBram Moolenaar endif 1438822ff866SBram Moolenaar " make @return self, static, $this the same way 1439822ff866SBram Moolenaar " (not exactly what php means by these) 1440ed32d942SBram Moolenaar if returnclass == 'self' || returnclass == 'static' || returnclass == '$this' || returnclass == 'self[]' || returnclass == 'static[]' || returnclass == '$this[]' 1441ed32d942SBram Moolenaar if returnclass =~ '\[\]$' 1442ed32d942SBram Moolenaar let classname_candidate = a:classname_candidate.'[]' 1443ed32d942SBram Moolenaar else 1444822ff866SBram Moolenaar let classname_candidate = a:classname_candidate 1445ed32d942SBram Moolenaar endif 1446822ff866SBram Moolenaar let class_candidate_namespace = a:class_candidate_namespace 1447822ff866SBram Moolenaar else 1448a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(returnclass, fullnamespace, a:imports) 1449a6878375SBram Moolenaar endif 1450822ff866SBram Moolenaar endif 1451a6878375SBram Moolenaar 1452a6878375SBram Moolenaar return phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, a:imports, methodstack) 1453a6878375SBram Moolenaar endif 1454a6878375SBram Moolenaar endif 1455a6878375SBram Moolenaar 1456a6878375SBram Moolenaar return unknown_result 1457a6878375SBram Moolenaar else 1458a6878375SBram Moolenaar return unknown_result 1459a6878375SBram Moolenaar endif 1460a6878375SBram Moolenaar endif 1461a6878375SBram Moolenaarendfunction " }}} 1462a6878375SBram Moolenaar 1463a6878375SBram Moolenaarfunction! phpcomplete#GetMethodStack(line) " {{{ 1464a6878375SBram Moolenaar let methodstack = [] 1465a6878375SBram Moolenaar let i = 0 1466a6878375SBram Moolenaar let end = len(a:line) 1467a6878375SBram Moolenaar 1468a6878375SBram Moolenaar let current_part = '' 1469a6878375SBram Moolenaar 1470a6878375SBram Moolenaar let parent_depth = 0 1471a6878375SBram Moolenaar let in_string = 0 1472a6878375SBram Moolenaar let string_start = '' 1473a6878375SBram Moolenaar 1474a6878375SBram Moolenaar let next_char = '' 1475a6878375SBram Moolenaar 1476a6878375SBram Moolenaar while i < end 1477a6878375SBram Moolenaar let current_char = a:line[i] 1478a6878375SBram Moolenaar let next_char = i + 1 < end ? a:line[i + 1] : '' 1479a6878375SBram Moolenaar let prev_char = i >= 1 ? a:line[i - 1] : '' 1480a6878375SBram Moolenaar let prev_prev_char = i >= 2 ? a:line[i - 2] : '' 1481a6878375SBram Moolenaar 1482a6878375SBram Moolenaar if in_string == 0 && parent_depth == 0 && ((current_char == '-' && next_char == '>') || (current_char == ':' && next_char == ':')) 1483a6878375SBram Moolenaar call add(methodstack, current_part) 1484a6878375SBram Moolenaar let current_part = '' 1485a6878375SBram Moolenaar let i += 2 1486a6878375SBram Moolenaar continue 1487a6878375SBram Moolenaar endif 1488a6878375SBram Moolenaar 14892c64ca18SBram Moolenaar " if it looks like a string 1490a6878375SBram Moolenaar if current_char == "'" || current_char == '"' 1491a6878375SBram Moolenaar " and it is not escaped 1492a6878375SBram Moolenaar if prev_char != '\' || (prev_char == '\' && prev_prev_char == '\') 1493a6878375SBram Moolenaar " and we are in a string already 1494a6878375SBram Moolenaar if in_string 1495a6878375SBram Moolenaar " and that string started with this char too 1496a6878375SBram Moolenaar if current_char == string_start 1497a6878375SBram Moolenaar " clear the string mark 1498a6878375SBram Moolenaar let in_string = 0 1499a6878375SBram Moolenaar endif 1500a6878375SBram Moolenaar else " ... and we are not in a string 1501a6878375SBram Moolenaar " set the string mark 1502a6878375SBram Moolenaar let in_string = 1 1503a6878375SBram Moolenaar let string_start = current_char 1504a6878375SBram Moolenaar endif 1505a6878375SBram Moolenaar endif 1506a6878375SBram Moolenaar endif 1507a6878375SBram Moolenaar 1508a6878375SBram Moolenaar if !in_string && a:line[i] == '(' 1509a6878375SBram Moolenaar let parent_depth += 1 1510a6878375SBram Moolenaar endif 1511a6878375SBram Moolenaar if !in_string && a:line[i] == ')' 1512a6878375SBram Moolenaar let parent_depth -= 1 1513a6878375SBram Moolenaar endif 1514a6878375SBram Moolenaar 1515a6878375SBram Moolenaar let current_part .= current_char 1516a6878375SBram Moolenaar let i += 1 1517a6878375SBram Moolenaar endwhile 1518a6878375SBram Moolenaar 1519a6878375SBram Moolenaar " add the last remaining part, this can be an empty string and this is expected 1520a6878375SBram Moolenaar " the empty string represents the completion base (which happen to be an empty string) 1521a6878375SBram Moolenaar if current_part != '' 1522a6878375SBram Moolenaar call add(methodstack, current_part) 1523a6878375SBram Moolenaar endif 1524a6878375SBram Moolenaar 1525a6878375SBram Moolenaar return methodstack 1526a6878375SBram Moolenaarendfunction 1527a6878375SBram Moolenaar" }}} 1528a6878375SBram Moolenaar 1529a6878375SBram Moolenaarfunction! phpcomplete#GetClassName(start_line, context, current_namespace, imports) " {{{ 1530a6878375SBram Moolenaar " Get class name 1531a6878375SBram Moolenaar " Class name can be detected in few ways: 1532a6878375SBram Moolenaar " @var $myVar class 1533fb539273SBram Moolenaar " @var class $myVar 1534a6878375SBram Moolenaar " in the same line (php 5.4 (new Class)-> syntax) 1535a6878375SBram Moolenaar " line above 1536a6878375SBram Moolenaar " or line in tags file 1537a6878375SBram Moolenaar 1538a6878375SBram Moolenaar let class_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' 1539a6878375SBram Moolenaar let function_name_pattern = '[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*' 1540a6878375SBram Moolenaar let function_invocation_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*(' 1541a6878375SBram Moolenaar let variable_name_pattern = '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' 1542a6878375SBram Moolenaar 1543a6878375SBram Moolenaar let classname_candidate = '' 1544a6878375SBram Moolenaar let class_candidate_namespace = a:current_namespace 1545a6878375SBram Moolenaar let class_candidate_imports = a:imports 1546a6878375SBram Moolenaar let methodstack = phpcomplete#GetMethodStack(a:context) 1547a6878375SBram Moolenaar 1548a6878375SBram Moolenaar if a:context =~? '\$this->' || a:context =~? '\(self\|static\)::' || a:context =~? 'parent::' 1549a6878375SBram Moolenaar let i = 1 1550a6878375SBram Moolenaar while i < a:start_line 1551a6878375SBram Moolenaar let line = getline(a:start_line - i) 1552a6878375SBram Moolenaar 1553a6878375SBram Moolenaar " Don't complete self:: or $this if outside of a class 1554a6878375SBram Moolenaar " (assumes correct indenting) 1555a6878375SBram Moolenaar if line =~ '^}' 1556a6878375SBram Moolenaar return '' 1557a6878375SBram Moolenaar endif 1558a6878375SBram Moolenaar 155983d1b190SBram Moolenaar if line =~? '\v^\s*(abstract\s+|final\s+)*\s*class\s' 156083d1b190SBram Moolenaar let class_name = matchstr(line, '\cclass\s\+\zs'.class_name_pattern.'\ze') 1561a6878375SBram Moolenaar let extended_class = matchstr(line, '\cclass\s\+'.class_name_pattern.'\s\+extends\s\+\zs'.class_name_pattern.'\ze') 1562a6878375SBram Moolenaar 1563a6878375SBram Moolenaar let classname_candidate = a:context =~? 'parent::' ? extended_class : class_name 1564a6878375SBram Moolenaar if classname_candidate != '' 1565a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) 1566a6878375SBram Moolenaar " return absolute classname, without leading \ 1567a6878375SBram Moolenaar return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate 1568a6878375SBram Moolenaar endif 156983d1b190SBram Moolenaar endif 157083d1b190SBram Moolenaar 157183d1b190SBram Moolenaar let i += 1 1572a6878375SBram Moolenaar endwhile 1573a6878375SBram Moolenaar elseif a:context =~? '(\s*new\s\+'.class_name_pattern.'\s*)->' 1574a6878375SBram Moolenaar let classname_candidate = matchstr(a:context, '\cnew\s\+\zs'.class_name_pattern.'\ze') 1575a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) 1576a6878375SBram Moolenaar " return absolute classname, without leading \ 1577a6878375SBram Moolenaar return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate 1578a6878375SBram Moolenaar elseif get(methodstack, 0) =~# function_invocation_pattern 1579a6878375SBram Moolenaar let function_name = matchstr(methodstack[0], '^\s*\zs'.function_name_pattern) 1580a6878375SBram Moolenaar let function_file = phpcomplete#GetFunctionLocation(function_name, a:current_namespace) 1581dc083288SBram Moolenaar if function_file == '' 1582dc083288SBram Moolenaar let function_file = phpcomplete#GetFunctionLocation(function_name, '\') 1583dc083288SBram Moolenaar endif 1584a6878375SBram Moolenaar 1585a6878375SBram Moolenaar if function_file == 'VIMPHP_BUILTINFUNCTION' 1586a6878375SBram Moolenaar " built in function, grab the return type from the info string 1587a6878375SBram Moolenaar let return_type = matchstr(g:php_builtin_functions[function_name.'('], '\v\|\s+\zs.+$') 1588a6878375SBram Moolenaar let classname_candidate = return_type 1589a6878375SBram Moolenaar let class_candidate_namespace = '\' 1590822ff866SBram Moolenaar elseif function_file != '' && filereadable(function_file) 1591a6878375SBram Moolenaar let file_lines = readfile(function_file) 1592822ff866SBram Moolenaar let docblock_str = phpcomplete#GetDocBlock(file_lines, 'function\s*&\?\<'.function_name.'\>') 15932c64ca18SBram Moolenaar let return_type_hint = phpcomplete#GetFunctionReturnTypeHint(file_lines, 'function\s*&\?'.function_name.'\>') 1594a6878375SBram Moolenaar let docblock = phpcomplete#ParseDocBlock(docblock_str) 15952c64ca18SBram Moolenaar let type = has_key(docblock.return, 'type') ? docblock.return.type : return_type_hint 15962c64ca18SBram Moolenaar if type != '' 15972c64ca18SBram Moolenaar let classname_candidate = type 1598a6878375SBram Moolenaar let [class_candidate_namespace, function_imports] = phpcomplete#GetCurrentNameSpace(file_lines) 1599a6878375SBram Moolenaar " try to expand the classname of the returned type with the context got from the function's source file 1600a6878375SBram Moolenaar 1601dc083288SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports) 1602a6878375SBram Moolenaar endif 1603a6878375SBram Moolenaar endif 1604a6878375SBram Moolenaar if classname_candidate != '' 1605a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) 1606a6878375SBram Moolenaar " return absolute classname, without leading \ 1607a6878375SBram Moolenaar return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate 1608a6878375SBram Moolenaar endif 1609a6878375SBram Moolenaar else 1610822ff866SBram Moolenaar " extract the variable name from the context 1611822ff866SBram Moolenaar let object = methodstack[0] 1612822ff866SBram Moolenaar let object_is_array = (object =~ '\v^[^[]+\[' ? 1 : 0) 1613822ff866SBram Moolenaar let object = matchstr(object, variable_name_pattern) 1614822ff866SBram Moolenaar 1615fb539273SBram Moolenaar let function_boundary = phpcomplete#GetCurrentFunctionBoundaries() 1616fb539273SBram Moolenaar let search_end_line = max([1, function_boundary[0][0]]) 1617fb539273SBram Moolenaar " -1 makes us ignore the current line (where the completion was invoked 1618ed32d942SBram Moolenaar let lines = reverse(getline(search_end_line, a:start_line - 1)) 1619fb539273SBram Moolenaar 1620a6878375SBram Moolenaar " check Constant lookup 1621a6878375SBram Moolenaar let constant_object = matchstr(a:context, '\zs'.class_name_pattern.'\ze::') 1622a6878375SBram Moolenaar if constant_object != '' 1623a6878375SBram Moolenaar let classname_candidate = constant_object 1624a6878375SBram Moolenaar endif 1625a6878375SBram Moolenaar 1626822ff866SBram Moolenaar if classname_candidate == '' 1627a6878375SBram Moolenaar " scan the file backwards from current line for explicit type declaration (@var $variable Classname) 1628fb539273SBram Moolenaar for line in lines 1629a6878375SBram Moolenaar " in file lookup for /* @var $foo Class */ 1630a6878375SBram Moolenaar if line =~# '@var\s\+'.object.'\s\+'.class_name_pattern 1631a6878375SBram Moolenaar let classname_candidate = matchstr(line, '@var\s\+'.object.'\s\+\zs'.class_name_pattern.'\(\[\]\)\?') 1632822ff866SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports) 1633a6878375SBram Moolenaar break 1634fb539273SBram Moolenaar endif 1635fb539273SBram Moolenaar " in file lookup for /* @var Class $foo */ 1636fb539273SBram Moolenaar if line =~# '@var\s\+'.class_name_pattern.'\s\+'.object 1637fb539273SBram Moolenaar let classname_candidate = matchstr(line, '@var\s\+\zs'.class_name_pattern.'\(\[\]\)\?\ze'.'\s\+'.object) 1638fb539273SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports) 1639a6878375SBram Moolenaar break 1640a6878375SBram Moolenaar endif 1641fb539273SBram Moolenaar endfor 1642822ff866SBram Moolenaar endif 1643a6878375SBram Moolenaar 1644a6878375SBram Moolenaar if classname_candidate != '' 1645a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) 1646a6878375SBram Moolenaar " return absolute classname, without leading \ 1647a6878375SBram Moolenaar return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate 1648a6878375SBram Moolenaar endif 1649a6878375SBram Moolenaar " scan the file backwards from the current line 1650a6878375SBram Moolenaar let i = 1 1651fb539273SBram Moolenaar for line in lines " {{{ 1652a6878375SBram Moolenaar " do in-file lookup of $var = new Class 1653a6878375SBram Moolenaar if line =~# '^\s*'.object.'\s*=\s*new\s\+'.class_name_pattern && !object_is_array 1654a6878375SBram Moolenaar let classname_candidate = matchstr(line, object.'\c\s*=\s*new\s*\zs'.class_name_pattern.'\ze') 1655e968e36aSBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports) 1656a6878375SBram Moolenaar break 1657a6878375SBram Moolenaar endif 1658a6878375SBram Moolenaar 1659a6878375SBram Moolenaar " in-file lookup for Class::getInstance() 1660a6878375SBram Moolenaar if line =~# '^\s*'.object.'\s*=&\?\s*'.class_name_pattern.'\s*::\s*getInstance' && !object_is_array 1661a6878375SBram Moolenaar let classname_candidate = matchstr(line, object.'\s*=&\?\s*\zs'.class_name_pattern.'\ze\s*::\s*getInstance') 1662e968e36aSBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports) 1663a6878375SBram Moolenaar break 1664a6878375SBram Moolenaar endif 1665a6878375SBram Moolenaar 1666a6878375SBram Moolenaar " do in-file lookup for static method invocation of a built-in class, like: $d = DateTime::createFromFormat() 1667a6878375SBram Moolenaar if line =~# '^\s*'.object.'\s*=&\?\s*'.class_name_pattern.'\s*::\s*$\?[a-zA-Z_0-9\x7f-\xff]\+' 1668a6878375SBram Moolenaar let classname = matchstr(line, '^\s*'.object.'\s*=&\?\s*\zs'.class_name_pattern.'\ze\s*::') 1669a6878375SBram Moolenaar if has_key(a:imports, classname) && a:imports[classname].kind == 'c' 1670a6878375SBram Moolenaar let classname = a:imports[classname].name 1671a6878375SBram Moolenaar endif 1672a6878375SBram Moolenaar if has_key(g:php_builtin_classes, tolower(classname)) 1673a6878375SBram Moolenaar let sub_methodstack = phpcomplete#GetMethodStack(matchstr(line, '^\s*'.object.'\s*=&\?\s*\s\+\zs.*')) 1674a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname, '\', {}, sub_methodstack) 1675a6878375SBram Moolenaar return classname_candidate 1676a6878375SBram Moolenaar else 1677a6878375SBram Moolenaar " try to get the class name from the static method's docblock 1678a6878375SBram Moolenaar let [classname, namespace_for_class] = phpcomplete#ExpandClassName(classname, a:current_namespace, a:imports) 1679a6878375SBram Moolenaar let sub_methodstack = phpcomplete#GetMethodStack(matchstr(line, '^\s*'.object.'\s*=&\?\s*\s\+\zs.*')) 1680a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType( 1681a6878375SBram Moolenaar \ classname, 1682dc083288SBram Moolenaar \ namespace_for_class, 1683a6878375SBram Moolenaar \ a:imports, 1684a6878375SBram Moolenaar \ sub_methodstack) 1685dc083288SBram Moolenaar 1686a6878375SBram Moolenaar return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate 1687a6878375SBram Moolenaar endif 1688a6878375SBram Moolenaar endif 1689a6878375SBram Moolenaar 1690f3c2afb7SBram Moolenaar " function declaration line 1691f3c2afb7SBram Moolenaar if line =~? 'function\(\s\+'.function_name_pattern.'\)\?\s*(' 169286ae720dSBram Moolenaar let function_lines = join(reverse(copy(lines)), " ") 1693f3c2afb7SBram Moolenaar " search for type hinted arguments 1694f3c2afb7SBram Moolenaar if function_lines =~? 'function\(\s\+'.function_name_pattern.'\)\?\s*(.\{-}'.class_name_pattern.'\s\+'.object && !object_is_array 1695f3c2afb7SBram Moolenaar let f_args = matchstr(function_lines, '\cfunction\(\s\+'.function_name_pattern.'\)\?\s*(\zs.\{-}\ze)') 1696a6878375SBram Moolenaar let args = split(f_args, '\s*\zs,\ze\s*') 1697a6878375SBram Moolenaar for arg in args 1698a6878375SBram Moolenaar if arg =~# object.'\(,\|$\)' 1699a6878375SBram Moolenaar let classname_candidate = matchstr(arg, '\s*\zs'.class_name_pattern.'\ze\s\+'.object) 170091e15e13SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports) 1701a6878375SBram Moolenaar break 1702a6878375SBram Moolenaar endif 1703a6878375SBram Moolenaar endfor 1704a6878375SBram Moolenaar if classname_candidate != '' 1705a6878375SBram Moolenaar break 1706a6878375SBram Moolenaar endif 1707a6878375SBram Moolenaar endif 1708a6878375SBram Moolenaar 1709f3c2afb7SBram Moolenaar " search for docblock for the function 1710a6878375SBram Moolenaar let match_line = substitute(line, '\\', '\\\\', 'g') 1711a6878375SBram Moolenaar let sccontent = getline(0, a:start_line - i) 1712a6878375SBram Moolenaar let doc_str = phpcomplete#GetDocBlock(sccontent, match_line) 1713a6878375SBram Moolenaar if doc_str != '' 1714a6878375SBram Moolenaar let docblock = phpcomplete#ParseDocBlock(doc_str) 1715a6878375SBram Moolenaar for param in docblock.params 1716a6878375SBram Moolenaar if param.name =~? object 1717a6878375SBram Moolenaar let classname_candidate = matchstr(param.type, class_name_pattern.'\(\[\]\)\?') 171891e15e13SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports) 1719a6878375SBram Moolenaar break 1720a6878375SBram Moolenaar endif 1721a6878375SBram Moolenaar endfor 1722a6878375SBram Moolenaar if classname_candidate != '' 1723a6878375SBram Moolenaar break 1724a6878375SBram Moolenaar endif 1725a6878375SBram Moolenaar endif 1726a6878375SBram Moolenaar endif 1727a6878375SBram Moolenaar 1728a6878375SBram Moolenaar " assignment for the variable in question with a variable on the right hand side 1729f3c2afb7SBram Moolenaar if line =~# '^\s*'.object.'\s*=&\?\s\+\(clone\)\?\s*'.variable_name_pattern 1730ed32d942SBram Moolenaar 1731ed32d942SBram Moolenaar " try to find the next non-comment or string ";" char 1732f3c2afb7SBram Moolenaar let start_col = match(line, '^\s*'.object.'\C\s*=\zs&\?\s\+\(clone\)\?\s*'.variable_name_pattern) 173386ae720dSBram Moolenaar let filelines = reverse(copy(lines)) 1734dd1616e6SBram Moolenaar let [pos, char] = s:getNextCharWithPos(filelines, [len(filelines) - i, start_col]) 1735ed32d942SBram Moolenaar let chars_read = 1 1736f3c2afb7SBram Moolenaar let last_pos = pos 1737dd1616e6SBram Moolenaar " function_boundary == 0 if we are not in a function 1738dd1616e6SBram Moolenaar let real_lines_offset = len(function_boundary) == 1 ? 1 : function_boundary[0][0] 1739ed32d942SBram Moolenaar " read while end of the file 1740ed32d942SBram Moolenaar while char != 'EOF' && chars_read < 1000 1741ed32d942SBram Moolenaar let last_pos = pos 1742ed32d942SBram Moolenaar let [pos, char] = s:getNextCharWithPos(filelines, pos) 1743ed32d942SBram Moolenaar let chars_read += 1 1744ed32d942SBram Moolenaar " we got a candidate 1745ed32d942SBram Moolenaar if char == ';' 1746dd1616e6SBram Moolenaar " pos values is relative to the function's lines, 1747dd1616e6SBram Moolenaar " line 0 need to be offsetted with the line number 1748dd1616e6SBram Moolenaar " where te function was started to get the line number 1749dd1616e6SBram Moolenaar " in real buffer terms 1750dd1616e6SBram Moolenaar let synIDName = synIDattr(synID(real_lines_offset + pos[0], pos[1] + 1, 0), 'name') 1751ed32d942SBram Moolenaar " it's not a comment or string, end search 1752ed32d942SBram Moolenaar if synIDName !~? 'comment\|string' 1753ed32d942SBram Moolenaar break 1754ed32d942SBram Moolenaar endif 1755ed32d942SBram Moolenaar endif 1756ed32d942SBram Moolenaar endwhile 1757ed32d942SBram Moolenaar 1758dd1616e6SBram Moolenaar let prev_context = phpcomplete#GetCurrentInstruction(real_lines_offset + last_pos[0], last_pos[1], b:phpbegin) 1759ed32d942SBram Moolenaar if prev_context == '' 1760ed32d942SBram Moolenaar " cannot get previous context give up 1761ed32d942SBram Moolenaar return 1762ed32d942SBram Moolenaar endif 1763a6878375SBram Moolenaar let prev_class = phpcomplete#GetClassName(a:start_line - i, prev_context, a:current_namespace, a:imports) 1764a6878375SBram Moolenaar 1765a6878375SBram Moolenaar if stridx(prev_class, '\') != -1 1766a6878375SBram Moolenaar let classname_parts = split(prev_class, '\\\+') 1767a6878375SBram Moolenaar let classname_candidate = classname_parts[-1] 1768a6878375SBram Moolenaar let class_candidate_namespace = join(classname_parts[0:-2], '\') 1769a6878375SBram Moolenaar else 1770a6878375SBram Moolenaar let classname_candidate = prev_class 1771a6878375SBram Moolenaar let class_candidate_namespace = '\' 1772a6878375SBram Moolenaar endif 1773a6878375SBram Moolenaar break 1774a6878375SBram Moolenaar endif 1775a6878375SBram Moolenaar 1776a6878375SBram Moolenaar " assignment for the variable in question with a function on the right hand side 1777a6878375SBram Moolenaar if line =~# '^\s*'.object.'\s*=&\?\s*'.function_invocation_pattern 1778ed32d942SBram Moolenaar " try to find the next non-comment or string ";" char 1779ed32d942SBram Moolenaar let start_col = match(line, '\C^\s*'.object.'\s*=\zs&\?\s*'.function_invocation_pattern) 1780dd1616e6SBram Moolenaar let filelines = reverse(copy(lines)) 1781dd1616e6SBram Moolenaar let [pos, char] = s:getNextCharWithPos(filelines, [len(filelines) - i, start_col]) 1782ed32d942SBram Moolenaar let chars_read = 1 1783f3c2afb7SBram Moolenaar let last_pos = pos 1784dd1616e6SBram Moolenaar " function_boundary == 0 if we are not in a function 1785dd1616e6SBram Moolenaar let real_lines_offset = len(function_boundary) == 1 ? 1 : function_boundary[0][0] 1786ed32d942SBram Moolenaar " read while end of the file 1787ed32d942SBram Moolenaar while char != 'EOF' && chars_read < 1000 1788ed32d942SBram Moolenaar let last_pos = pos 1789ed32d942SBram Moolenaar let [pos, char] = s:getNextCharWithPos(filelines, pos) 1790ed32d942SBram Moolenaar let chars_read += 1 1791ed32d942SBram Moolenaar " we got a candidate 1792ed32d942SBram Moolenaar if char == ';' 1793dd1616e6SBram Moolenaar " pos values is relative to the function's lines, 1794dd1616e6SBram Moolenaar " line 0 need to be offsetted with the line number 1795dd1616e6SBram Moolenaar " where te function was started to get the line number 1796dd1616e6SBram Moolenaar " in real buffer terms 1797dd1616e6SBram Moolenaar let synIDName = synIDattr(synID(real_lines_offset + pos[0], pos[1] + 1, 0), 'name') 1798ed32d942SBram Moolenaar " it's not a comment or string, end search 1799ed32d942SBram Moolenaar if synIDName !~? 'comment\|string' 1800ed32d942SBram Moolenaar break 1801ed32d942SBram Moolenaar endif 1802ed32d942SBram Moolenaar endif 1803ed32d942SBram Moolenaar endwhile 1804ed32d942SBram Moolenaar 1805dd1616e6SBram Moolenaar let prev_context = phpcomplete#GetCurrentInstruction(real_lines_offset + last_pos[0], last_pos[1], b:phpbegin) 1806ed32d942SBram Moolenaar if prev_context == '' 1807ed32d942SBram Moolenaar " cannot get previous context give up 1808ed32d942SBram Moolenaar return 1809ed32d942SBram Moolenaar endif 1810a6878375SBram Moolenaar 1811a6878375SBram Moolenaar let function_name = matchstr(prev_context, '^'.function_invocation_pattern.'\ze') 1812a6878375SBram Moolenaar let function_name = matchstr(function_name, '^\zs.\+\ze\s*($') " strip the trailing ( 1813a6878375SBram Moolenaar let [function_name, function_namespace] = phpcomplete#ExpandClassName(function_name, a:current_namespace, a:imports) 1814a6878375SBram Moolenaar 1815a6878375SBram Moolenaar let function_file = phpcomplete#GetFunctionLocation(function_name, function_namespace) 1816dc083288SBram Moolenaar if function_file == '' 1817dc083288SBram Moolenaar let function_file = phpcomplete#GetFunctionLocation(function_name, '\') 1818dc083288SBram Moolenaar endif 1819a6878375SBram Moolenaar 1820a6878375SBram Moolenaar if function_file == 'VIMPHP_BUILTINFUNCTION' 1821a6878375SBram Moolenaar " built in function, grab the return type from the info string 1822a6878375SBram Moolenaar let return_type = matchstr(g:php_builtin_functions[function_name.'('], '\v\|\s+\zs.+$') 1823a6878375SBram Moolenaar let classname_candidate = return_type 1824a6878375SBram Moolenaar let class_candidate_namespace = '\' 1825a6878375SBram Moolenaar break 1826822ff866SBram Moolenaar elseif function_file != '' && filereadable(function_file) 1827a6878375SBram Moolenaar let file_lines = readfile(function_file) 1828822ff866SBram Moolenaar let docblock_str = phpcomplete#GetDocBlock(file_lines, 'function\s*&\?\<'.function_name.'\>') 18292c64ca18SBram Moolenaar let return_type_hint = phpcomplete#GetFunctionReturnTypeHint(file_lines, 'function\s*&\?'.function_name.'\>') 1830a6878375SBram Moolenaar let docblock = phpcomplete#ParseDocBlock(docblock_str) 18312c64ca18SBram Moolenaar let type = has_key(docblock.return, 'type') ? docblock.return.type : return_type_hint 18322c64ca18SBram Moolenaar if type != '' 18332c64ca18SBram Moolenaar let classname_candidate = type 1834a6878375SBram Moolenaar let [class_candidate_namespace, function_imports] = phpcomplete#GetCurrentNameSpace(file_lines) 1835a6878375SBram Moolenaar " try to expand the classname of the returned type with the context got from the function's source file 1836dc083288SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports) 1837a6878375SBram Moolenaar break 1838a6878375SBram Moolenaar endif 1839a6878375SBram Moolenaar endif 1840a6878375SBram Moolenaar endif 1841a6878375SBram Moolenaar 1842a6878375SBram Moolenaar " foreach with the variable in question 1843a6878375SBram Moolenaar if line =~? 'foreach\s*(.\{-}\s\+'.object.'\s*)' 1844a6878375SBram Moolenaar let sub_context = matchstr(line, 'foreach\s*(\s*\zs.\{-}\ze\s\+as') 1845a6878375SBram Moolenaar let prev_class = phpcomplete#GetClassName(a:start_line - i, sub_context, a:current_namespace, a:imports) 1846a6878375SBram Moolenaar 1847a6878375SBram Moolenaar " the iterated expression should return an array type 1848a6878375SBram Moolenaar if prev_class =~ '\[\]$' 1849a6878375SBram Moolenaar let prev_class = matchstr(prev_class, '\v^[^[]+') 1850a6878375SBram Moolenaar else 1851a6878375SBram Moolenaar return 1852a6878375SBram Moolenaar endif 1853a6878375SBram Moolenaar 1854a6878375SBram Moolenaar if stridx(prev_class, '\') != -1 1855a6878375SBram Moolenaar let classname_parts = split(prev_class, '\\\+') 1856a6878375SBram Moolenaar let classname_candidate = classname_parts[-1] 1857a6878375SBram Moolenaar let class_candidate_namespace = join(classname_parts[0:-2], '\') 1858a6878375SBram Moolenaar else 1859a6878375SBram Moolenaar let classname_candidate = prev_class 1860a6878375SBram Moolenaar let class_candidate_namespace = '\' 1861a6878375SBram Moolenaar endif 1862a6878375SBram Moolenaar break 1863a6878375SBram Moolenaar endif 1864a6878375SBram Moolenaar 1865a6878375SBram Moolenaar " catch clause with the variable in question 1866a6878375SBram Moolenaar if line =~? 'catch\s*(\zs'.class_name_pattern.'\ze\s\+'.object 1867a6878375SBram Moolenaar let classname = matchstr(line, 'catch\s*(\zs'.class_name_pattern.'\ze\s\+'.object) 1868a6878375SBram Moolenaar if stridx(classname, '\') != -1 1869a6878375SBram Moolenaar let classname_parts = split(classname, '\\\+') 1870a6878375SBram Moolenaar let classname_candidate = classname_parts[-1] 1871a6878375SBram Moolenaar let class_candidate_namespace = join(classname_parts[0:-2], '\') 1872a6878375SBram Moolenaar else 1873a6878375SBram Moolenaar let classname_candidate = classname 1874a6878375SBram Moolenaar let class_candidate_namespace = '\' 1875a6878375SBram Moolenaar endif 1876a6878375SBram Moolenaar break 1877a6878375SBram Moolenaar endif 1878a6878375SBram Moolenaar 1879a6878375SBram Moolenaar let i += 1 1880fb539273SBram Moolenaar endfor " }}} 1881a6878375SBram Moolenaar 1882a6878375SBram Moolenaar if classname_candidate != '' 1883a6878375SBram Moolenaar let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack) 1884a6878375SBram Moolenaar " return absolute classname, without leading \ 1885a6878375SBram Moolenaar return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate 1886a6878375SBram Moolenaar endif 1887a6878375SBram Moolenaar 1888a6878375SBram Moolenaar " OK, first way failed, now check tags file(s) 1889a6878375SBram Moolenaar " This method is useless when local variables are not indexed by ctags and 1890a6878375SBram Moolenaar " pretty inaccurate even if it is 1891a6878375SBram Moolenaar if g:phpcomplete_search_tags_for_variables 1892a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^'.substitute(object, '^\$', '', '')) 1893a6878375SBram Moolenaar if len(tags) == 0 1894a6878375SBram Moolenaar return 1895a6878375SBram Moolenaar else 1896a6878375SBram Moolenaar for tag in tags 1897a6878375SBram Moolenaar if tag.kind ==? 'v' && tag.cmd =~? '=\s*new\s\+\zs'.class_name_pattern.'\ze' 1898a6878375SBram Moolenaar let classname = matchstr(tag.cmd, '=\s*new\s\+\zs'.class_name_pattern.'\ze') 1899dc083288SBram Moolenaar " unescape the classname, it would have "\" doubled since it is an ex command 1900dc083288SBram Moolenaar let classname = substitute(classname, '\\\(\_.\)', '\1', 'g') 1901a6878375SBram Moolenaar return classname 1902a6878375SBram Moolenaar endif 1903a6878375SBram Moolenaar endfor 1904a6878375SBram Moolenaar endif 1905a6878375SBram Moolenaar endif 1906a6878375SBram Moolenaar endif 1907a6878375SBram Moolenaarendfunction 1908a6878375SBram Moolenaar" }}} 1909a6878375SBram Moolenaar 1910a6878375SBram Moolenaarfunction! phpcomplete#GetClassLocation(classname, namespace) " {{{ 1911a6878375SBram Moolenaar " Check classname may be name of built in object 1912a6878375SBram Moolenaar if has_key(g:php_builtin_classes, tolower(a:classname)) && (a:namespace == '' || a:namespace == '\') 1913a6878375SBram Moolenaar return 'VIMPHP_BUILTINOBJECT' 1914a6878375SBram Moolenaar endif 1915dd1616e6SBram Moolenaar if has_key(g:php_builtin_interfaces, tolower(a:classname)) && (a:namespace == '' || a:namespace == '\') 1916dd1616e6SBram Moolenaar return 'VIMPHP_BUILTINOBJECT' 1917dd1616e6SBram Moolenaar endif 1918a6878375SBram Moolenaar 1919a6878375SBram Moolenaar if a:namespace == '' || a:namespace == '\' 1920a6878375SBram Moolenaar let search_namespace = '\' 1921a6878375SBram Moolenaar else 1922a6878375SBram Moolenaar let search_namespace = tolower(a:namespace) 1923a6878375SBram Moolenaar endif 1924a6878375SBram Moolenaar let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(getline(0, line('.'))) 1925a6878375SBram Moolenaar 1926a6878375SBram Moolenaar " do in-file lookup for class definition 1927a6878375SBram Moolenaar let i = 1 1928a6878375SBram Moolenaar while i < line('.') 1929a6878375SBram Moolenaar let line = getline(line('.')-i) 193086ae720dSBram Moolenaar if line =~? '^\s*\(abstract\s\+\|final\s\+\)*\s*\(class\|interface\|trait\)\s*'.a:classname.'\(\s\+\|$\|{\)' && tolower(current_namespace) == search_namespace 1931a6878375SBram Moolenaar return expand('%:p') 1932a6878375SBram Moolenaar else 1933a6878375SBram Moolenaar let i += 1 1934a6878375SBram Moolenaar continue 1935a6878375SBram Moolenaar endif 1936a6878375SBram Moolenaar endwhile 1937a6878375SBram Moolenaar 1938a6878375SBram Moolenaar " Get class location from tags 1939a6878375SBram Moolenaar let no_namespace_candidate = '' 1940a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^'.a:classname.'$') 1941a6878375SBram Moolenaar for tag in tags 1942f3c2afb7SBram Moolenaar " We'll allow interfaces and traits to be handled classes since you 1943f3c2afb7SBram Moolenaar " can't have colliding names with different kinds anyway 1944f3c2afb7SBram Moolenaar if tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't' 1945a6878375SBram Moolenaar if !has_key(tag, 'namespace') 1946a6878375SBram Moolenaar let no_namespace_candidate = tag.filename 1947a6878375SBram Moolenaar else 1948a6878375SBram Moolenaar if search_namespace == tolower(tag.namespace) 1949a6878375SBram Moolenaar return tag.filename 1950a6878375SBram Moolenaar endif 1951a6878375SBram Moolenaar endif 1952a6878375SBram Moolenaar endif 1953a6878375SBram Moolenaar endfor 1954a6878375SBram Moolenaar if no_namespace_candidate != '' 1955a6878375SBram Moolenaar return no_namespace_candidate 1956a6878375SBram Moolenaar endif 1957a6878375SBram Moolenaar 1958822ff866SBram Moolenaar return '' 1959a6878375SBram Moolenaarendfunction 1960a6878375SBram Moolenaar" }}} 1961a6878375SBram Moolenaar 1962a6878375SBram Moolenaarfunction! phpcomplete#GetFunctionLocation(function_name, namespace) " {{{ 1963a6878375SBram Moolenaar " builtin functions doesn't need explicit \ in front of them even in namespaces, 1964a6878375SBram Moolenaar " aliased built-in function names are not handled 1965a6878375SBram Moolenaar if has_key(g:php_builtin_functions, a:function_name.'(') 1966a6878375SBram Moolenaar return 'VIMPHP_BUILTINFUNCTION' 1967a6878375SBram Moolenaar endif 1968a6878375SBram Moolenaar 1969822ff866SBram Moolenaar 1970a6878375SBram Moolenaar " do in-file lookup for function definition 1971a6878375SBram Moolenaar let i = 1 1972a6878375SBram Moolenaar let buffer_lines = getline(1, line('$')) 1973a6878375SBram Moolenaar for line in buffer_lines 1974822ff866SBram Moolenaar if line =~? '^\s*function\s\+&\?'.a:function_name.'\s*(' 1975a6878375SBram Moolenaar return expand('%:p') 1976a6878375SBram Moolenaar endif 1977a6878375SBram Moolenaar endfor 1978a6878375SBram Moolenaar 1979a6878375SBram Moolenaar 1980a6878375SBram Moolenaar if a:namespace == '' || a:namespace == '\' 1981a6878375SBram Moolenaar let search_namespace = '\' 1982a6878375SBram Moolenaar else 1983a6878375SBram Moolenaar let search_namespace = tolower(a:namespace) 1984a6878375SBram Moolenaar endif 1985a6878375SBram Moolenaar let no_namespace_candidate = '' 1986a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('\c^'.a:function_name.'$') 1987a6878375SBram Moolenaar 1988a6878375SBram Moolenaar for tag in tags 1989a6878375SBram Moolenaar if tag.kind == 'f' 1990a6878375SBram Moolenaar if !has_key(tag, 'namespace') 1991a6878375SBram Moolenaar let no_namespace_candidate = tag.filename 1992a6878375SBram Moolenaar else 1993a6878375SBram Moolenaar if search_namespace == tolower(tag.namespace) 1994a6878375SBram Moolenaar return tag.filename 1995a6878375SBram Moolenaar endif 1996a6878375SBram Moolenaar endif 1997a6878375SBram Moolenaar endif 1998a6878375SBram Moolenaar endfor 1999a6878375SBram Moolenaar if no_namespace_candidate != '' 2000a6878375SBram Moolenaar return no_namespace_candidate 2001a6878375SBram Moolenaar endif 2002822ff866SBram Moolenaar 2003822ff866SBram Moolenaar return '' 2004a6878375SBram Moolenaarendfunction 2005a6878375SBram Moolenaar" }}} 2006a6878375SBram Moolenaar 2007a6878375SBram Moolenaarfunction! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{ 2008a6878375SBram Moolenaar let full_file_path = fnamemodify(a:classlocation, ':p') 2009a6878375SBram Moolenaar let cache_key = full_file_path.'#'.a:class_name.'#'.getftime(full_file_path) 2010a6878375SBram Moolenaar 2011a6878375SBram Moolenaar " try to read from the cache first 2012a6878375SBram Moolenaar if has_key(s:cache_classstructures, cache_key) 2013a6878375SBram Moolenaar let classcontents = s:cache_classstructures[cache_key] 2014a6878375SBram Moolenaar " cached class contents can contain content from multiple files (superclasses) so we have to 2015a6878375SBram Moolenaar " validate cached result's validness by the filemtimes used to create the cached value 2016a6878375SBram Moolenaar let valid = 1 2017a6878375SBram Moolenaar for classstructure in classcontents 2018a6878375SBram Moolenaar if getftime(classstructure.file) != classstructure.mtime 2019a6878375SBram Moolenaar let valid = 0 2020a6878375SBram Moolenaar " we could break here, but the time required for checking probably worth 2021*6c391a74SBram Moolenaar " the the memory we can free by checking every file in the cached hierarchy 2022a6878375SBram Moolenaar call phpcomplete#ClearCachedClassContents(classstructure.file) 2023a6878375SBram Moolenaar endif 2024a6878375SBram Moolenaar endfor 2025a6878375SBram Moolenaar 2026a6878375SBram Moolenaar if valid 2027a6878375SBram Moolenaar " cache hit, we found an entry for this file + class pair and every 2028a6878375SBram Moolenaar " file in the response is also valid 2029a6878375SBram Moolenaar return classcontents 2030a6878375SBram Moolenaar else 2031a6878375SBram Moolenaar " clear the outdated cached value from the cache store 2032a6878375SBram Moolenaar call remove(s:cache_classstructures, cache_key) 2033a6878375SBram Moolenaar call phpcomplete#ClearCachedClassContents(full_file_path) 2034a6878375SBram Moolenaar 2035*6c391a74SBram Moolenaar " fall through for the read from files path 2036a6878375SBram Moolenaar endif 2037a6878375SBram Moolenaar else 2038a6878375SBram Moolenaar call phpcomplete#ClearCachedClassContents(full_file_path) 2039a6878375SBram Moolenaar endif 2040a6878375SBram Moolenaar 2041a6878375SBram Moolenaar " cache miss, fetch the content from the files itself 2042a6878375SBram Moolenaar let classfile = readfile(a:classlocation) 2043a6878375SBram Moolenaar let classcontents = phpcomplete#GetClassContentsStructure(full_file_path, classfile, a:class_name) 2044a6878375SBram Moolenaar let s:cache_classstructures[cache_key] = classcontents 2045a6878375SBram Moolenaar 2046a6878375SBram Moolenaar return classcontents 2047a6878375SBram Moolenaarendfunction " }}} 2048a6878375SBram Moolenaar 2049a6878375SBram Moolenaarfunction! phpcomplete#ClearCachedClassContents(full_file_path) " {{{ 2050a6878375SBram Moolenaar for [cache_key, cached_value] in items(s:cache_classstructures) 2051a6878375SBram Moolenaar if stridx(cache_key, a:full_file_path.'#') == 0 2052a6878375SBram Moolenaar call remove(s:cache_classstructures, cache_key) 2053a6878375SBram Moolenaar endif 2054a6878375SBram Moolenaar endfor 2055a6878375SBram Moolenaarendfunction " }}} 2056a6878375SBram Moolenaar 2057a6878375SBram Moolenaarfunction! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_name) " {{{ 2058a6878375SBram Moolenaar " returns dictionary containing content, namespace and imports for the class and all parent classes. 2059a6878375SBram Moolenaar " Example: 2060a6878375SBram Moolenaar " [ 2061a6878375SBram Moolenaar " { 2062a6878375SBram Moolenaar " class: 'foo', 2063a6878375SBram Moolenaar " content: '... class foo extends bar ... ', 2064a6878375SBram Moolenaar " namespace: 'NS\Foo', 2065a6878375SBram Moolenaar " imports : { ... }, 2066a6878375SBram Moolenaar " file: '/foo.php', 2067a6878375SBram Moolenaar " mtime: 42, 2068a6878375SBram Moolenaar " }, 2069a6878375SBram Moolenaar " { 2070a6878375SBram Moolenaar " class: 'bar', 2071a6878375SBram Moolenaar " content: '... class bar extends baz ... ', 2072a6878375SBram Moolenaar " namespace: 'NS\Bar', 2073a6878375SBram Moolenaar " imports : { ... } 2074a6878375SBram Moolenaar " file: '/bar.php', 2075a6878375SBram Moolenaar " mtime: 42, 2076a6878375SBram Moolenaar " }, 2077a6878375SBram Moolenaar " ... 2078a6878375SBram Moolenaar " ] 2079a6878375SBram Moolenaar " 2080a6878375SBram Moolenaar let class_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' 2081942db23cSBram Moolenaar let full_file_path = fnamemodify(a:file_path, ':p') 2082a6878375SBram Moolenaar let result = [] 2083942db23cSBram Moolenaar let popup_id = popup_create(a:file_lines, {'hidden': v:true}) 2084a6878375SBram Moolenaar 2085942db23cSBram Moolenaar call win_execute(popup_id, 'call search(''\c\(class\|interface\|trait\)\_s\+'.a:class_name.'\(\>\|$\)'')') 2086942db23cSBram Moolenaar call win_execute(popup_id, "let cfline = line('.')") 2087942db23cSBram Moolenaar call win_execute(popup_id, "call search('{')") 2088942db23cSBram Moolenaar call win_execute(popup_id, "let endline = line('.')") 2089a6878375SBram Moolenaar 2090942db23cSBram Moolenaar call win_execute(popup_id, 'let content = join(getline('.cfline.', '.endline.'), "\n")') 2091a6878375SBram Moolenaar " Catch extends 2092a6878375SBram Moolenaar if content =~? 'extends' 2093dd1616e6SBram Moolenaar let extends_string = matchstr(content, '\(class\|interface\)\_s\+'.a:class_name.'\_.\+extends\_s\+\zs\('.class_name_pattern.'\(,\|\_s\)*\)\+\ze\(extends\|{\)') 2094dd1616e6SBram Moolenaar let extended_classes = map(split(extends_string, '\(,\|\_s\)\+'), 'substitute(v:val, "\\_s\\+", "", "g")') 2095a6878375SBram Moolenaar else 2096dd1616e6SBram Moolenaar let extended_classes = '' 2097dd1616e6SBram Moolenaar endif 2098dd1616e6SBram Moolenaar 2099dd1616e6SBram Moolenaar " Catch implements 2100dd1616e6SBram Moolenaar if content =~? 'implements' 2101dd1616e6SBram Moolenaar let implements_string = matchstr(content, 'class\_s\+'.a:class_name.'\_.\+implements\_s\+\zs\('.class_name_pattern.'\(,\|\_s\)*\)\+\ze') 2102dd1616e6SBram Moolenaar let implemented_interfaces = map(split(implements_string, '\(,\|\_s\)\+'), 'substitute(v:val, "\\_s\\+", "", "g")') 2103dd1616e6SBram Moolenaar else 2104dd1616e6SBram Moolenaar let implemented_interfaces = [] 2105a6878375SBram Moolenaar endif 2106942db23cSBram Moolenaar 2107942db23cSBram Moolenaar call win_execute(popup_id, 'let [class_closing_bracket_line, class_closing_bracket_col] = searchpairpos("{", "", "}", "W")') 2108dc083288SBram Moolenaar 2109dc083288SBram Moolenaar " Include class docblock 2110dc083288SBram Moolenaar let doc_line = cfline - 1 2111942db23cSBram Moolenaar call win_execute(popup_id, 'let l = getline('.doc_line.')') 2112942db23cSBram Moolenaar if l =~? '^\s*\*/' 2113dc083288SBram Moolenaar while doc_line != 0 2114942db23cSBram Moolenaar call win_execute(popup_id, 'let l = getline('.doc_line.')') 2115942db23cSBram Moolenaar if l =~? '^\s*/\*\*' 2116dc083288SBram Moolenaar let cfline = doc_line 2117dc083288SBram Moolenaar break 2118dc083288SBram Moolenaar endif 2119dc083288SBram Moolenaar let doc_line -= 1 2120dc083288SBram Moolenaar endwhile 2121dc083288SBram Moolenaar endif 2122dc083288SBram Moolenaar 2123942db23cSBram Moolenaar call win_execute(popup_id, 'let classcontent = join(getline('.cfline.', '.class_closing_bracket_line.'), "\n")') 2124f3c2afb7SBram Moolenaar 2125f3c2afb7SBram Moolenaar let used_traits = [] 2126f3c2afb7SBram Moolenaar " move back to the line next to the class's definition 2127942db23cSBram Moolenaar call win_execute(popup_id, 'call cursor('.(endline + 1).', 1)') 2128f3c2afb7SBram Moolenaar let keep_searching = 1 2129f3c2afb7SBram Moolenaar while keep_searching != 0 2130f3c2afb7SBram Moolenaar " try to grab "use..." keywords 2131942db23cSBram Moolenaar call win_execute(popup_id, 'let [lnum, col] = searchpos(''\c^\s\+use\s\+'.class_name_pattern.''', "cW", '.class_closing_bracket_line.')') 2132942db23cSBram Moolenaar call win_execute(popup_id, 'let syn_name = synIDattr(synID('.lnum.', '.col.', 0), "name")') 2133f3c2afb7SBram Moolenaar if syn_name =~? 'string\|comment' 2134942db23cSBram Moolenaar call win_execute(popup_id, 'call cursor('.(lnum + 1).', 1)') 2135f3c2afb7SBram Moolenaar continue 2136f3c2afb7SBram Moolenaar endif 2137f3c2afb7SBram Moolenaar 2138942db23cSBram Moolenaar call win_execute(popup_id, 'let trait_line = getline('.lnum.')') 2139f3c2afb7SBram Moolenaar if trait_line !~? ';' 2140f3c2afb7SBram Moolenaar " try to find the next line containing ';' 2141f3c2afb7SBram Moolenaar let l = lnum 2142f3c2afb7SBram Moolenaar let search_line = trait_line 2143f3c2afb7SBram Moolenaar 2144*6c391a74SBram Moolenaar " add lines from the file until there's no ';' in them 2145f3c2afb7SBram Moolenaar while search_line !~? ';' && l > 0 2146f3c2afb7SBram Moolenaar " file lines are reversed so we need to go backwards 2147f3c2afb7SBram Moolenaar let l += 1 2148942db23cSBram Moolenaar call win_execute(popup_id, 'let search_line = getline('.l.')') 2149f3c2afb7SBram Moolenaar let trait_line .= ' '.substitute(search_line, '\(^\s\+\|\s\+$\)', '', 'g') 2150f3c2afb7SBram Moolenaar endwhile 2151f3c2afb7SBram Moolenaar endif 2152f3c2afb7SBram Moolenaar let use_expression = matchstr(trait_line, '^\s*use\s\+\zs.\{-}\ze;') 2153f3c2afb7SBram Moolenaar let use_parts = map(split(use_expression, '\s*,\s*'), 'substitute(v:val, "\\s+", " ", "g")') 2154f3c2afb7SBram Moolenaar let used_traits += map(use_parts, 'substitute(v:val, "\\s", "", "g")') 2155942db23cSBram Moolenaar call win_execute(popup_id, 'call cursor('.(lnum + 1).', 1)') 2156f3c2afb7SBram Moolenaar 2157f3c2afb7SBram Moolenaar if [lnum, col] == [0, 0] 2158f3c2afb7SBram Moolenaar let keep_searching = 0 2159f3c2afb7SBram Moolenaar endif 2160f3c2afb7SBram Moolenaar endwhile 2161f3c2afb7SBram Moolenaar 2162942db23cSBram Moolenaar call popup_close(popup_id) 2163f3c2afb7SBram Moolenaar 2164a6878375SBram Moolenaar let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(a:file_lines[0:cfline]) 2165a6878375SBram Moolenaar call add(result, { 2166a6878375SBram Moolenaar \ 'class': a:class_name, 2167a6878375SBram Moolenaar \ 'content': classcontent, 2168a6878375SBram Moolenaar \ 'namespace': current_namespace, 2169a6878375SBram Moolenaar \ 'imports': imports, 2170a6878375SBram Moolenaar \ 'file': full_file_path, 2171a6878375SBram Moolenaar \ 'mtime': getftime(full_file_path), 2172a6878375SBram Moolenaar \ }) 2173a6878375SBram Moolenaar 2174f3c2afb7SBram Moolenaar let all_extends = used_traits 2175dd1616e6SBram Moolenaar if len(extended_classes) > 0 2176dd1616e6SBram Moolenaar call extend(all_extends, extended_classes) 2177dd1616e6SBram Moolenaar endif 2178dd1616e6SBram Moolenaar if len(implemented_interfaces) > 0 2179dd1616e6SBram Moolenaar call extend(all_extends, implemented_interfaces) 2180f3c2afb7SBram Moolenaar endif 2181f3c2afb7SBram Moolenaar if len(all_extends) > 0 2182f3c2afb7SBram Moolenaar for class in all_extends 2183f3c2afb7SBram Moolenaar let [class, namespace] = phpcomplete#ExpandClassName(class, current_namespace, imports) 2184a6878375SBram Moolenaar if namespace == '' 2185a6878375SBram Moolenaar let namespace = '\' 2186a6878375SBram Moolenaar endif 2187f3c2afb7SBram Moolenaar let classlocation = phpcomplete#GetClassLocation(class, namespace) 2188fb539273SBram Moolenaar if classlocation == "VIMPHP_BUILTINOBJECT" 2189dd1616e6SBram Moolenaar if has_key(g:php_builtin_classes, tolower(class)) 2190dd1616e6SBram Moolenaar let result += [phpcomplete#GenerateBuiltinClassStub('class', g:php_builtin_classes[tolower(class)])] 2191dd1616e6SBram Moolenaar endif 2192dd1616e6SBram Moolenaar if has_key(g:php_builtin_interfaces, tolower(class)) 2193dd1616e6SBram Moolenaar let result += [phpcomplete#GenerateBuiltinClassStub('interface', g:php_builtin_interfaces[tolower(class)])] 2194dd1616e6SBram Moolenaar endif 2195fb539273SBram Moolenaar elseif classlocation != '' && filereadable(classlocation) 2196a6878375SBram Moolenaar let full_file_path = fnamemodify(classlocation, ':p') 2197f3c2afb7SBram Moolenaar let result += phpcomplete#GetClassContentsStructure(full_file_path, readfile(full_file_path), class) 219886ae720dSBram Moolenaar elseif tolower(current_namespace) == tolower(namespace) && match(join(a:file_lines, "\n"), '\c\(class\|interface\|trait\)\_s\+'.class.'\(\>\|$\)') != -1 2199a6878375SBram Moolenaar " try to find the declaration in the same file. 2200f3c2afb7SBram Moolenaar let result += phpcomplete#GetClassContentsStructure(full_file_path, a:file_lines, class) 2201a6878375SBram Moolenaar endif 2202f3c2afb7SBram Moolenaar endfor 2203a6878375SBram Moolenaar endif 2204a6878375SBram Moolenaar 2205a6878375SBram Moolenaar return result 2206a6878375SBram Moolenaarendfunction 2207a6878375SBram Moolenaar" }}} 2208a6878375SBram Moolenaar 2209a6878375SBram Moolenaarfunction! phpcomplete#GetClassContents(classlocation, class_name) " {{{ 2210a6878375SBram Moolenaar let classcontents = phpcomplete#GetCachedClassContents(a:classlocation, a:class_name) 2211a6878375SBram Moolenaar let result = [] 2212a6878375SBram Moolenaar for classstructure in classcontents 2213a6878375SBram Moolenaar call add(result, classstructure.content) 2214a6878375SBram Moolenaar endfor 2215a6878375SBram Moolenaar return join(result, "\n") 2216a6878375SBram Moolenaarendfunction 2217a6878375SBram Moolenaar" }}} 2218a6878375SBram Moolenaar 2219dd1616e6SBram Moolenaarfunction! phpcomplete#GenerateBuiltinClassStub(type, class_info) " {{{ 2220dd1616e6SBram Moolenaar let re = a:type.' '.a:class_info['name']." {" 2221dd1616e6SBram Moolenaar if has_key(a:class_info, 'constants') 2222fb539273SBram Moolenaar for [name, initializer] in items(a:class_info.constants) 2223fb539273SBram Moolenaar let re .= "\n\tconst ".name." = ".initializer.";" 2224fb539273SBram Moolenaar endfor 2225dd1616e6SBram Moolenaar endif 2226dd1616e6SBram Moolenaar if has_key(a:class_info, 'properties') 2227fb539273SBram Moolenaar for [name, info] in items(a:class_info.properties) 2228fb539273SBram Moolenaar let re .= "\n\t// @var $".name." ".info.type 2229fb539273SBram Moolenaar let re .= "\n\tpublic $".name.";" 2230fb539273SBram Moolenaar endfor 2231dd1616e6SBram Moolenaar endif 2232dd1616e6SBram Moolenaar if has_key(a:class_info, 'static_properties') 2233fb539273SBram Moolenaar for [name, info] in items(a:class_info.static_properties) 2234fb539273SBram Moolenaar let re .= "\n\t// @var ".name." ".info.type 2235fb539273SBram Moolenaar let re .= "\n\tpublic static ".name." = ".info.initializer.";" 2236fb539273SBram Moolenaar endfor 2237dd1616e6SBram Moolenaar endif 2238dd1616e6SBram Moolenaar if has_key(a:class_info, 'methods') 2239fb539273SBram Moolenaar for [name, info] in items(a:class_info.methods) 2240fb539273SBram Moolenaar if name =~ '^__' 2241fb539273SBram Moolenaar continue 2242fb539273SBram Moolenaar endif 2243fb539273SBram Moolenaar let re .= "\n\t/**" 2244fb539273SBram Moolenaar let re .= "\n\t * ".name 2245fb539273SBram Moolenaar let re .= "\n\t *" 2246fb539273SBram Moolenaar let re .= "\n\t * @return ".info.return_type 2247fb539273SBram Moolenaar let re .= "\n\t */" 2248fb539273SBram Moolenaar let re .= "\n\tpublic function ".name."(".info.signature."){" 2249fb539273SBram Moolenaar let re .= "\n\t}" 2250fb539273SBram Moolenaar endfor 2251dd1616e6SBram Moolenaar endif 2252dd1616e6SBram Moolenaar if has_key(a:class_info, 'static_methods') 2253fb539273SBram Moolenaar for [name, info] in items(a:class_info.static_methods) 2254fb539273SBram Moolenaar let re .= "\n\t/**" 2255fb539273SBram Moolenaar let re .= "\n\t * ".name 2256fb539273SBram Moolenaar let re .= "\n\t *" 2257fb539273SBram Moolenaar let re .= "\n\t * @return ".info.return_type 2258fb539273SBram Moolenaar let re .= "\n\t */" 2259fb539273SBram Moolenaar let re .= "\n\tpublic static function ".name."(".info.signature."){" 2260fb539273SBram Moolenaar let re .= "\n\t}" 2261fb539273SBram Moolenaar endfor 2262dd1616e6SBram Moolenaar endif 2263fb539273SBram Moolenaar let re .= "\n}" 2264fb539273SBram Moolenaar 2265dd1616e6SBram Moolenaar return { a:type : a:class_info['name'], 2266fb539273SBram Moolenaar \ 'content': re, 2267fb539273SBram Moolenaar \ 'namespace': '', 2268fb539273SBram Moolenaar \ 'imports': {}, 2269fb539273SBram Moolenaar \ 'file': 'VIMPHP_BUILTINOBJECT', 2270fb539273SBram Moolenaar \ 'mtime': 0, 2271fb539273SBram Moolenaar \ } 2272fb539273SBram Moolenaarendfunction " }}} 2273fb539273SBram Moolenaar 2274a6878375SBram Moolenaarfunction! phpcomplete#GetDocBlock(sccontent, search) " {{{ 2275a6878375SBram Moolenaar let i = 0 2276a6878375SBram Moolenaar let l = 0 2277a6878375SBram Moolenaar let comment_start = -1 2278a6878375SBram Moolenaar let comment_end = -1 2279a6878375SBram Moolenaar let sccontent_len = len(a:sccontent) 2280a6878375SBram Moolenaar 2281a6878375SBram Moolenaar while (i < sccontent_len) 2282a6878375SBram Moolenaar let line = a:sccontent[i] 2283a6878375SBram Moolenaar " search for a function declaration 2284a6878375SBram Moolenaar if line =~? a:search 2285dc083288SBram Moolenaar if line =~? '@property' 2286dc083288SBram Moolenaar let doc_line = i 2287dc083288SBram Moolenaar while doc_line != sccontent_len - 1 2288dc083288SBram Moolenaar if a:sccontent[doc_line] =~? '^\s*\*/' 2289dc083288SBram Moolenaar let l = doc_line 2290dc083288SBram Moolenaar break 2291dc083288SBram Moolenaar endif 2292dc083288SBram Moolenaar let doc_line += 1 2293dc083288SBram Moolenaar endwhile 2294dc083288SBram Moolenaar else 2295a6878375SBram Moolenaar let l = i - 1 2296dc083288SBram Moolenaar endif 2297dc083288SBram Moolenaar " start backward search for the comment block 2298a6878375SBram Moolenaar while l != 0 2299a6878375SBram Moolenaar let line = a:sccontent[l] 2300dd1616e6SBram Moolenaar " if it's a one line docblock like comment and we can just return it right away 2301dd1616e6SBram Moolenaar if line =~? '^\s*\/\*\*.\+\*\/\s*$' 2302dd1616e6SBram Moolenaar return substitute(line, '\v^\s*(\/\*\*\s*)|(\s*\*\/)\s*$', '', 'g') 2303dd1616e6SBram Moolenaar "... or if comment end found save line position and end search 2304dd1616e6SBram Moolenaar elseif line =~? '^\s*\*/' 2305a6878375SBram Moolenaar let comment_end = l 2306a6878375SBram Moolenaar break 2307a6878375SBram Moolenaar " ... or the line doesn't blank (only whitespace or nothing) end search 2308a6878375SBram Moolenaar elseif line !~? '^\s*$' 2309a6878375SBram Moolenaar break 2310a6878375SBram Moolenaar endif 2311a6878375SBram Moolenaar let l -= 1 2312a6878375SBram Moolenaar endwhile 2313a6878375SBram Moolenaar " no comment found 2314a6878375SBram Moolenaar if comment_end == -1 2315a6878375SBram Moolenaar return '' 2316a6878375SBram Moolenaar end 2317a6878375SBram Moolenaar 2318dc083288SBram Moolenaar while l >= 0 2319a6878375SBram Moolenaar let line = a:sccontent[l] 2320a6878375SBram Moolenaar if line =~? '^\s*/\*\*' 2321a6878375SBram Moolenaar let comment_start = l 2322a6878375SBram Moolenaar break 2323a6878375SBram Moolenaar endif 2324a6878375SBram Moolenaar let l -= 1 2325a6878375SBram Moolenaar endwhile 2326dd1616e6SBram Moolenaar 2327a6878375SBram Moolenaar " no docblock comment start found 2328a6878375SBram Moolenaar if comment_start == -1 2329a6878375SBram Moolenaar return '' 2330a6878375SBram Moolenaar end 2331a6878375SBram Moolenaar 2332a6878375SBram Moolenaar let comment_start += 1 " we dont need the /** 2333a6878375SBram Moolenaar let comment_end -= 1 " we dont need the */ 2334a6878375SBram Moolenaar 2335a6878375SBram Moolenaar " remove leading whitespace and '*'s 2336a6878375SBram Moolenaar let docblock = join(map(copy(a:sccontent[comment_start :comment_end]), 'substitute(v:val, "^\\s*\\*\\s*", "", "")'), "\n") 2337a6878375SBram Moolenaar return docblock 2338a6878375SBram Moolenaar endif 2339a6878375SBram Moolenaar let i += 1 2340a6878375SBram Moolenaar endwhile 2341a6878375SBram Moolenaar return '' 2342a6878375SBram Moolenaarendfunction 2343a6878375SBram Moolenaar" }}} 2344a6878375SBram Moolenaar 2345a6878375SBram Moolenaarfunction! phpcomplete#ParseDocBlock(docblock) " {{{ 2346a6878375SBram Moolenaar let res = { 2347a6878375SBram Moolenaar \ 'description': '', 2348a6878375SBram Moolenaar \ 'params': [], 2349a6878375SBram Moolenaar \ 'return': {}, 2350a6878375SBram Moolenaar \ 'throws': [], 2351a6878375SBram Moolenaar \ 'var': {}, 2352dc083288SBram Moolenaar \ 'properties': [], 2353a6878375SBram Moolenaar \ } 2354a6878375SBram Moolenaar 2355dc083288SBram Moolenaar let res.description = substitute(matchstr(a:docblock, '\zs\_.\{-}\ze\(@type\|@var\|@param\|@return\|$\)'), '\(^\_s*\|\_s*$\)', '', 'g') 2356a6878375SBram Moolenaar let docblock_lines = split(a:docblock, "\n") 2357a6878375SBram Moolenaar 2358a6878375SBram Moolenaar let param_lines = filter(copy(docblock_lines), 'v:val =~? "^@param"') 2359a6878375SBram Moolenaar for param_line in param_lines 2360a6878375SBram Moolenaar let parts = matchlist(param_line, '@param\s\+\(\S\+\)\s\+\(\S\+\)\s*\(.*\)') 2361a6878375SBram Moolenaar if len(parts) > 0 2362a6878375SBram Moolenaar call add(res.params, { 2363a6878375SBram Moolenaar \ 'line': parts[0], 2364a6878375SBram Moolenaar \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 1, '')), 2365a6878375SBram Moolenaar \ 'name': get(parts, 2, ''), 2366a6878375SBram Moolenaar \ 'description': get(parts, 3, '')}) 2367a6878375SBram Moolenaar endif 2368a6878375SBram Moolenaar endfor 2369a6878375SBram Moolenaar 2370a6878375SBram Moolenaar let return_line = filter(copy(docblock_lines), 'v:val =~? "^@return"') 2371a6878375SBram Moolenaar if len(return_line) > 0 2372a6878375SBram Moolenaar let return_parts = matchlist(return_line[0], '@return\s\+\(\S\+\)\s*\(.*\)') 2373a6878375SBram Moolenaar let res['return'] = { 2374a6878375SBram Moolenaar \ 'line': return_parts[0], 2375a6878375SBram Moolenaar \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(return_parts, 1, '')), 2376a6878375SBram Moolenaar \ 'description': get(return_parts, 2, '')} 2377a6878375SBram Moolenaar endif 2378a6878375SBram Moolenaar 2379a6878375SBram Moolenaar let exception_lines = filter(copy(docblock_lines), 'v:val =~? "^\\(@throws\\|@exception\\)"') 2380a6878375SBram Moolenaar for exception_line in exception_lines 2381a6878375SBram Moolenaar let parts = matchlist(exception_line, '^\(@throws\|@exception\)\s\+\(\S\+\)\s*\(.*\)') 2382a6878375SBram Moolenaar if len(parts) > 0 2383a6878375SBram Moolenaar call add(res.throws, { 2384a6878375SBram Moolenaar \ 'line': parts[0], 2385a6878375SBram Moolenaar \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 2, '')), 2386a6878375SBram Moolenaar \ 'description': get(parts, 3, '')}) 2387a6878375SBram Moolenaar endif 2388a6878375SBram Moolenaar endfor 2389a6878375SBram Moolenaar 2390dc083288SBram Moolenaar let var_line = filter(copy(docblock_lines), 'v:val =~? "^\\(@var\\|@type\\)"') 2391a6878375SBram Moolenaar if len(var_line) > 0 2392dc083288SBram Moolenaar let var_parts = matchlist(var_line[0], '\(@var\|@type\)\s\+\(\S\+\)\s*\(.*\)') 2393a6878375SBram Moolenaar let res['var'] = { 2394a6878375SBram Moolenaar \ 'line': var_parts[0], 2395dc083288SBram Moolenaar \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(var_parts, 2, '')), 2396dc083288SBram Moolenaar \ 'description': get(var_parts, 3, '')} 2397a6878375SBram Moolenaar endif 2398a6878375SBram Moolenaar 2399dc083288SBram Moolenaar let property_lines = filter(copy(docblock_lines), 'v:val =~? "^@property"') 2400dc083288SBram Moolenaar for property_line in property_lines 2401dc083288SBram Moolenaar let parts = matchlist(property_line, '\(@property\)\s\+\(\S\+\)\s*\(.*\)') 2402dc083288SBram Moolenaar if len(parts) > 0 2403dc083288SBram Moolenaar call add(res.properties, { 2404dc083288SBram Moolenaar \ 'line': parts[0], 2405dc083288SBram Moolenaar \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 2, '')), 2406dc083288SBram Moolenaar \ 'description': get(parts, 3, '')}) 2407dc083288SBram Moolenaar endif 2408dc083288SBram Moolenaar endfor 2409dc083288SBram Moolenaar 2410a6878375SBram Moolenaar return res 2411a6878375SBram Moolenaarendfunction 2412a6878375SBram Moolenaar" }}} 2413a6878375SBram Moolenaar 24142c64ca18SBram Moolenaarfunction! phpcomplete#GetFunctionReturnTypeHint(sccontent, search) 24152c64ca18SBram Moolenaar let i = 0 24162c64ca18SBram Moolenaar let l = 0 24172c64ca18SBram Moolenaar let function_line_start = -1 24182c64ca18SBram Moolenaar let function_line_end = -1 24192c64ca18SBram Moolenaar let sccontent_len = len(a:sccontent) 24202c64ca18SBram Moolenaar let return_type = '' 24212c64ca18SBram Moolenaar 24222c64ca18SBram Moolenaar while (i < sccontent_len) 24232c64ca18SBram Moolenaar let line = a:sccontent[i] 24242c64ca18SBram Moolenaar " search for a function declaration 24252c64ca18SBram Moolenaar if line =~? a:search 24262c64ca18SBram Moolenaar let l = i 24272c64ca18SBram Moolenaar let function_line_start = i 24282c64ca18SBram Moolenaar " now search for the first { where the function body starts 24292c64ca18SBram Moolenaar while l < sccontent_len 24302c64ca18SBram Moolenaar let line = a:sccontent[l] 24312c64ca18SBram Moolenaar if line =~? '\V{' 24322c64ca18SBram Moolenaar let function_line_end = l 24332c64ca18SBram Moolenaar break 24342c64ca18SBram Moolenaar endif 24352c64ca18SBram Moolenaar let l += 1 24362c64ca18SBram Moolenaar endwhile 24372c64ca18SBram Moolenaar break 24382c64ca18SBram Moolenaar endif 24392c64ca18SBram Moolenaar let i += 1 24402c64ca18SBram Moolenaar endwhile 24412c64ca18SBram Moolenaar 24422c64ca18SBram Moolenaar " now grab the lines that holds the function declaration line 24432c64ca18SBram Moolenaar if function_line_start != -1 && function_line_end != -1 24442c64ca18SBram Moolenaar let function_line = join(a:sccontent[function_line_start :function_line_end], " ") 24452c64ca18SBram Moolenaar let class_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' 24462c64ca18SBram Moolenaar let return_type = matchstr(function_line, '\c\s*:\s*\zs'.class_name_pattern.'\ze\s*{') 24472c64ca18SBram Moolenaar endif 24482c64ca18SBram Moolenaar return return_type 24492c64ca18SBram Moolenaar 24502c64ca18SBram Moolenaarendfunction 24512c64ca18SBram Moolenaar 2452a6878375SBram Moolenaarfunction! phpcomplete#GetTypeFromDocBlockParam(docblock_type) " {{{ 2453a6878375SBram Moolenaar if a:docblock_type !~ '|' 2454a6878375SBram Moolenaar return a:docblock_type 2455a6878375SBram Moolenaar endif 2456a6878375SBram Moolenaar 2457a6878375SBram Moolenaar let primitive_types = [ 2458a6878375SBram Moolenaar \ 'string', 'float', 'double', 'int', 2459a6878375SBram Moolenaar \ 'scalar', 'array', 'bool', 'void', 'mixed', 2460a6878375SBram Moolenaar \ 'null', 'callable', 'resource', 'object'] 2461a6878375SBram Moolenaar 2462a6878375SBram Moolenaar " add array of primitives to the list too, like string[] 2463a6878375SBram Moolenaar let primitive_types += map(copy(primitive_types), 'v:val."[]"') 2464a6878375SBram Moolenaar let types = split(a:docblock_type, '|') 2465a6878375SBram Moolenaar for type in types 2466a6878375SBram Moolenaar if index(primitive_types, type) == -1 2467a6878375SBram Moolenaar return type 2468a6878375SBram Moolenaar endif 2469a6878375SBram Moolenaar endfor 2470a6878375SBram Moolenaar 2471a6878375SBram Moolenaar " only primitive types found, return the first one 2472a6878375SBram Moolenaar return types[0] 2473a6878375SBram Moolenaar 2474a6878375SBram Moolenaarendfunction 2475a6878375SBram Moolenaar" }}} 2476a6878375SBram Moolenaar 2477a6878375SBram Moolenaarfunction! phpcomplete#FormatDocBlock(info) " {{{ 2478a6878375SBram Moolenaar let res = '' 2479a6878375SBram Moolenaar if len(a:info.description) 2480a6878375SBram Moolenaar let res .= "Description:\n".join(map(split(a:info['description'], "\n"), '"\t".v:val'), "\n")."\n" 2481a6878375SBram Moolenaar endif 2482a6878375SBram Moolenaar 2483a6878375SBram Moolenaar if len(a:info.params) 2484a6878375SBram Moolenaar let res .= "\nArguments:\n" 2485a6878375SBram Moolenaar for arginfo in a:info.params 2486a6878375SBram Moolenaar let res .= "\t".arginfo['name'].' '.arginfo['type'] 2487a6878375SBram Moolenaar if len(arginfo.description) > 0 2488a6878375SBram Moolenaar let res .= ': '.arginfo['description'] 2489a6878375SBram Moolenaar endif 2490a6878375SBram Moolenaar let res .= "\n" 2491a6878375SBram Moolenaar endfor 2492a6878375SBram Moolenaar endif 2493a6878375SBram Moolenaar 2494a6878375SBram Moolenaar if has_key(a:info.return, 'type') 2495a6878375SBram Moolenaar let res .= "\nReturn:\n\t".a:info['return']['type'] 2496a6878375SBram Moolenaar if len(a:info.return.description) > 0 2497a6878375SBram Moolenaar let res .= ": ".a:info['return']['description'] 2498a6878375SBram Moolenaar endif 2499a6878375SBram Moolenaar let res .= "\n" 2500a6878375SBram Moolenaar endif 2501a6878375SBram Moolenaar 2502a6878375SBram Moolenaar if len(a:info.throws) 2503a6878375SBram Moolenaar let res .= "\nThrows:\n" 2504a6878375SBram Moolenaar for excinfo in a:info.throws 2505a6878375SBram Moolenaar let res .= "\t".excinfo['type'] 2506a6878375SBram Moolenaar if len(excinfo['description']) > 0 2507a6878375SBram Moolenaar let res .= ": ".excinfo['description'] 2508a6878375SBram Moolenaar endif 2509a6878375SBram Moolenaar let res .= "\n" 2510a6878375SBram Moolenaar endfor 2511a6878375SBram Moolenaar endif 2512a6878375SBram Moolenaar 2513a6878375SBram Moolenaar if has_key(a:info.var, 'type') 2514a6878375SBram Moolenaar let res .= "Type:\n\t".a:info['var']['type']."\n" 2515a6878375SBram Moolenaar if len(a:info['var']['description']) > 0 2516a6878375SBram Moolenaar let res .= ': '.a:info['var']['description'] 2517a6878375SBram Moolenaar endif 2518a6878375SBram Moolenaar endif 2519a6878375SBram Moolenaar 2520a6878375SBram Moolenaar return res 2521942db23cSBram Moolenaarendfunction 2522a6878375SBram Moolenaar" }}} 2523a6878375SBram Moolenaar 2524a6878375SBram Moolenaarfunction! phpcomplete#GetCurrentNameSpace(file_lines) " {{{ 2525942db23cSBram Moolenaar let popup_id = popup_create(a:file_lines, {'hidden': v:true}) 2526942db23cSBram Moolenaar call win_execute(popup_id, 'normal! G') 2527f3c2afb7SBram Moolenaar 2528f3c2afb7SBram Moolenaar " clear out classes, functions and other blocks 2529f3c2afb7SBram Moolenaar while 1 2530942db23cSBram Moolenaar call win_execute(popup_id, 'let block_start_pos = searchpos(''\c\(class\|trait\|function\|interface\)\s\+\_.\{-}\zs{'', "Web")') 2531f3c2afb7SBram Moolenaar if block_start_pos == [0, 0] 2532f3c2afb7SBram Moolenaar break 2533f3c2afb7SBram Moolenaar endif 2534942db23cSBram Moolenaar call win_execute(popup_id, 'let block_end_pos = searchpairpos("{", "", ''}\|\%$'', "W", ''synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'')') 2535dd1616e6SBram Moolenaar 2536942db23cSBram Moolenaar let popup_lines = winbufnr(popup_id)->getbufline(1, '$') 2537dd1616e6SBram Moolenaar if block_end_pos != [0, 0] 2538dd1616e6SBram Moolenaar " end of the block found, just delete it 2539942db23cSBram Moolenaar call remove(popup_lines, block_start_pos[0] - 1, block_end_pos[0] - 1) 2540dd1616e6SBram Moolenaar else 2541dd1616e6SBram Moolenaar " block pair not found, use block start as beginning and the end 2542dd1616e6SBram Moolenaar " of the buffer instead 2543942db23cSBram Moolenaar call remove(popup_lines, block_start_pos[0] - 1, -1) 2544dd1616e6SBram Moolenaar endif 2545942db23cSBram Moolenaar call popup_settext(popup_id, popup_lines) 2546f3c2afb7SBram Moolenaar endwhile 2547942db23cSBram Moolenaar call win_execute(popup_id, 'normal! G', 'silent!') 2548f3c2afb7SBram Moolenaar 2549f3c2afb7SBram Moolenaar " grab the remains 2550942db23cSBram Moolenaar call win_execute(popup_id, "let file_lines = reverse(getline(1, line('.')-1))") 2551942db23cSBram Moolenaar call popup_close(popup_id) 2552f3c2afb7SBram Moolenaar 2553a6878375SBram Moolenaar let namespace_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*' 2554a6878375SBram Moolenaar let i = 0 2555a6878375SBram Moolenaar let file_length = len(file_lines) 2556a6878375SBram Moolenaar let imports = {} 2557a6878375SBram Moolenaar let current_namespace = '\' 2558a6878375SBram Moolenaar 2559a6878375SBram Moolenaar while i < file_length 2560a6878375SBram Moolenaar let line = file_lines[i] 2561a6878375SBram Moolenaar 256286ae720dSBram Moolenaar if line =~? '^\(<?php\)\?\s*namespace\s*'.namespace_name_pattern 256386ae720dSBram Moolenaar let current_namespace = matchstr(line, '\c^\(<?php\)\?\s*namespace\s*\zs'.namespace_name_pattern.'\ze') 2564a6878375SBram Moolenaar break 2565a6878375SBram Moolenaar endif 2566a6878375SBram Moolenaar 2567a6878375SBram Moolenaar if line =~? '^\s*use\>' 2568a6878375SBram Moolenaar if line =~? ';' 2569a6878375SBram Moolenaar let use_line = line 2570a6878375SBram Moolenaar else 2571a6878375SBram Moolenaar " try to find the next line containing ';' 2572a6878375SBram Moolenaar let l = i 2573a6878375SBram Moolenaar let search_line = line 2574a6878375SBram Moolenaar let use_line = line 2575a6878375SBram Moolenaar 2576*6c391a74SBram Moolenaar " add lines from the file until there's no ';' in them 2577a6878375SBram Moolenaar while search_line !~? ';' && l > 0 2578a6878375SBram Moolenaar " file lines are reversed so we need to go backwards 2579a6878375SBram Moolenaar let l -= 1 2580a6878375SBram Moolenaar let search_line = file_lines[l] 2581a6878375SBram Moolenaar let use_line .= ' '.substitute(search_line, '\(^\s\+\|\s\+$\)', '', 'g') 2582a6878375SBram Moolenaar endwhile 2583a6878375SBram Moolenaar endif 2584f3c2afb7SBram Moolenaar let use_expression = matchstr(use_line, '^\c\s*use\s\+\zs.\{-}\ze;') 2585a6878375SBram Moolenaar let use_parts = map(split(use_expression, '\s*,\s*'), 'substitute(v:val, "\\s+", " ", "g")') 2586a6878375SBram Moolenaar for part in use_parts 2587a6878375SBram Moolenaar if part =~? '\s\+as\s\+' 2588f3c2afb7SBram Moolenaar let [object, name] = split(part, '\s\+as\s\+\c') 2589a6878375SBram Moolenaar let object = substitute(object, '^\\', '', '') 2590a6878375SBram Moolenaar let name = substitute(name, '^\\', '', '') 2591a6878375SBram Moolenaar else 2592a6878375SBram Moolenaar let object = part 2593a6878375SBram Moolenaar let name = part 2594a6878375SBram Moolenaar let object = substitute(object, '^\\', '', '') 2595a6878375SBram Moolenaar let name = substitute(name, '^\\', '', '') 2596a6878375SBram Moolenaar if name =~? '\\' 2597a6878375SBram Moolenaar let name = matchstr(name, '\\\zs[^\\]\+\ze$') 2598a6878375SBram Moolenaar endif 2599a6878375SBram Moolenaar endif 2600dc083288SBram Moolenaar 2601a6878375SBram Moolenaar " leading slash is not required use imports are always absolute 2602a6878375SBram Moolenaar let imports[name] = {'name': object, 'kind': ''} 2603a6878375SBram Moolenaar endfor 2604a6878375SBram Moolenaar 2605a6878375SBram Moolenaar " find kind flags from tags or built in methods for the objects we extracted 2606a6878375SBram Moolenaar " they can be either classes, interfaces or namespaces, no other thing is importable in php 2607a6878375SBram Moolenaar for [key, import] in items(imports) 2608*6c391a74SBram Moolenaar " if there's a \ in the name we have it's definitely not a built in thing, look for tags 2609a6878375SBram Moolenaar if import.name =~ '\\' 2610a6878375SBram Moolenaar let patched_ctags_detected = 0 2611a6878375SBram Moolenaar let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {}) 2612a6878375SBram Moolenaar let namespace_name_candidate = substitute(import.name, '\\', '\\\\', 'g') 2613a6878375SBram Moolenaar " can be a namespace name as is, or can be a tagname at the end with a namespace 2614a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^\('.namespace_name_candidate.'\|'.classname.'\)$') 2615a6878375SBram Moolenaar if len(tags) > 0 2616a6878375SBram Moolenaar for tag in tags 2617a6878375SBram Moolenaar " if there's a namespace with the name of the import 2618a6878375SBram Moolenaar if tag.kind == 'n' && tag.name == import.name 2619a6878375SBram Moolenaar call extend(import, tag) 2620a6878375SBram Moolenaar let import['builtin'] = 0 2621a6878375SBram Moolenaar let patched_ctags_detected = 1 2622a6878375SBram Moolenaar break 2623a6878375SBram Moolenaar endif 2624a6878375SBram Moolenaar " if the name matches with the extracted classname and namespace 2625f3c2afb7SBram Moolenaar if (tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't') && tag.name == classname 2626a6878375SBram Moolenaar if has_key(tag, 'namespace') 2627a6878375SBram Moolenaar let patched_ctags_detected = 1 2628a6878375SBram Moolenaar if tag.namespace == namespace_for_classes 2629a6878375SBram Moolenaar call extend(import, tag) 2630a6878375SBram Moolenaar let import['builtin'] = 0 2631a6878375SBram Moolenaar break 2632a6878375SBram Moolenaar endif 2633a6878375SBram Moolenaar elseif !exists('no_namespace_candidate') 2634a6878375SBram Moolenaar " save the first namespacless match to be used if no better 2635a6878375SBram Moolenaar " candidate found later on 2636dc083288SBram Moolenaar let tag.namespace = namespace_for_classes 2637a6878375SBram Moolenaar let no_namespace_candidate = tag 2638a6878375SBram Moolenaar endif 2639a6878375SBram Moolenaar endif 2640a6878375SBram Moolenaar endfor 2641a6878375SBram Moolenaar " there were a namespacless class name match, if we think that the 2642a6878375SBram Moolenaar " tags are not generated with patched ctags we will take it as a match 2643a6878375SBram Moolenaar if exists('no_namespace_candidate') && !patched_ctags_detected 2644a6878375SBram Moolenaar call extend(import, no_namespace_candidate) 2645a6878375SBram Moolenaar let import['builtin'] = 0 2646a6878375SBram Moolenaar endif 2647a6878375SBram Moolenaar else 2648a6878375SBram Moolenaar " if no tags are found, extract the namespace from the name 2649a6878375SBram Moolenaar let ns = matchstr(import.name, '\c\zs[a-zA-Z0-9\\]\+\ze\\' . name) 2650a6878375SBram Moolenaar if len(ns) > 0 2651a6878375SBram Moolenaar let import['name'] = name 2652a6878375SBram Moolenaar let import['namespace'] = ns 2653a6878375SBram Moolenaar let import['builtin'] = 0 2654a6878375SBram Moolenaar endif 2655a6878375SBram Moolenaar endif 2656a6878375SBram Moolenaar else 2657a6878375SBram Moolenaar " if no \ in the name, it can be a built in class 2658a6878375SBram Moolenaar if has_key(g:php_builtin_classnames, tolower(import.name)) 2659a6878375SBram Moolenaar let import['kind'] = 'c' 2660a6878375SBram Moolenaar let import['builtin'] = 1 2661822ff866SBram Moolenaar elseif has_key(g:php_builtin_interfacenames, tolower(import.name)) 2662a6878375SBram Moolenaar let import['kind'] = 'i' 2663a6878375SBram Moolenaar let import['builtin'] = 1 2664a6878375SBram Moolenaar else 2665*6c391a74SBram Moolenaar " or can be a tag with exactly matching name 2666a6878375SBram Moolenaar let tags = phpcomplete#GetTaglist('^'.import['name'].'$') 2667a6878375SBram Moolenaar for tag in tags 2668*6c391a74SBram Moolenaar " search for the first matching namespace, class, interface with no namespace 2669f3c2afb7SBram Moolenaar if !has_key(tag, 'namespace') && (tag.kind == 'n' || tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't') 2670a6878375SBram Moolenaar call extend(import, tag) 2671a6878375SBram Moolenaar let import['builtin'] = 0 2672a6878375SBram Moolenaar break 2673a6878375SBram Moolenaar endif 2674a6878375SBram Moolenaar endfor 2675a6878375SBram Moolenaar endif 2676a6878375SBram Moolenaar endif 26773a991dd0SBram Moolenaar if exists('no_namespace_candidate') 26783a991dd0SBram Moolenaar unlet no_namespace_candidate 26793a991dd0SBram Moolenaar endif 2680a6878375SBram Moolenaar endfor 2681a6878375SBram Moolenaar endif 2682a6878375SBram Moolenaar let i += 1 2683a6878375SBram Moolenaar endwhile 2684a6878375SBram Moolenaar let sorted_imports = {} 2685a6878375SBram Moolenaar for name in sort(keys(imports)) 2686a6878375SBram Moolenaar let sorted_imports[name] = imports[name] 2687a6878375SBram Moolenaar endfor 2688a6878375SBram Moolenaar return [current_namespace, sorted_imports] 2689a6878375SBram Moolenaarendfunction 2690a6878375SBram Moolenaar" }}} 2691a6878375SBram Moolenaar 2692fb539273SBram Moolenaarfunction! phpcomplete#GetCurrentFunctionBoundaries() " {{{ 2693fb539273SBram Moolenaar let old_cursor_pos = [line('.'), col('.')] 2694fb539273SBram Moolenaar let current_line_no = old_cursor_pos[0] 2695fb539273SBram Moolenaar let function_pattern = '\c\(.*\%#\)\@!\_^\s*\zs\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\_.\{-}(\_.\{-})\_.\{-}{' 2696fb539273SBram Moolenaar 2697fb539273SBram Moolenaar let func_start_pos = searchpos(function_pattern, 'Wbc') 2698fb539273SBram Moolenaar if func_start_pos == [0, 0] 2699fb539273SBram Moolenaar call cursor(old_cursor_pos[0], old_cursor_pos[1]) 2700fb539273SBram Moolenaar return 0 2701fb539273SBram Moolenaar endif 2702fb539273SBram Moolenaar 2703fb539273SBram Moolenaar " get the line where the function declaration actually started 2704fb539273SBram Moolenaar call search('\cfunction\_.\{-}(\_.\{-})\_.\{-}{', 'Wce') 2705fb539273SBram Moolenaar 2706fb539273SBram Moolenaar " get the position of the function block's closing "}" 2707fb539273SBram Moolenaar let func_end_pos = searchpairpos('{', '', '}', 'W') 2708fb539273SBram Moolenaar if func_end_pos == [0, 0] 2709fb539273SBram Moolenaar " there is a function start but no end found, assume that we are in a 2710fb539273SBram Moolenaar " function but the user did not typed the closing "}" yet and the 2711fb539273SBram Moolenaar " function runs to the end of the file 2712fb539273SBram Moolenaar let func_end_pos = [line('$'), len(getline(line('$')))] 2713fb539273SBram Moolenaar endif 2714fb539273SBram Moolenaar 2715fb539273SBram Moolenaar " Decho func_start_pos[0].' <= '.current_line_no.' && '.current_line_no.' <= '.func_end_pos[0] 2716fb539273SBram Moolenaar if func_start_pos[0] <= current_line_no && current_line_no <= func_end_pos[0] 2717fb539273SBram Moolenaar call cursor(old_cursor_pos[0], old_cursor_pos[1]) 2718fb539273SBram Moolenaar return [func_start_pos, func_end_pos] 2719fb539273SBram Moolenaar endif 2720fb539273SBram Moolenaar 2721fb539273SBram Moolenaar call cursor(old_cursor_pos[0], old_cursor_pos[1]) 2722fb539273SBram Moolenaar return 0 2723fb539273SBram Moolenaarendfunction 2724fb539273SBram Moolenaar" }}} 2725fb539273SBram Moolenaar 2726a6878375SBram Moolenaarfunction! phpcomplete#ExpandClassName(classname, current_namespace, imports) " {{{ 2727a6878375SBram Moolenaar " if there's an imported class, just use that class's information 272886ae720dSBram Moolenaar if has_key(a:imports, a:classname) && (a:imports[a:classname].kind == 'c' || a:imports[a:classname].kind == 'i' || a:imports[a:classname].kind == 't') 2729a6878375SBram Moolenaar let namespace = has_key(a:imports[a:classname], 'namespace') ? a:imports[a:classname].namespace : '' 2730a6878375SBram Moolenaar return [a:imports[a:classname].name, namespace] 2731a6878375SBram Moolenaar endif 2732a6878375SBram Moolenaar 2733a6878375SBram Moolenaar " try to find relative namespace in imports, imported names takes precedence over 2734a6878375SBram Moolenaar " current namespace when resolving relative namespaced class names 2735a6878375SBram Moolenaar if a:classname !~ '^\' && a:classname =~ '\\' 2736a6878375SBram Moolenaar let classname_parts = split(a:classname, '\\\+') 2737a6878375SBram Moolenaar if has_key(a:imports, classname_parts[0]) && a:imports[classname_parts[0]].kind == 'n' 2738a6878375SBram Moolenaar let classname_parts[0] = a:imports[classname_parts[0]].name 2739a6878375SBram Moolenaar let namespace = join(classname_parts[0:-2], '\') 2740a6878375SBram Moolenaar let classname = classname_parts[-1] 2741a6878375SBram Moolenaar return [classname, namespace] 2742a6878375SBram Moolenaar endif 2743a6878375SBram Moolenaar endif 2744a6878375SBram Moolenaar 2745a6878375SBram Moolenaar " no imported class or namespace matched, expand with the current namespace 2746a6878375SBram Moolenaar let namespace = '' 2747a6878375SBram Moolenaar let classname = a:classname 2748a6878375SBram Moolenaar " if the classname have namespaces in in or we are in a namespace 2749a6878375SBram Moolenaar if a:classname =~ '\\' || (a:current_namespace != '\' && a:current_namespace != '') 2750a6878375SBram Moolenaar " add current namespace to the a:classname 2751a6878375SBram Moolenaar if a:classname !~ '^\' 2752a6878375SBram Moolenaar let classname = a:current_namespace.'\'.substitute(a:classname, '^\\', '', '') 2753a6878375SBram Moolenaar else 2754a6878375SBram Moolenaar " remove leading \, tag files doesn't have those 2755a6878375SBram Moolenaar let classname = substitute(a:classname, '^\\', '', '') 2756a6878375SBram Moolenaar endif 2757a6878375SBram Moolenaar " split classname to classname and namespace 2758a6878375SBram Moolenaar let classname_parts = split(classname, '\\\+') 2759a6878375SBram Moolenaar if len(classname_parts) > 1 2760a6878375SBram Moolenaar let namespace = join(classname_parts[0:-2], '\') 2761a6878375SBram Moolenaar let classname = classname_parts[-1] 2762a6878375SBram Moolenaar endif 2763a6878375SBram Moolenaar endif 2764a6878375SBram Moolenaar return [classname, namespace] 2765a6878375SBram Moolenaarendfunction 2766a6878375SBram Moolenaar" }}} 2767a6878375SBram Moolenaar 2768a6878375SBram Moolenaarfunction! phpcomplete#LoadData() " {{{ 2769a6878375SBram Moolenaar" Keywords/reserved words, all other special things 2770a6878375SBram Moolenaar" Later it is possible to add some help to values, or type of defined variable 2771a6878375SBram Moolenaarlet g:php_keywords={'PHP_SELF':'','argv':'','argc':'','GATEWAY_INTERFACE':'','SERVER_ADDR':'','SERVER_NAME':'','SERVER_SOFTWARE':'','SERVER_PROTOCOL':'','REQUEST_METHOD':'','REQUEST_TIME':'','QUERY_STRING':'','DOCUMENT_ROOT':'','HTTP_ACCEPT':'','HTTP_ACCEPT_CHARSET':'','HTTP_ACCEPT_ENCODING':'','HTTP_ACCEPT_LANGUAGE':'','HTTP_CONNECTION':'','HTTP_POST':'','HTTP_REFERER':'','HTTP_USER_AGENT':'','HTTPS':'','REMOTE_ADDR':'','REMOTE_HOST':'','REMOTE_PORT':'','SCRIPT_FILENAME':'','SERVER_ADMIN':'','SERVER_PORT':'','SERVER_SIGNATURE':'','PATH_TRANSLATED':'','SCRIPT_NAME':'','REQUEST_URI':'','PHP_AUTH_DIGEST':'','PHP_AUTH_USER':'','PHP_AUTH_PW':'','AUTH_TYPE':'','and':'','or':'','xor':'','__FILE__':'','exception':'','__LINE__':'','as':'','break':'','case':'','class':'','const':'','continue':'','declare':'','default':'','do':'','echo':'','else':'','elseif':'','enddeclare':'','endfor':'','endforeach':'','endif':'','endswitch':'','endwhile':'','extends':'','for':'','foreach':'','function':'','global':'','if':'','new':'','static':'','switch':'','use':'','var':'','while':'','final':'','php_user_filter':'','interface':'','implements':'','public':'','private':'','protected':'','abstract':'','clone':'','try':'','catch':'','throw':'','cfunction':'','old_function':'','this':'','INI_USER': '','INI_PERDIR': '','INI_SYSTEM': '','INI_ALL': '','ABDAY_1': '','ABDAY_2': '','ABDAY_3': '','ABDAY_4': '','ABDAY_5': '','ABDAY_6': '','ABDAY_7': '','DAY_1': '','DAY_2': '','DAY_3': '','DAY_4': '','DAY_5': '','DAY_6': '','DAY_7': '','ABMON_1': '','ABMON_2': '','ABMON_3': '','ABMON_4': '','ABMON_5': '','ABMON_6': '','ABMON_7': '','ABMON_8': '','ABMON_9': '','ABMON_10': '','ABMON_11': '','ABMON_12': '','MON_1': '','MON_2': '','MON_3': '','MON_4': '','MON_5': '','MON_6': '','MON_7': '','MON_8': '','MON_9': '','MON_10': '','MON_11': '','MON_12': '','AM_STR': '','D_T_FMT': '','ALT_DIGITS': '',} 2772a6878375SBram Moolenaar" One giant hash of all built-in function, class, interface and constant grouped by extension 2773a6878375SBram Moolenaarlet php_builtin = {'functions':{},'classes':{},'interfaces':{},'constants':{},} 2774a6878375SBram Moolenaarlet php_builtin['functions']['math']={'abs(':'mixed $number | number','acos(':'float $arg | float','acosh(':'float $arg | float','asin(':'float $arg | float','asinh(':'float $arg | float','atan(':'float $arg | float','atan2(':'float $y, float $x | float','atanh(':'float $arg | float','base_convert(':'string $number, int $frombase, int $tobase | string','bindec(':'string $binary_string | number','ceil(':'float $value | float','cos(':'float $arg | float','cosh(':'float $arg | float','decbin(':'int $number | string','dechex(':'int $number | string','decoct(':'int $number | string','deg2rad(':'float $number | float','exp(':'float $arg | float','expm1(':'float $arg | float','floor(':'float $value | float','fmod(':'float $x, float $y | float','getrandmax(':'void | int','hexdec(':'string $hex_string | number','hypot(':'float $x, float $y | float','is_finite(':'float $val | bool','is_infinite(':'float $val | bool','is_nan(':'float $val | bool','lcg_value(':'void | float','log(':'float $arg [, float $base = M_E] | float','log10(':'float $arg | float','log1p(':'float $number | float','max(':'array $values | mixed','min(':'array $values | mixed','mt_getrandmax(':'void | int','mt_rand(':'void | int','mt_srand(':'[ int $seed] | void','octdec(':'string $octal_string | number','pi(':'void | float','pow(':'number $base, number $exp | number','rad2deg(':'float $number | float','rand(':'void | int','round(':'float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP]] | float','sin(':'float $arg | float','sinh(':'float $arg | float','sqrt(':'float $arg | float','srand(':'[ int $seed] | void','tan(':'float $arg | float','tanh(':'float $arg | float',} 2775a6878375SBram Moolenaarlet php_builtin['functions']['strings']={'addcslashes(':'string $str, string $charlist | string','addslashes(':'string $str | string','bin2hex(':'string $str | string','chop(':'chop — Alias of rtrim()','chr(':'int $ascii | string','chunk_split(':'string $body [, int $chunklen = 76 [, string $end = "\r\n"]] | string','convert_cyr_string(':'string $str, string $from, string $to | string','convert_uudecode(':'string $data | string','convert_uuencode(':'string $data | string','count_chars(':'string $string [, int $mode = 0] | mixed','crc32(':'string $str | int','crypt(':'string $str [, string $salt] | string','echo(':'string $arg1 [, string $...] | void','explode(':'string $delimiter, string $string [, int $limit] | array','fprintf(':'resource $handle, string $format [, mixed $args [, mixed $...]] | int','get_html_translation_table(':'[ int $table = HTML_SPECIALCHARS [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'']]] | array','hebrev(':'string $hebrew_text [, int $max_chars_per_line = 0] | string','hebrevc(':'string $hebrew_text [, int $max_chars_per_line = 0] | string','hex2bin(':'string $data | string','html_entity_decode(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'']] | string','htmlentities(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'' [, bool $double_encode = true]]] | string','htmlspecialchars_decode(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401] | string','htmlspecialchars(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'' [, bool $double_encode = true]]] | string','implode(':'string $glue, array $pieces | string','join(':'join — Alias of implode()','lcfirst(':'string $str | string','levenshtein(':'string $str1, string $str2 | int','localeconv(':'void | array','ltrim(':'string $str [, string $character_mask] | string','md5_file(':'string $filename [, bool $raw_output = false] | string','md5(':'string $str [, bool $raw_output = false] | string','metaphone(':'string $str [, int $phonemes = 0] | string','money_format(':'string $format, float $number | string','nl_langinfo(':'int $item | string','nl2br(':'string $string [, bool $is_xhtml = true] | string','number_format(':'float $number [, int $decimals = 0] | string','ord(':'string $string | int','parse_str(':'string $str [, array &$arr] | void','print(':'string $arg | int','printf(':'string $format [, mixed $args [, mixed $...]] | int','quoted_printable_decode(':'string $str | string','quoted_printable_encode(':'string $str | string','quotemeta(':'string $str | string','rtrim(':'string $str [, string $character_mask] | string','setlocale(':'int $category, string $locale [, string $...] | string','sha1_file(':'string $filename [, bool $raw_output = false] | string','sha1(':'string $str [, bool $raw_output = false] | string','similar_text(':'string $first, string $second [, float &$percent] | int','soundex(':'string $str | string','sprintf(':'string $format [, mixed $args [, mixed $...]] | string','sscanf(':'string $str, string $format [, mixed &$...] | mixed','str_getcsv(':'string $input [, string $delimiter = '','' [, string $enclosure = ''"'' [, string $escape = ''\\'']]] | array','str_ireplace(':'mixed $search, mixed $replace, mixed $subject [, int &$count] | mixed','str_pad(':'string $input, int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT]] | string','str_repeat(':'string $input, int $multiplier | string','str_replace(':'mixed $search, mixed $replace, mixed $subject [, int &$count] | mixed','str_rot13(':'string $str | string','str_shuffle(':'string $str | string','str_split(':'string $string [, int $split_length = 1] | array','str_word_count(':'string $string [, int $format = 0 [, string $charlist]] | mixed','strcasecmp(':'string $str1, string $str2 | int','strchr(':'strchr — Alias of strstr()','strcmp(':'string $str1, string $str2 | int','strcoll(':'string $str1, string $str2 | int','strcspn(':'string $str1, string $str2 [, int $start [, int $length]] | int','strip_tags(':'string $str [, string $allowable_tags] | string','stripcslashes(':'string $str | string','stripos(':'string $haystack, string $needle [, int $offset = 0] | int','stripslashes(':'string $str | string','stristr(':'string $haystack, mixed $needle [, bool $before_needle = false] | string','strlen(':'string $string | int','strnatcasecmp(':'string $str1, string $str2 | int','strnatcmp(':'string $str1, string $str2 | int','strncasecmp(':'string $str1, string $str2, int $len | int','strncmp(':'string $str1, string $str2, int $len | int','strpbrk(':'string $haystack, string $char_list | string','strpos(':'string $haystack, mixed $needle [, int $offset = 0] | mixed','strrchr(':'string $haystack, mixed $needle | string','strrev(':'string $string | string','strripos(':'string $haystack, string $needle [, int $offset = 0] | int','strrpos(':'string $haystack, string $needle [, int $offset = 0] | int','strspn(':'string $subject, string $mask [, int $start [, int $length]] | int','strstr(':'string $haystack, mixed $needle [, bool $before_needle = false] | string','strtok(':'string $str, string $token | string','strtolower(':'string $str | string','strtoupper(':'string $string | string','strtr(':'string $str, string $from, string $to | string','substr_compare(':'string $main_str, string $str, int $offset [, int $length [, bool $case_insensitivity = false]] | int','substr_count(':'string $haystack, string $needle [, int $offset = 0 [, int $length]] | int','substr_replace(':'mixed $string, mixed $replacement, mixed $start [, mixed $length] | mixed','substr(':'string $string, int $start [, int $length] | string','trim(':'string $str [, string $character_mask = " \t\n\r\0\x0B"] | string','ucfirst(':'string $str | string','ucwords(':'string $str | string','vfprintf(':'resource $handle, string $format, array $args | int','vprintf(':'string $format, array $args | int','vsprintf(':'string $format, array $args | string','wordwrap(':'string $str [, int $width = 75 [, string $break = "\n" [, bool $cut = false]]] | string',} 2776a6878375SBram Moolenaarlet php_builtin['functions']['apache']={'apache_child_terminate(':'void | bool','apache_get_modules(':'void | array','apache_get_version(':'void | string','apache_getenv(':'string $variable [, bool $walk_to_top = false] | string','apache_lookup_uri(':'string $filename | object','apache_note(':'string $note_name [, string $note_value = ""] | string','apache_request_headers(':'void | array','apache_reset_timeout(':'void | bool','apache_response_headers(':'void | array','apache_setenv(':'string $variable, string $value [, bool $walk_to_top = false] | bool','getallheaders(':'void | array','virtual(':'string $filename | bool',} 2777a6878375SBram Moolenaarlet php_builtin['functions']['arrays']={'array_change_key_case(':'array $array [, int $case = CASE_LOWER] | array','array_chunk(':'array $array, int $size [, bool $preserve_keys = false] | array','array_column(':'array $array, mixed $column_key [, mixed $index_key = null] | array','array_combine(':'array $keys, array $values | array','array_count_values(':'array $array | array','array_diff_assoc(':'array $array1, array $array2 [, array $...] | array','array_diff_key(':'array $array1, array $array2 [, array $...] | array','array_diff_uassoc(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_diff_ukey(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_diff(':'array $array1, array $array2 [, array $...] | array','array_fill_keys(':'array $keys, mixed $value | array','array_fill(':'int $start_index, int $num, mixed $value | array','array_filter(':'array $array [, callable $callback] | array','array_flip(':'array $array | array','array_intersect_assoc(':'array $array1, array $array2 [, array $...] | array','array_intersect_key(':'array $array1, array $array2 [, array $...] | array','array_intersect_uassoc(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_intersect_ukey(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_intersect(':'array $array1, array $array2 [, array $...] | array','array_key_exists(':'mixed $key, array $array | bool','array_keys(':'array $array [, mixed $search_value [, bool $strict = false]] | array','array_map(':'callable $callback, array $array1 [, array $...] | array','array_merge_recursive(':'array $array1 [, array $...] | array','array_merge(':'array $array1 [, array $...] | array','array_multisort(':'array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $...]]] | bool','array_pad(':'array $array, int $size, mixed $value | array','array_pop(':'array &$array | mixed','array_product(':'array $array | number','array_push(':'array &$array, mixed $value1 [, mixed $...] | int','array_rand(':'array $array [, int $num = 1] | mixed','array_reduce(':'array $array, callable $callback [, mixed $initial = NULL] | mixed','array_replace_recursive(':'array $array1, array $array2 [, array $...] | array','array_replace(':'array $array1, array $array2 [, array $...] | array','array_reverse(':'array $array [, bool $preserve_keys = false] | array','array_search(':'mixed $needle, array $haystack [, bool $strict = false] | mixed','array_shift(':'array &$array | mixed','array_slice(':'array $array, int $offset [, int $length = NULL [, bool $preserve_keys = false]] | array','array_splice(':'array &$input, int $offset [, int $length [, mixed $replacement = array()]] | array','array_sum(':'array $array | number','array_udiff_assoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_udiff_uassoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func [, callable $key_compare_func]]] | array','array_udiff(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_uintersect_assoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_uintersect_uassoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func [, callable $key_compare_func]]] | array','array_uintersect(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_unique(':'array $array [, int $sort_flags = SORT_STRING] | array','array_unshift(':'array &$array, mixed $value1 [, mixed $...] | int','array_values(':'array $array | array','array_walk_recursive(':'array &$array, callable $callback [, mixed $userdata = NULL] | bool','array_walk(':'array &$array, callable $callback [, mixed $userdata = NULL] | bool','array(':'[ mixed $...] | array','arsort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','asort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','compact(':'mixed $varname1 [, mixed $...] | array','count(':'mixed $array_or_countable [, int $mode = COUNT_NORMAL] | int','current(':'array &$array | mixed','each(':'array &$array | array','end(':'array &$array | mixed','extract(':'array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL]] | int','in_array(':'mixed $needle, array $haystack [, bool $strict = FALSE] | bool','key_exists(':'key_exists — Alias of array_key_exists()','key(':'array &$array | mixed','krsort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','ksort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','list(':'mixed $var1 [, mixed $...] | array','natcasesort(':'array &$array | bool','natsort(':'array &$array | bool','next(':'array &$array | mixed','pos(':'pos — Alias of current()','prev(':'array &$array | mixed','range(':'mixed $start, mixed $end [, number $step = 1] | array','reset(':'array &$array | mixed','rsort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','shuffle(':'array &$array | bool','sizeof(':'sizeof — Alias of count()','sort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','uasort(':'array &$array, callable $value_compare_func | bool','uksort(':'array &$array, callable $key_compare_func | bool','usort(':'array &$array, callable $value_compare_func | bool',} 2778a6878375SBram Moolenaarlet php_builtin['functions']['php_options_info']={'assert_options(':'int $what [, mixed $value] | mixed','assert(':'mixed $assertion [, string $description] | bool','cli_get_process_title(':'void | string','cli_set_process_title(':'string $title | bool','dl(':'string $library | bool','extension_loaded(':'string $name | bool','gc_collect_cycles(':'void | int','gc_disable(':'void | void','gc_enable(':'void | void','gc_enabled(':'void | bool','get_cfg_var(':'string $option | string','get_current_user(':'void | string','get_defined_constants(':'[ bool $categorize = false] | array','get_extension_funcs(':'string $module_name | array','get_include_path(':'void | string','get_included_files(':'void | array','get_loaded_extensions(':'[ bool $zend_extensions = false] | array','get_magic_quotes_gpc(':'void | bool','get_magic_quotes_runtime(':'void | bool','get_required_files(':'get_required_files — Alias of get_included_files()','getenv(':'string $varname | string','getlastmod(':'void | int','getmygid(':'void | int','getmyinode(':'void | int','getmypid(':'void | int','getmyuid(':'void | int','getopt(':'string $options [, array $longopts] | array','getrusage(':'[ int $who = 0] | array','ini_alter(':'ini_alter — Alias of ini_set()','ini_get_all(':'[ string $extension [, bool $details = true]] | array','ini_get(':'string $varname | string','ini_restore(':'string $varname | void','ini_set(':'string $varname, string $newvalue | string','magic_quotes_runtime(':'magic_quotes_runtime — Alias of set_magic_quotes_runtime()','memory_get_peak_usage(':'[ bool $real_usage = false] | int','memory_get_usage(':'[ bool $real_usage = false] | int','php_ini_loaded_file(':'void | string','php_ini_scanned_files(':'void | string','php_logo_guid(':'void | string','php_sapi_name(':'void | string','php_uname(':'[ string $mode = "a"] | string','phpcredits(':'[ int $flag = CREDITS_ALL] | bool','phpinfo(':'[ int $what = INFO_ALL] | bool','phpversion(':'[ string $extension] | string','putenv(':'string $setting | bool','restore_include_path(':'void | void','set_include_path(':'string $new_include_path | string','set_magic_quotes_runtime(':'bool $new_setting | bool','set_time_limit(':'int $seconds | void','sys_get_temp_dir(':'void | string','version_compare(':'string $version1, string $version2 [, string $operator] | mixed','zend_logo_guid(':'void | string','zend_thread_id(':'void | int','zend_version(':'void | string',} 2779a6878375SBram Moolenaarlet php_builtin['functions']['classes_objects']={'__autoload(':'string $class | void','call_user_method_array(':'string $method_name, object &$obj, array $params | mixed','call_user_method(':'string $method_name, object &$obj [, mixed $parameter [, mixed $...]] | mixed','class_alias(':'string $original, string $alias [, bool $autoload = TRUE] | bool','class_exists(':'string $class_name [, bool $autoload = true] | bool','get_called_class(':'void | string','get_class_methods(':'mixed $class_name | array','get_class_vars(':'string $class_name | array','get_class(':'[ object $object = NULL] | string','get_declared_classes(':'void | array','get_declared_interfaces(':'void | array','get_declared_traits(':'void | array','get_object_vars(':'object $object | array','get_parent_class(':'[ mixed $object] | string','interface_exists(':'string $interface_name [, bool $autoload = true] | bool','is_a(':'object $object, string $class_name [, bool $allow_string = FALSE] | bool','is_subclass_of(':'mixed $object, string $class_name [, bool $allow_string = TRUE] | bool','method_exists(':'mixed $object, string $method_name | bool','property_exists(':'mixed $class, string $property | bool','trait_exists(':'string $traitname [, bool $autoload] | bool',} 2780a6878375SBram Moolenaarlet php_builtin['functions']['urls']={'base64_decode(':'string $data [, bool $strict = false] | string','base64_encode(':'string $data | string','get_headers(':'string $url [, int $format = 0] | array','get_meta_tags(':'string $filename [, bool $use_include_path = false] | array','http_build_query(':'mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738]]] | string','parse_url(':'string $url [, int $component = -1] | mixed','rawurldecode(':'string $str | string','rawurlencode(':'string $str | string','urldecode(':'string $str | string','urlencode(':'string $str | string',} 2781a6878375SBram Moolenaarlet php_builtin['functions']['filesystem']={'basename(':'string $path [, string $suffix] | string','chgrp(':'string $filename, mixed $group | bool','chmod(':'string $filename, int $mode | bool','chown(':'string $filename, mixed $user | bool','clearstatcache(':'[ bool $clear_realpath_cache = false [, string $filename]] | void','copy(':'string $source, string $dest [, resource $context] | bool','dirname(':'string $path | string','disk_free_space(':'string $directory | float','disk_total_space(':'string $directory | float','diskfreespace(':'diskfreespace — Alias of disk_free_space()','fclose(':'resource $handle | bool','feof(':'resource $handle | bool','fflush(':'resource $handle | bool','fgetc(':'resource $handle | string','fgetcsv(':'resource $handle [, int $length = 0 [, string $delimiter = '','' [, string $enclosure = ''"'' [, string $escape = ''\\'']]]] | array','fgets(':'resource $handle [, int $length] | string','fgetss(':'resource $handle [, int $length [, string $allowable_tags]] | string','file_exists(':'string $filename | bool','file_get_contents(':'string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen]]]] | string','file_put_contents(':'string $filename, mixed $data [, int $flags = 0 [, resource $context]] | int','file(':'string $filename [, int $flags = 0 [, resource $context]] | array','fileatime(':'string $filename | int','filectime(':'string $filename | int','filegroup(':'string $filename | int','fileinode(':'string $filename | int','filemtime(':'string $filename | int','fileowner(':'string $filename | int','fileperms(':'string $filename | int','filesize(':'string $filename | int','filetype(':'string $filename | string','flock(':'resource $handle, int $operation [, int &$wouldblock] | bool','fnmatch(':'string $pattern, string $string [, int $flags = 0] | bool','fopen(':'string $filename, string $mode [, bool $use_include_path = false [, resource $context]] | resource','fpassthru(':'resource $handle | int','fputcsv(':'resource $handle, array $fields [, string $delimiter = '','' [, string $enclosure = ''"'']] | int','fputs(':'fputs — Alias of fwrite()','fread(':'resource $handle, int $length | string','fscanf(':'resource $handle, string $format [, mixed &$...] | mixed','fseek(':'resource $handle, int $offset [, int $whence = SEEK_SET] | int','fstat(':'resource $handle | array','ftell(':'resource $handle | int','ftruncate(':'resource $handle, int $size | bool','fwrite(':'resource $handle, string $string [, int $length] | int','glob(':'string $pattern [, int $flags = 0] | array','is_dir(':'string $filename | bool','is_executable(':'string $filename | bool','is_file(':'string $filename | bool','is_link(':'string $filename | bool','is_readable(':'string $filename | bool','is_uploaded_file(':'string $filename | bool','is_writable(':'string $filename | bool','is_writeable(':'is_writeable — Alias of is_writable()','lchgrp(':'string $filename, mixed $group | bool','lchown(':'string $filename, mixed $user | bool','link(':'string $target, string $link | bool','linkinfo(':'string $path | int','lstat(':'string $filename | array','mkdir(':'string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]] | bool','move_uploaded_file(':'string $filename, string $destination | bool','parse_ini_file(':'string $filename [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL]] | array','parse_ini_string(':'string $ini [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL]] | array','pathinfo(':'string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME] | mixed','pclose(':'resource $handle | int','popen(':'string $command, string $mode | resource','readfile(':'string $filename [, bool $use_include_path = false [, resource $context]] | int','readlink(':'string $path | string','realpath_cache_get(':'void | array','realpath_cache_size(':'void | int','realpath(':'string $path | string','rename(':'string $oldname, string $newname [, resource $context] | bool','rewind(':'resource $handle | bool','rmdir(':'string $dirname [, resource $context] | bool','set_file_buffer(':'set_file_buffer — Alias of stream_set_write_buffer()','stat(':'string $filename | array','symlink(':'string $target, string $link | bool','tempnam(':'string $dir, string $prefix | string','tmpfile(':'void | resource','touch(':'string $filename [, int $time = time() [, int $atime]] | bool','umask(':'[ int $mask] | int','unlink(':'string $filename [, resource $context] | bool',} 2782a6878375SBram Moolenaarlet php_builtin['functions']['variable_handling']={'boolval(':'mixed $var | boolean','debug_zval_dump(':'mixed $variable [, mixed $...] | void','doubleval(':'doubleval — Alias of floatval()','empty(':'mixed $var | bool','floatval(':'mixed $var | float','get_defined_vars(':'void | array','get_resource_type(':'resource $handle | string','gettype(':'mixed $var | string','import_request_variables(':'string $types [, string $prefix] | bool','intval(':'mixed $var [, int $base = 10] | int','is_array(':'mixed $var | bool','is_bool(':'mixed $var | bool','is_callable(':'callable $name [, bool $syntax_only = false [, string &$callable_name]] | bool','is_double(':'is_double — Alias of is_float()','is_float(':'mixed $var | bool','is_int(':'mixed $var | bool','is_integer(':'is_integer — Alias of is_int()','is_long(':'is_long — Alias of is_int()','is_null(':'mixed $var | bool','is_numeric(':'mixed $var | bool','is_object(':'mixed $var | bool','is_real(':'is_real — Alias of is_float()','is_resource(':'mixed $var | bool','is_scalar(':'mixed $var | bool','is_string(':'mixed $var | bool','isset(':'mixed $var [, mixed $...] | bool','print_r(':'mixed $expression [, bool $return = false] | mixed','serialize(':'mixed $value | string','settype(':'mixed &$var, string $type | bool','strval(':'mixed $var | string','unserialize(':'string $str | mixed','unset(':'mixed $var [, mixed $...] | void','var_dump(':'mixed $expression [, mixed $...] | void','var_export(':'mixed $expression [, bool $return = false] | mixed',} 2783a6878375SBram Moolenaarlet php_builtin['functions']['calendar']={'cal_days_in_month(':'int $calendar, int $month, int $year | int','cal_from_jd(':'int $jd, int $calendar | array','cal_info(':'[ int $calendar = -1] | array','cal_to_jd(':'int $calendar, int $month, int $day, int $year | int','easter_date(':'[ int $year] | int','easter_days(':'[ int $year [, int $method = CAL_EASTER_DEFAULT]] | int','frenchtojd(':'int $month, int $day, int $year | int','gregoriantojd(':'int $month, int $day, int $year | int','jddayofweek(':'int $julianday [, int $mode = CAL_DOW_DAYNO] | mixed','jdmonthname(':'int $julianday, int $mode | string','jdtofrench(':'int $juliandaycount | string','jdtogregorian(':'int $julianday | string','jdtojewish(':'int $juliandaycount [, bool $hebrew = false [, int $fl = 0]] | string','jdtojulian(':'int $julianday | string','jdtounix(':'int $jday | int','jewishtojd(':'int $month, int $day, int $year | int','juliantojd(':'int $month, int $day, int $year | int','unixtojd(':'[ int $timestamp = time()] | int',} 2784a6878375SBram Moolenaarlet php_builtin['functions']['function_handling']={'call_user_func_array(':'callable $callback, array $param_arr | mixed','call_user_func(':'callable $callback [, mixed $parameter [, mixed $...]] | mixed','create_function(':'string $args, string $code | string','forward_static_call_array(':'callable $function, array $parameters | mixed','forward_static_call(':'callable $function [, mixed $parameter [, mixed $...]] | mixed','func_get_arg(':'int $arg_num | mixed','func_get_args(':'void | array','func_num_args(':'void | int','function_exists(':'string $function_name | bool','get_defined_functions(':'void | array','register_shutdown_function(':'callable $callback [, mixed $parameter [, mixed $...]] | void','register_tick_function(':'callable $function [, mixed $arg [, mixed $...]] | bool','unregister_tick_function(':'string $function_name | void',} 2785a6878375SBram Moolenaarlet php_builtin['functions']['directories']={'chdir(':'string $directory | bool','chroot(':'string $directory | bool','closedir(':'[ resource $dir_handle] | void','dir(':'string $directory [, resource $context] | Directory','getcwd(':'void | string','opendir(':'string $path [, resource $context] | resource','readdir(':'[ resource $dir_handle] | string','rewinddir(':'[ resource $dir_handle] | void','scandir(':'string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context]] | array',} 2786a6878375SBram Moolenaarlet php_builtin['functions']['date_time']={'checkdate(':'int $month, int $day, int $year | bool','date_default_timezone_get(':'void | string','date_default_timezone_set(':'string $timezone_identifier | bool','date_parse_from_format(':'string $format, string $date | array','date_parse(':'string $date | array','date_sun_info(':'int $time, float $latitude, float $longitude | array','date_sunrise(':'int $timestamp [, int $format = SUNFUNCS_RET_STRING [, float $latitude = ini_get("date.default_latitude") [, float $longitude = ini_get("date.default_longitude") [, float $zenith = ini_get("date.sunrise_zenith") [, float $gmt_offset = 0]]]]] | mixed','date_sunset(':'int $timestamp [, int $format = SUNFUNCS_RET_STRING [, float $latitude = ini_get("date.default_latitude") [, float $longitude = ini_get("date.default_longitude") [, float $zenith = ini_get("date.sunset_zenith") [, float $gmt_offset = 0]]]]] | mixed','date(':'string $format [, int $timestamp = time()] | string','getdate(':'[ int $timestamp = time()] | array','gettimeofday(':'[ bool $return_float = false] | mixed','gmdate(':'string $format [, int $timestamp = time()] | string','gmmktime(':'[ int $hour = gmdate("H") [, int $minute = gmdate("i") [, int $second = gmdate("s") [, int $month = gmdate("n") [, int $day = gmdate("j") [, int $year = gmdate("Y") [, int $is_dst = -1]]]]]]] | int','gmstrftime(':'string $format [, int $timestamp = time()] | string','idate(':'string $format [, int $timestamp = time()] | int','localtime(':'[ int $timestamp = time() [, bool $is_associative = false]] | array','microtime(':'[ bool $get_as_float = false] | mixed','mktime(':'[ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1]]]]]]] | int','strftime(':'string $format [, int $timestamp = time()] | string','strptime(':'string $date, string $format | array','strtotime(':'string $time [, int $now = time()] | int','time(':'void | int','timezone_name_from_abbr(':'string $abbr [, int $gmtOffset = -1 [, int $isdst = -1]] | string','timezone_version_get(':'void | string',} 2787a6878375SBram Moolenaarlet php_builtin['functions']['network']={'checkdnsrr(':'string $host [, string $type = "MX"] | bool','closelog(':'void | bool','define_syslog_variables(':'void | void','dns_get_record(':'string $hostname [, int $type = DNS_ANY [, array &$authns [, array &$addtl [, bool &$raw = false]]]] | array','fsockopen(':'string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout")]]]] | resource','gethostbyaddr(':'string $ip_address | string','gethostbyname(':'string $hostname | string','gethostbynamel(':'string $hostname | array','gethostname(':'void | string','getmxrr(':'string $hostname, array &$mxhosts [, array &$weight] | bool','getprotobyname(':'string $name | int','getprotobynumber(':'int $number | string','getservbyname(':'string $service, string $protocol | int','getservbyport(':'int $port, string $protocol | string','header_register_callback(':'callable $callback | bool','header_remove(':'[ string $name] | void','header(':'string $string [, bool $replace = true [, int $http_response_code]] | void','headers_list(':'void | array','headers_sent(':'[ string &$file [, int &$line]] | bool','http_response_code(':'[ int $response_code] | int','inet_ntop(':'string $in_addr | string','inet_pton(':'string $address | string','ip2long(':'string $ip_address | int','long2ip(':'string $proper_address | string','openlog(':'string $ident, int $option, int $facility | bool','pfsockopen(':'string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout")]]]] | resource','setcookie(':'string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false]]]]]] | bool','setrawcookie(':'string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false]]]]]] | bool','socket_get_status(':'socket_get_status — Alias of stream_get_meta_data()','socket_set_blocking(':'socket_set_blocking — Alias of stream_set_blocking()','socket_set_timeout(':'socket_set_timeout — Alias of stream_set_timeout()','syslog(':'int $priority, string $message | bool',} 2788a6878375SBram Moolenaarlet php_builtin['functions']['spl']={'class_implements(':'mixed $class [, bool $autoload = true] | array','class_parents(':'mixed $class [, bool $autoload = true] | array','class_uses(':'mixed $class [, bool $autoload = true] | array','iterator_apply(':'Traversable $iterator, callable $function [, array $args] | int','iterator_count(':'Traversable $iterator | int','iterator_to_array(':'Traversable $iterator [, bool $use_keys = true] | array','spl_autoload_call(':'string $class_name | void','spl_autoload_extensions(':'[ string $file_extensions] | string','spl_autoload_functions(':'void | array','spl_autoload_register(':'[ callable $autoload_function [, bool $throw = true [, bool $prepend = false]]] | bool','spl_autoload_unregister(':'mixed $autoload_function | bool','spl_autoload(':'string $class_name [, string $file_extensions = spl_autoload_extensions()] | void','spl_classes(':'void | array','spl_object_hash(':'object $obj | string',} 2789a6878375SBram Moolenaarlet php_builtin['functions']['misc']={'connection_aborted(':'void | int','connection_status(':'void | int','connection_timeout(':'void | int','constant(':'string $name | mixed','define(':'string $name, mixed $value [, bool $case_insensitive = false] | bool','defined(':'string $name | bool','eval(':'string $code | mixed','exit(':'[ string $status] | void','get_browser(':'[ string $user_agent [, bool $return_array = false]] | mixed','__halt_compiler(':'void | void','highlight_file(':'string $filename [, bool $return = false] | mixed','highlight_string(':'string $str [, bool $return = false] | mixed','ignore_user_abort(':'[ string $value] | int','pack(':'string $format [, mixed $args [, mixed $...]] | string','php_check_syntax(':'string $filename [, string &$error_message] | bool','php_strip_whitespace(':'string $filename | string','show_source(':'show_source — Alias of highlight_file()','sleep(':'int $seconds | int','sys_getloadavg(':'void | array','time_nanosleep(':'int $seconds, int $nanoseconds | mixed','time_sleep_until(':'float $timestamp | bool','uniqid(':'[ string $prefix = "" [, bool $more_entropy = false]] | string','unpack(':'string $format, string $data | array','usleep(':'int $micro_seconds | void',} 2790a6878375SBram Moolenaarlet php_builtin['functions']['curl']={'curl_close(':'resource $ch | void','curl_copy_handle(':'resource $ch | resource','curl_errno(':'resource $ch | int','curl_error(':'resource $ch | string','curl_escape(':'resource $ch, string $str | string','curl_exec(':'resource $ch | mixed','curl_getinfo(':'resource $ch [, int $opt = 0] | mixed','curl_init(':'[ string $url = NULL] | resource','curl_multi_add_handle(':'resource $mh, resource $ch | int','curl_multi_close(':'resource $mh | void','curl_multi_exec(':'resource $mh, int &$still_running | int','curl_multi_getcontent(':'resource $ch | string','curl_multi_info_read(':'resource $mh [, int &$msgs_in_queue = NULL] | array','curl_multi_init(':'void | resource','curl_multi_remove_handle(':'resource $mh, resource $ch | int','curl_multi_select(':'resource $mh [, float $timeout = 1.0] | int','curl_multi_setopt(':'resource $mh, int $option, mixed $value | bool','curl_multi_strerror(':'int $errornum | string','curl_pause(':'resource $ch, int $bitmask | int','curl_reset(':'resource $ch | void','curl_setopt_array(':'resource $ch, array $options | bool','curl_setopt(':'resource $ch, int $option, mixed $value | bool','curl_share_close(':'resource $sh | void','curl_share_init(':'void | resource','curl_share_setopt(':'resource $sh, int $option, string $value | bool','curl_strerror(':'int $errornum | string','curl_unescape(':'resource $ch, string $str | string','curl_version(':'[ int $age = CURLVERSION_NOW] | array',} 2791a6878375SBram Moolenaarlet php_builtin['functions']['error_handling']={'debug_backtrace(':'[ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0]] | array','debug_print_backtrace(':'[ int $options = 0 [, int $limit = 0]] | void','error_get_last(':'void | array','error_log(':'string $message [, int $message_type = 0 [, string $destination [, string $extra_headers]]] | bool','error_reporting(':'[ int $level] | int','restore_error_handler(':'void | bool','restore_exception_handler(':'void | bool','set_error_handler(':'callable $error_handler [, int $error_types = E_ALL | E_STRICT] | mixed','set_exception_handler(':'callable $exception_handler | callable','trigger_error(':'string $error_msg [, int $error_type = E_USER_NOTICE] | bool',} 2792a6878375SBram Moolenaarlet php_builtin['functions']['dom']={'dom_import_simplexml(':'SimpleXMLElement $node | DOMElement',} 2793a6878375SBram Moolenaarlet php_builtin['functions']['program_execution']={'escapeshellarg(':'string $arg | string','escapeshellcmd(':'string $command | string','exec(':'string $command [, array &$output [, int &$return_var]] | string','passthru(':'string $command [, int &$return_var] | void','proc_close(':'resource $process | int','proc_get_status(':'resource $process | array','proc_nice(':'int $increment | bool','proc_open(':'string $cmd, array $descriptorspec, array &$pipes [, string $cwd [, array $env [, array $other_options]]] | resource','proc_terminate(':'resource $process [, int $signal = 15] | bool','shell_exec(':'string $cmd | string','system(':'string $command [, int &$return_var] | string',} 2794a6878375SBram Moolenaarlet php_builtin['functions']['mail']={'ezmlm_hash(':'string $addr | int','mail(':'string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] | bool',} 2795a6878375SBram Moolenaarlet php_builtin['functions']['fastcgi_process_manager']={'fastcgi_finish_request(':'void | boolean',} 2796a6878375SBram Moolenaarlet php_builtin['functions']['filter']={'filter_has_var(':'int $type, string $variable_name | bool','filter_id(':'string $filtername | int','filter_input_array(':'int $type [, mixed $definition [, bool $add_empty = true]] | mixed','filter_input(':'int $type, string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options]] | mixed','filter_list(':'void | array','filter_var_array(':'array $data [, mixed $definition [, bool $add_empty = true]] | mixed','filter_var(':'mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options]] | mixed',} 2797a6878375SBram Moolenaarlet php_builtin['functions']['fileinfo']={'finfo_buffer(':'resource $finfo [, string $string = NULL [, int $options = FILEINFO_NONE [, resource $context = NULL]]] | string','finfo_close(':'resource $finfo | bool','finfo_file(':'resource $finfo [, string $file_name = NULL [, int $options = FILEINFO_NONE [, resource $context = NULL]]] | string','finfo_open(':'[ int $options = FILEINFO_NONE [, string $magic_file = NULL]] | resource','finfo_set_flags(':'resource $finfo, int $options | bool','mime_content_type(':'string $filename | string',} 2798a6878375SBram Moolenaarlet php_builtin['functions']['output_control']={'flush(':'void | void','ob_clean(':'void | void','ob_end_clean(':'void | bool','ob_end_flush(':'void | bool','ob_flush(':'void | void','ob_get_clean(':'void | string','ob_get_contents(':'void | string','ob_get_flush(':'void | string','ob_get_length(':'void | int','ob_get_level(':'void | int','ob_get_status(':'[ bool $full_status = FALSE] | array','ob_gzhandler(':'string $buffer, int $mode | string','ob_implicit_flush(':'[ int $flag = true] | void','ob_list_handlers(':'void | array','ob_start(':'[ callable $output_callback = NULL [, int $chunk_size = 0 [, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS]]] | bool','output_add_rewrite_var(':'string $name, string $value | bool','output_reset_rewrite_vars(':'void | bool',} 2799a6878375SBram Moolenaarlet php_builtin['functions']['gd']={'gd_info(':'void | array','getimagesize(':'string $filename [, array &$imageinfo] | array','getimagesizefromstring(':'string $imagedata [, array &$imageinfo] | array','image_type_to_extension(':'int $imagetype [, bool $include_dot = TRUE] | string','image_type_to_mime_type(':'int $imagetype | string','image2wbmp(':'resource $image [, string $filename [, int $threshold]] | bool','imageaffine(':'resource $image, array $affine [, array $clip] | resource','imageaffinematrixconcat(':'array $m1, array $m2 | array','imageaffinematrixget(':'int $type [, mixed $options] | array','imagealphablending(':'resource $image, bool $blendmode | bool','imageantialias(':'resource $image, bool $enabled | bool','imagearc(':'resource $image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color | bool','imagechar(':'resource $image, int $font, int $x, int $y, string $c, int $color | bool','imagecharup(':'resource $image, int $font, int $x, int $y, string $c, int $color | bool','imagecolorallocate(':'resource $image, int $red, int $green, int $blue | int','imagecolorallocatealpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolorat(':'resource $image, int $x, int $y | int','imagecolorclosest(':'resource $image, int $red, int $green, int $blue | int','imagecolorclosestalpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolorclosesthwb(':'resource $image, int $red, int $green, int $blue | int','imagecolordeallocate(':'resource $image, int $color | bool','imagecolorexact(':'resource $image, int $red, int $green, int $blue | int','imagecolorexactalpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolormatch(':'resource $image1, resource $image2 | bool','imagecolorresolve(':'resource $image, int $red, int $green, int $blue | int','imagecolorresolvealpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolorset(':'resource $image, int $index, int $red, int $green, int $blue [, int $alpha = 0] | void','imagecolorsforindex(':'resource $image, int $index | array','imagecolorstotal(':'resource $image | int','imagecolortransparent(':'resource $image [, int $color] | int','imageconvolution(':'resource $image, array $matrix, float $div, float $offset | bool','imagecopy(':'resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h | bool','imagecopymerge(':'resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct | bool','imagecopymergegray(':'resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct | bool','imagecopyresampled(':'resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h | bool','imagecopyresized(':'resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h | bool','imagecreate(':'int $width, int $height | resource','imagecreatefromgd(':'string $filename | resource','imagecreatefromgd2(':'string $filename | resource','imagecreatefromgd2part(':'string $filename, int $srcX, int $srcY, int $width, int $height | resource','imagecreatefromgif(':'string $filename | resource','imagecreatefromjpeg(':'string $filename | resource','imagecreatefrompng(':'string $filename | resource','imagecreatefromstring(':'string $image | resource','imagecreatefromwbmp(':'string $filename | resource','imagecreatefromwebp(':'string $filename | resource','imagecreatefromxbm(':'string $filename | resource','imagecreatefromxpm(':'string $filename | resource','imagecreatetruecolor(':'int $width, int $height | resource','imagecrop(':'resource $image, array $rect | resource','imagecropauto(':'resource $image [, int $mode = -1 [, float $threshold = .5 [, int $color = -1]]] | resource','imagedashedline(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imagedestroy(':'resource $image | bool','imageellipse(':'resource $image, int $cx, int $cy, int $width, int $height, int $color | bool','imagefill(':'resource $image, int $x, int $y, int $color | bool','imagefilledarc(':'resource $image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color, int $style | bool','imagefilledellipse(':'resource $image, int $cx, int $cy, int $width, int $height, int $color | bool','imagefilledpolygon(':'resource $image, array $points, int $num_points, int $color | bool','imagefilledrectangle(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imagefilltoborder(':'resource $image, int $x, int $y, int $border, int $color | bool','imagefilter(':'resource $image, int $filtertype [, int $arg1 [, int $arg2 [, int $arg3 [, int $arg4]]]] | bool','imageflip(':'resource $image, int $mode | bool','imagefontheight(':'int $font | int','imagefontwidth(':'int $font | int','imageftbbox(':'float $size, float $angle, string $fontfile, string $text [, array $extrainfo] | array','imagefttext(':'resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text [, array $extrainfo] | array','imagegammacorrect(':'resource $image, float $inputgamma, float $outputgamma | bool','imagegd(':'resource $image [, string $filename] | bool','imagegd2(':'resource $image [, string $filename [, int $chunk_size [, int $type = IMG_GD2_RAW]]] | bool','imagegif(':'resource $image [, string $filename] | bool','imagegrabscreen(':'void | resource','imagegrabwindow(':'int $window_handle [, int $client_area = 0] | resource','imageinterlace(':'resource $image [, int $interlace = 0] | int','imageistruecolor(':'resource $image | bool','imagejpeg(':'resource $image [, string $filename [, int $quality]] | bool','imagelayereffect(':'resource $image, int $effect | bool','imageline(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imageloadfont(':'string $file | int','imagepalettecopy(':'resource $destination, resource $source | void','imagepalettetotruecolor(':'resource $src | bool','imagepng(':'resource $image [, string $filename [, int $quality [, int $filters]]] | bool','imagepolygon(':'resource $image, array $points, int $num_points, int $color | bool','imagepsbbox(':'string $text, resource $font, int $size | array','imagepsencodefont(':'resource $font_index, string $encodingfile | bool','imagepsextendfont(':'resource $font_index, float $extend | bool','imagepsfreefont(':'resource $font_index | bool','imagepsloadfont(':'string $filename | resource','imagepsslantfont(':'resource $font_index, float $slant | bool','imagepstext(':'resource $image, string $text, resource $font_index, int $size, int $foreground, int $background, int $x, int $y [, int $space = 0 [, int $tightness = 0 [, float $angle = 0.0 [, int $antialias_steps = 4]]]] | array','imagerectangle(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imagerotate(':'resource $image, float $angle, int $bgd_color [, int $ignore_transparent = 0] | resource','imagesavealpha(':'resource $image, bool $saveflag | bool','imagescale(':'resource $image, int $new_width [, int $new_height = -1 [, int $mode = IMG_BILINEAR_FIXED]] | resource','imagesetbrush(':'resource $image, resource $brush | bool','imagesetinterpolation(':'resource $image [, int $method = IMG_BILINEAR_FIXED] | bool','imagesetpixel(':'resource $image, int $x, int $y, int $color | bool','imagesetstyle(':'resource $image, array $style | bool','imagesetthickness(':'resource $image, int $thickness | bool','imagesettile(':'resource $image, resource $tile | bool','imagestring(':'resource $image, int $font, int $x, int $y, string $string, int $color | bool','imagestringup(':'resource $image, int $font, int $x, int $y, string $string, int $color | bool','imagesx(':'resource $image | int','imagesy(':'resource $image | int','imagetruecolortopalette(':'resource $image, bool $dither, int $ncolors | bool','imagettfbbox(':'float $size, float $angle, string $fontfile, string $text | array','imagettftext(':'resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text | array','imagetypes(':'void | int','imagewbmp(':'resource $image [, string $filename [, int $foreground]] | bool','imagewebp(':'resource $image, string $filename | bool','imagexbm(':'resource $image, string $filename [, int $foreground] | bool','iptcembed(':'string $iptcdata, string $jpeg_file_name [, int $spool] | mixed','iptcparse(':'string $iptcblock | array','jpeg2wbmp(':'string $jpegname, string $wbmpname, int $dest_height, int $dest_width, int $threshold | bool','png2wbmp(':'string $pngname, string $wbmpname, int $dest_height, int $dest_width, int $threshold | bool',} 2800a6878375SBram Moolenaarlet php_builtin['functions']['iconv']={'iconv_get_encoding(':'[ string $type = "all"] | mixed','iconv_mime_decode_headers(':'string $encoded_headers [, int $mode = 0 [, string $charset = ini_get("iconv.internal_encoding")]] | array','iconv_mime_decode(':'string $encoded_header [, int $mode = 0 [, string $charset = ini_get("iconv.internal_encoding")]] | string','iconv_mime_encode(':'string $field_name, string $field_value [, array $preferences = NULL] | string','iconv_set_encoding(':'string $type, string $charset | bool','iconv_strlen(':'string $str [, string $charset = ini_get("iconv.internal_encoding")] | int','iconv_strpos(':'string $haystack, string $needle [, int $offset = 0 [, string $charset = ini_get("iconv.internal_encoding")]] | int','iconv_strrpos(':'string $haystack, string $needle [, string $charset = ini_get("iconv.internal_encoding")] | int','iconv_substr(':'string $str, int $offset [, int $length = iconv_strlen($str, $charset) [, string $charset = ini_get("iconv.internal_encoding")]] | string','iconv(':'string $in_charset, string $out_charset, string $str | string','ob_iconv_handler(':'string $contents, int $status | string',} 2801a6878375SBram Moolenaarlet php_builtin['functions']['json']={'json_decode(':'string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0]]] | mixed','json_encode(':'mixed $value [, int $options = 0 [, int $depth = 512]] | string','json_last_error_msg(':'void | string','json_last_error(':'void | int',} 2802a6878375SBram Moolenaarlet php_builtin['functions']['libxml']={'libxml_clear_errors(':'void | void','libxml_disable_entity_loader(':'[ bool $disable = true] | bool','libxml_get_errors(':'void | array','libxml_get_last_error(':'void | LibXMLError','libxml_set_external_entity_loader(':'callable $resolver_function | void','libxml_set_streams_context(':'resource $streams_context | void','libxml_use_internal_errors(':'[ bool $use_errors = false] | bool',} 2803a6878375SBram Moolenaarlet php_builtin['functions']['multibyte_string']={'mb_check_encoding(':'[ string $var = NULL [, string $encoding = mb_internal_encoding()]] | bool','mb_convert_case(':'string $str, int $mode [, string $encoding = mb_internal_encoding()] | string','mb_convert_encoding(':'string $str, string $to_encoding [, mixed $from_encoding = mb_internal_encoding()] | string','mb_convert_kana(':'string $str [, string $option = "KV" [, string $encoding = mb_internal_encoding()]] | string','mb_convert_variables(':'string $to_encoding, mixed $from_encoding, mixed &$vars [, mixed &$...] | string','mb_decode_mimeheader(':'string $str | string','mb_decode_numericentity(':'string $str, array $convmap [, string $encoding = mb_internal_encoding()] | string','mb_detect_encoding(':'string $str [, mixed $encoding_list = mb_detect_order() [, bool $strict = false]] | string','mb_detect_order(':'[ mixed $encoding_list = mb_detect_order()] | mixed','mb_encode_mimeheader(':'string $str [, string $charset = mb_internal_encoding() [, string $transfer_encoding = "B" [, string $linefeed = "\r\n" [, int $indent = 0]]]] | string','mb_encode_numericentity(':'string $str, array $convmap [, string $encoding = mb_internal_encoding() [, bool $is_hex = FALSE]] | string','mb_encoding_aliases(':'string $encoding | array','mb_ereg_match(':'string $pattern, string $string [, string $option = "msr"] | bool','mb_ereg_replace_callback(':'string $pattern, callable $callback, string $string [, string $option = "msr"] | string','mb_ereg_replace(':'string $pattern, string $replacement, string $string [, string $option = "msr"] | string','mb_ereg_search_getpos(':'void | int','mb_ereg_search_getregs(':'void | array','mb_ereg_search_init(':'string $string [, string $pattern [, string $option = "msr"]] | bool','mb_ereg_search_pos(':'[ string $pattern [, string $option = "ms"]] | array','mb_ereg_search_regs(':'[ string $pattern [, string $option = "ms"]] | array','mb_ereg_search_setpos(':'int $position | bool','mb_ereg_search(':'[ string $pattern [, string $option = "ms"]] | bool','mb_ereg(':'string $pattern, string $string [, array $regs] | int','mb_eregi_replace(':'string $pattern, string $replace, string $string [, string $option = "msri"] | string','mb_eregi(':'string $pattern, string $string [, array $regs] | int','mb_get_info(':'[ string $type = "all"] | mixed','mb_http_input(':'[ string $type = ""] | mixed','mb_http_output(':'[ string $encoding = mb_http_output()] | mixed','mb_internal_encoding(':'[ string $encoding = mb_internal_encoding()] | mixed','mb_language(':'[ string $language = mb_language()] | mixed','mb_list_encodings(':'void | array','mb_output_handler(':'string $contents, int $status | string','mb_parse_str(':'string $encoded_string [, array &$result] | bool','mb_preferred_mime_name(':'string $encoding | string','mb_regex_encoding(':'[ string $encoding = mb_regex_encoding()] | mixed','mb_regex_set_options(':'[ string $options = mb_regex_set_options()] | string','mb_send_mail(':'string $to, string $subject, string $message [, string $additional_headers = NULL [, string $additional_parameter = NULL]] | bool','mb_split(':'string $pattern, string $string [, int $limit = -1] | array','mb_strcut(':'string $str, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding()]] | string','mb_strimwidth(':'string $str, int $start, int $width [, string $trimmarker = "" [, string $encoding = mb_internal_encoding()]] | string','mb_stripos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_stristr(':'string $haystack, string $needle [, bool $before_needle = false [, string $encoding = mb_internal_encoding()]] | string','mb_strlen(':'string $str [, string $encoding = mb_internal_encoding()] | mixed','mb_strpos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_strrchr(':'string $haystack, string $needle [, bool $part = false [, string $encoding = mb_internal_encoding()]] | string','mb_strrichr(':'string $haystack, string $needle [, bool $part = false [, string $encoding = mb_internal_encoding()]] | string','mb_strripos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_strrpos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_strstr(':'string $haystack, string $needle [, bool $before_needle = false [, string $encoding = mb_internal_encoding()]] | string','mb_strtolower(':'string $str [, string $encoding = mb_internal_encoding()] | string','mb_strtoupper(':'string $str [, string $encoding = mb_internal_encoding()] | string','mb_strwidth(':'string $str [, string $encoding = mb_internal_encoding()] | int','mb_substitute_character(':'[ mixed $substrchar = mb_substitute_character()] | mixed','mb_substr_count(':'string $haystack, string $needle [, string $encoding = mb_internal_encoding()] | int','mb_substr(':'string $str, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding()]] | string',} 2804a6878375SBram Moolenaarlet php_builtin['functions']['mssql']={'mssql_bind(':'resource $stmt, string $param_name, mixed &$var, int $type [, bool $is_output = false [, bool $is_null = false [, int $maxlen = -1]]] | bool','mssql_close(':'[ resource $link_identifier] | bool','mssql_connect(':'[ string $servername [, string $username [, string $password [, bool $new_link = false]]]] | resource','mssql_data_seek(':'resource $result_identifier, int $row_number | bool','mssql_execute(':'resource $stmt [, bool $skip_results = false] | mixed','mssql_fetch_array(':'resource $result [, int $result_type = MSSQL_BOTH] | array','mssql_fetch_assoc(':'resource $result_id | array','mssql_fetch_batch(':'resource $result | int','mssql_fetch_field(':'resource $result [, int $field_offset = -1] | object','mssql_fetch_object(':'resource $result | object','mssql_fetch_row(':'resource $result | array','mssql_field_length(':'resource $result [, int $offset = -1] | int','mssql_field_name(':'resource $result [, int $offset = -1] | string','mssql_field_seek(':'resource $result, int $field_offset | bool','mssql_field_type(':'resource $result [, int $offset = -1] | string','mssql_free_result(':'resource $result | bool','mssql_free_statement(':'resource $stmt | bool','mssql_get_last_message(':'void | string','mssql_guid_string(':'string $binary [, bool $short_format = false] | string','mssql_init(':'string $sp_name [, resource $link_identifier] | resource','mssql_min_error_severity(':'int $severity | void','mssql_min_message_severity(':'int $severity | void','mssql_next_result(':'resource $result_id | bool','mssql_num_fields(':'resource $result | int','mssql_num_rows(':'resource $result | int','mssql_pconnect(':'[ string $servername [, string $username [, string $password [, bool $new_link = false]]]] | resource','mssql_query(':'string $query [, resource $link_identifier [, int $batch_size = 0]] | mixed','mssql_result(':'resource $result, int $row, mixed $field | string','mssql_rows_affected(':'resource $link_identifier | int','mssql_select_db(':'string $database_name [, resource $link_identifier] | bool',} 2805a6878375SBram Moolenaarlet php_builtin['functions']['mysql']={'mysql_affected_rows(':'[ resource $link_identifier = NULL] | int','mysql_client_encoding(':'[ resource $link_identifier = NULL] | string','mysql_close(':'[ resource $link_identifier = NULL] | bool','mysql_connect(':'[ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, bool $new_link = false [, int $client_flags = 0]]]]] | resource','mysql_create_db(':'string $database_name [, resource $link_identifier = NULL] | bool','mysql_data_seek(':'resource $result, int $row_number | bool','mysql_db_name(':'resource $result, int $row [, mixed $field = NULL] | string','mysql_db_query(':'string $database, string $query [, resource $link_identifier = NULL] | resource','mysql_drop_db(':'string $database_name [, resource $link_identifier = NULL] | bool','mysql_errno(':'[ resource $link_identifier = NULL] | int','mysql_error(':'[ resource $link_identifier = NULL] | string','mysql_escape_string(':'string $unescaped_string | string','mysql_fetch_array(':'resource $result [, int $result_type = MYSQL_BOTH] | array','mysql_fetch_assoc(':'resource $result | array','mysql_fetch_field(':'resource $result [, int $field_offset = 0] | object','mysql_fetch_lengths(':'resource $result | array','mysql_fetch_object(':'resource $result [, string $class_name [, array $params]] | object','mysql_fetch_row(':'resource $result | array','mysql_field_flags(':'resource $result, int $field_offset | string','mysql_field_len(':'resource $result, int $field_offset | int','mysql_field_name(':'resource $result, int $field_offset | string','mysql_field_seek(':'resource $result, int $field_offset | bool','mysql_field_table(':'resource $result, int $field_offset | string','mysql_field_type(':'resource $result, int $field_offset | string','mysql_free_result(':'resource $result | bool','mysql_get_client_info(':'void | string','mysql_get_host_info(':'[ resource $link_identifier = NULL] | string','mysql_get_proto_info(':'[ resource $link_identifier = NULL] | int','mysql_get_server_info(':'[ resource $link_identifier = NULL] | string','mysql_info(':'[ resource $link_identifier = NULL] | string','mysql_insert_id(':'[ resource $link_identifier = NULL] | int','mysql_list_dbs(':'[ resource $link_identifier = NULL] | resource','mysql_list_fields(':'string $database_name, string $table_name [, resource $link_identifier = NULL] | resource','mysql_list_processes(':'[ resource $link_identifier = NULL] | resource','mysql_list_tables(':'string $database [, resource $link_identifier = NULL] | resource','mysql_num_fields(':'resource $result | int','mysql_num_rows(':'resource $result | int','mysql_pconnect(':'[ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, int $client_flags = 0]]]] | resource','mysql_ping(':'[ resource $link_identifier = NULL] | bool','mysql_query(':'string $query [, resource $link_identifier = NULL] | mixed','mysql_real_escape_string(':'string $unescaped_string [, resource $link_identifier = NULL] | string','mysql_result(':'resource $result, int $row [, mixed $field = 0] | string','mysql_select_db(':'string $database_name [, resource $link_identifier = NULL] | bool','mysql_set_charset(':'string $charset [, resource $link_identifier = NULL] | bool','mysql_stat(':'[ resource $link_identifier = NULL] | string','mysql_tablename(':'resource $result, int $i | string','mysql_thread_id(':'[ resource $link_identifier = NULL] | int','mysql_unbuffered_query(':'string $query [, resource $link_identifier = NULL] | resource',} 2806a6878375SBram Moolenaarlet php_builtin['functions']['mysqli']={'mysqli_disable_reads_from_master(':'mysqli $link | bool','mysqli_disable_rpl_parse(':'mysqli $link | bool','mysqli_enable_reads_from_master(':'mysqli $link | bool','mysqli_enable_rpl_parse(':'mysqli $link | bool','mysqli_get_cache_stats(':'void | array','mysqli_master_query(':'mysqli $link, string $query | bool','mysqli_rpl_parse_enabled(':'mysqli $link | int','mysqli_rpl_probe(':'mysqli $link | bool','mysqli_slave_query(':'mysqli $link, string $query | bool',} 2807a6878375SBram Moolenaarlet php_builtin['functions']['password_hashing']={'password_get_info(':'string $hash | array','password_hash(':'string $password, integer $algo [, array $options] | string','password_needs_rehash(':'string $hash, string $algo [, string $options] | boolean','password_verify(':'string $password, string $hash | boolean',} 2808a6878375SBram Moolenaarlet php_builtin['functions']['postgresql']={'pg_affected_rows(':'resource $result | int','pg_cancel_query(':'resource $connection | bool','pg_client_encoding(':'[ resource $connection] | string','pg_close(':'[ resource $connection] | bool','pg_connect(':'string $connection_string [, int $connect_type] | resource','pg_connection_busy(':'resource $connection | bool','pg_connection_reset(':'resource $connection | bool','pg_connection_status(':'resource $connection | int','pg_convert(':'resource $connection, string $table_name, array $assoc_array [, int $options = 0] | array','pg_copy_from(':'resource $connection, string $table_name, array $rows [, string $delimiter [, string $null_as]] | bool','pg_copy_to(':'resource $connection, string $table_name [, string $delimiter [, string $null_as]] | array','pg_dbname(':'[ resource $connection] | string','pg_delete(':'resource $connection, string $table_name, array $assoc_array [, int $options = PGSQL_DML_EXEC] | mixed','pg_end_copy(':'[ resource $connection] | bool','pg_escape_bytea(':'[ resource $connection [, string $data]] | string','pg_escape_identifier(':'[ resource $connection [, string $data]] | string','pg_escape_literal(':'[ resource $connection [, string $data]] | string','pg_escape_string(':'[ resource $connection [, string $data]] | string','pg_execute(':'[ resource $connection [, string $stmtname [, array $params]]] | resource','pg_fetch_all_columns(':'resource $result [, int $column = 0] | array','pg_fetch_all(':'resource $result | array','pg_fetch_array(':'resource $result [, int $row [, int $result_type = PGSQL_BOTH]] | array','pg_fetch_assoc(':'resource $result [, int $row] | array','pg_fetch_object(':'resource $result [, int $row [, int $result_type = PGSQL_ASSOC]] | object','pg_fetch_result(':'resource $result, int $row, mixed $field | string','pg_fetch_row(':'resource $result [, int $row] | array','pg_field_is_null(':'resource $result, int $row, mixed $field | int','pg_field_name(':'resource $result, int $field_number | string','pg_field_num(':'resource $result, string $field_name | int','pg_field_prtlen(':'resource $result, int $row_number, mixed $field_name_or_number | int','pg_field_size(':'resource $result, int $field_number | int','pg_field_table(':'resource $result, int $field_number [, bool $oid_only = false] | mixed','pg_field_type_oid(':'resource $result, int $field_number | int','pg_field_type(':'resource $result, int $field_number | string','pg_free_result(':'resource $result | bool','pg_get_notify(':'resource $connection [, int $result_type] | array','pg_get_pid(':'resource $connection | int','pg_get_result(':'[ resource $connection] | resource','pg_host(':'[ resource $connection] | string','pg_insert(':'resource $connection, string $table_name, array $assoc_array [, int $options = PGSQL_DML_EXEC] | mixed','pg_last_error(':'[ resource $connection] | string','pg_last_notice(':'resource $connection | string','pg_last_oid(':'resource $result | string','pg_lo_close(':'resource $large_object | bool','pg_lo_create(':'[ resource $connection [, mixed $object_id]] | int','pg_lo_export(':'[ resource $connection [, int $oid [, string $pathname]]] | bool','pg_lo_import(':'[ resource $connection [, string $pathname [, mixed $object_id]]] | int','pg_lo_open(':'resource $connection, int $oid, string $mode | resource','pg_lo_read_all(':'resource $large_object | int','pg_lo_read(':'resource $large_object [, int $len = 8192] | string','pg_lo_seek(':'resource $large_object, int $offset [, int $whence = PGSQL_SEEK_CUR] | bool','pg_lo_tell(':'resource $large_object | int','pg_lo_truncate(':'resource $large_object, int $size | bool','pg_lo_unlink(':'resource $connection, int $oid | bool','pg_lo_write(':'resource $large_object, string $data [, int $len] | int','pg_meta_data(':'resource $connection, string $table_name [, bool $extended] | array','pg_num_fields(':'resource $result | int','pg_num_rows(':'resource $result | int','pg_options(':'[ resource $connection] | string','pg_parameter_status(':'[ resource $connection [, string $param_name]] | string','pg_pconnect(':'string $connection_string [, int $connect_type] | resource','pg_ping(':'[ resource $connection] | bool','pg_port(':'[ resource $connection] | int','pg_prepare(':'[ resource $connection [, string $stmtname [, string $query]]] | resource','pg_put_line(':'[ resource $connection [, string $data]] | bool','pg_query_params(':'[ resource $connection [, string $query [, array $params]]] | resource','pg_query(':'[ resource $connection [, string $query]] | resource','pg_result_error_field(':'resource $result, int $fieldcode | string','pg_result_error(':'resource $result | string','pg_result_seek(':'resource $result, int $offset | bool','pg_result_status(':'resource $result [, int $type = PGSQL_STATUS_LONG] | mixed','pg_select(':'resource $connection, string $table_name, array $assoc_array [, int $options = PGSQL_DML_EXEC] | mixed','pg_send_execute(':'resource $connection, string $stmtname, array $params | bool','pg_send_prepare(':'resource $connection, string $stmtname, string $query | bool','pg_send_query_params(':'resource $connection, string $query, array $params | bool','pg_send_query(':'resource $connection, string $query | bool','pg_set_client_encoding(':'[ resource $connection [, string $encoding]] | int','pg_set_error_verbosity(':'[ resource $connection [, int $verbosity]] | int','pg_trace(':'string $pathname [, string $mode = "w" [, resource $connection]] | bool','pg_transaction_status(':'resource $connection | int','pg_tty(':'[ resource $connection] | string','pg_unescape_bytea(':'string $data | string','pg_untrace(':'[ resource $connection] | bool','pg_update(':'resource $connection, string $table_name, array $data, array $condition [, int $options = PGSQL_DML_EXEC] | mixed','pg_version(':'[ resource $connection] | array',} 2809a6878375SBram Moolenaarlet php_builtin['functions']['pcre']={'preg_filter(':'mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count]] | mixed','preg_grep(':'string $pattern, array $input [, int $flags = 0] | array','preg_last_error(':'void | int','preg_match_all(':'string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0]]] | int','preg_match(':'string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0]]] | int','preg_quote(':'string $str [, string $delimiter = NULL] | string','preg_replace_callback(':'mixed $pattern, callable $callback, mixed $subject [, int $limit = -1 [, int &$count]] | mixed','preg_replace(':'mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count]] | mixed','preg_split(':'string $pattern, string $subject [, int $limit = -1 [, int $flags = 0]] | array',} 2810a6878375SBram Moolenaarlet php_builtin['functions']['sessions']={'session_cache_expire(':'[ string $new_cache_expire] | int','session_cache_limiter(':'[ string $cache_limiter] | string','session_commit(':'session_commit — Alias of session_write_close()','session_decode(':'string $data | bool','session_destroy(':'void | bool','session_encode(':'void | string','session_get_cookie_params(':'void | array','session_id(':'[ string $id] | string','session_is_registered(':'string $name | bool','session_module_name(':'[ string $module] | string','session_name(':'[ string $name] | string','session_regenerate_id(':'[ bool $delete_old_session = false] | bool','session_register_shutdown(':'void | void','session_register(':'mixed $name [, mixed $...] | bool','session_save_path(':'[ string $path] | string','session_set_cookie_params(':'int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false]]]] | void','session_set_save_handler(':'callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc | bool','session_start(':'void | bool','session_status(':'void | int','session_unregister(':'string $name | bool','session_unset(':'void | void','session_write_close(':'void | void',} 2811a6878375SBram Moolenaarlet php_builtin['functions']['streams']={'set_socket_blocking(':'set_socket_blocking — Alias of stream_set_blocking()','stream_bucket_append(':'resource $brigade, resource $bucket | void','stream_bucket_make_writeable(':'resource $brigade | object','stream_bucket_new(':'resource $stream, string $buffer | object','stream_bucket_prepend(':'resource $brigade, resource $bucket | void','stream_context_create(':'[ array $options [, array $params]] | resource','stream_context_get_default(':'[ array $options] | resource','stream_context_get_options(':'resource $stream_or_context | array','stream_context_get_params(':'resource $stream_or_context | array','stream_context_set_default(':'array $options | resource','stream_context_set_option(':'resource $stream_or_context, string $wrapper, string $option, mixed $value | bool','stream_context_set_params(':'resource $stream_or_context, array $params | bool','stream_copy_to_stream(':'resource $source, resource $dest [, int $maxlength = -1 [, int $offset = 0]] | int','stream_encoding(':'resource $stream [, string $encoding] | bool','stream_filter_append(':'resource $stream, string $filtername [, int $read_write [, mixed $params]] | resource','stream_filter_prepend(':'resource $stream, string $filtername [, int $read_write [, mixed $params]] | resource','stream_filter_register(':'string $filtername, string $classname | bool','stream_filter_remove(':'resource $stream_filter | bool','stream_get_contents(':'resource $handle [, int $maxlength = -1 [, int $offset = -1]] | string','stream_get_filters(':'void | array','stream_get_line(':'resource $handle, int $length [, string $ending] | string','stream_get_meta_data(':'resource $stream | array','stream_get_transports(':'void | array','stream_get_wrappers(':'void | array','stream_is_local(':'mixed $stream_or_url | bool','stream_notification_callback(':'int $notification_code, int $severity, string $message, int $message_code, int $bytes_transferred, int $bytes_max | void','stream_resolve_include_path(':'string $filename | string','stream_select(':'array &$read, array &$write, array &$except, int $tv_sec [, int $tv_usec = 0] | int','stream_set_blocking(':'resource $stream, int $mode | bool','stream_set_chunk_size(':'resource $fp, int $chunk_size | int','stream_set_read_buffer(':'resource $stream, int $buffer | int','stream_set_timeout(':'resource $stream, int $seconds [, int $microseconds = 0] | bool','stream_set_write_buffer(':'resource $stream, int $buffer | int','stream_socket_accept(':'resource $server_socket [, float $timeout = ini_get("default_socket_timeout") [, string &$peername]] | resource','stream_socket_client(':'string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context]]]]] | resource','stream_socket_enable_crypto(':'resource $stream, bool $enable [, int $crypto_type [, resource $session_stream]] | mixed','stream_socket_get_name(':'resource $handle, bool $want_peer | string','stream_socket_pair(':'int $domain, int $type, int $protocol | array','stream_socket_recvfrom(':'resource $socket, int $length [, int $flags = 0 [, string &$address]] | string','stream_socket_sendto(':'resource $socket, string $data [, int $flags = 0 [, string $address]] | int','stream_socket_server(':'string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context]]]] | resource','stream_socket_shutdown(':'resource $stream, int $how | bool','stream_supports_lock(':'resource $stream | bool','stream_wrapper_register(':'string $protocol, string $classname [, int $flags = 0] | bool','stream_wrapper_restore(':'string $protocol | bool','stream_wrapper_unregister(':'string $protocol | bool',} 2812a6878375SBram Moolenaarlet php_builtin['functions']['simplexml']={'simplexml_import_dom(':'DOMNode $node [, string $class_name = "SimpleXMLElement"] | SimpleXMLElement','simplexml_load_file(':'string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false]]]] | SimpleXMLElement','simplexml_load_string(':'string $data [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false]]]] | SimpleXMLElement',} 2813a6878375SBram Moolenaarlet php_builtin['functions']['xmlwriter']={'xmlwriter_end_attribute(':'resource $xmlwriter | bool','xmlwriter_end_cdata(':'resource $xmlwriter | bool','xmlwriter_end_comment(':'resource $xmlwriter | bool','xmlwriter_end_document(':'resource $xmlwriter | bool','xmlwriter_end_dtd_attlist(':'resource $xmlwriter | bool','xmlwriter_end_dtd_element(':'resource $xmlwriter | bool','xmlwriter_end_dtd_entity(':'resource $xmlwriter | bool','xmlwriter_end_dtd(':'resource $xmlwriter | bool','xmlwriter_end_element(':'resource $xmlwriter | bool','xmlwriter_end_pi(':'resource $xmlwriter | bool','xmlwriter_flush(':'resource $xmlwriter [, bool $empty = true] | mixed','xmlwriter_full_end_element(':'resource $xmlwriter | bool','xmlwriter_open_memory(':'void | resource','xmlwriter_open_uri(':'string $uri | resource','xmlwriter_output_memory(':'resource $xmlwriter [, bool $flush = true] | string','xmlwriter_set_indent_string(':'resource $xmlwriter, string $indentString | bool','xmlwriter_set_indent(':'resource $xmlwriter, bool $indent | bool','xmlwriter_start_attribute_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri | bool','xmlwriter_start_attribute(':'resource $xmlwriter, string $name | bool','xmlwriter_start_cdata(':'resource $xmlwriter | bool','xmlwriter_start_comment(':'resource $xmlwriter | bool','xmlwriter_start_document(':'resource $xmlwriter [, string $version = 1.0 [, string $encoding = NULL [, string $standalone]]] | bool','xmlwriter_start_dtd_attlist(':'resource $xmlwriter, string $name | bool','xmlwriter_start_dtd_element(':'resource $xmlwriter, string $qualifiedName | bool','xmlwriter_start_dtd_entity(':'resource $xmlwriter, string $name, bool $isparam | bool','xmlwriter_start_dtd(':'resource $xmlwriter, string $qualifiedName [, string $publicId [, string $systemId]] | bool','xmlwriter_start_element_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri | bool','xmlwriter_start_element(':'resource $xmlwriter, string $name | bool','xmlwriter_start_pi(':'resource $xmlwriter, string $target | bool','xmlwriter_text(':'resource $xmlwriter, string $content | bool','xmlwriter_write_attribute_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri, string $content | bool','xmlwriter_write_attribute(':'resource $xmlwriter, string $name, string $value | bool','xmlwriter_write_cdata(':'resource $xmlwriter, string $content | bool','xmlwriter_write_comment(':'resource $xmlwriter, string $content | bool','xmlwriter_write_dtd_attlist(':'resource $xmlwriter, string $name, string $content | bool','xmlwriter_write_dtd_element(':'resource $xmlwriter, string $name, string $content | bool','xmlwriter_write_dtd_entity(':'resource $xmlwriter, string $name, string $content, bool $pe, string $pubid, string $sysid, string $ndataid | bool','xmlwriter_write_dtd(':'resource $xmlwriter, string $name [, string $publicId [, string $systemId [, string $subset]]] | bool','xmlwriter_write_element_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri [, string $content] | bool','xmlwriter_write_element(':'resource $xmlwriter, string $name [, string $content] | bool','xmlwriter_write_pi(':'resource $xmlwriter, string $target, string $content | bool','xmlwriter_write_raw(':'resource $xmlwriter, string $content | bool',} 2814a6878375SBram Moolenaarlet php_builtin['functions']['zip']={'zip_close(':'resource $zip | void','zip_entry_close(':'resource $zip_entry | bool','zip_entry_compressedsize(':'resource $zip_entry | int','zip_entry_compressionmethod(':'resource $zip_entry | string','zip_entry_filesize(':'resource $zip_entry | int','zip_entry_name(':'resource $zip_entry | string','zip_entry_open(':'resource $zip, resource $zip_entry [, string $mode] | bool','zip_entry_read(':'resource $zip_entry [, int $length = 1024] | string','zip_open(':'string $filename | resource','zip_read(':'resource $zip | resource',} 2815a6878375SBram Moolenaarlet php_builtin['classes']['spl']={'appenditerator':{'name':'AppendIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'append':{'signature':'Iterator $iterator | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getArrayIterator':{'signature':'void | void','return_type':'void'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'getIteratorIndex':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'arrayiterator':{'name':'ArrayIterator','methods':{'append':{'signature':'mixed $value | void','return_type':'void'},'asort':{'signature':'void | void','return_type':'void'},'__construct':{'signature':'[ mixed $array = array() [, int $flags = 0]]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getArrayCopy':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | mixed','return_type':'mixed'},'ksort':{'signature':'void | void','return_type':'void'},'natcasesort':{'signature':'void | void','return_type':'void'},'natsort':{'signature':'void | void','return_type':'void'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'string $flags | void','return_type':'void'},'uasort':{'signature':'string $cmp_function | void','return_type':'void'},'uksort':{'signature':'string $cmp_function | void','return_type':'void'},'unserialize':{'signature':'string $serialized | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'arrayobject':{'name':'ArrayObject','constants':{'STD_PROP_LIST':'1','ARRAY_AS_PROPS':'2',},'methods':{'__construct':{'signature':'[ mixed $input = [] [, int $flags = 0 [, string $iterator_class = "ArrayIterator"]]]','return_type':''},'append':{'signature':'mixed $value | void','return_type':'void'},'asort':{'signature':'void | void','return_type':'void'},'count':{'signature':'void | int','return_type':'int'},'exchangeArray':{'signature':'mixed $input | array','return_type':'array'},'getArrayCopy':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | int','return_type':'int'},'getIterator':{'signature':'void | ArrayIterator','return_type':'ArrayIterator'},'getIteratorClass':{'signature':'void | string','return_type':'string'},'ksort':{'signature':'void | void','return_type':'void'},'natcasesort':{'signature':'void | void','return_type':'void'},'natsort':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'serialize':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setIteratorClass':{'signature':'string $iterator_class | void','return_type':'void'},'uasort':{'signature':'callable $cmp_function | void','return_type':'void'},'uksort':{'signature':'callable $cmp_function | void','return_type':'void'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},},},'badfunctioncallexception':{'name':'BadFunctionCallException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'badmethodcallexception':{'name':'BadMethodCallException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'cachingiterator':{'name':'CachingIterator','constants':{'CALL_TOSTRING':'1','CATCH_GET_CHILD':'16','TOSTRING_USE_KEY':'2','TOSTRING_USE_CURRENT':'4','TOSTRING_USE_INNER':'8','FULL_CACHE':'256',},'methods':{'__construct':{'signature':'Iterator $iterator [, string $flags = self::CALL_TOSTRING]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | void','return_type':'void'},'getCache':{'signature':'void | void','return_type':'void'},'getFlags':{'signature':'void | void','return_type':'void'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'hasNext':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | void','return_type':'void'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'bitmask $flags | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'callbackfilteriterator':{'name':'CallbackFilterIterator','methods':{'__construct':{'signature':'Iterator $iterator','return_type':''},'accept':{'signature':'void | bool','return_type':'bool'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'directoryiterator':{'name':'DirectoryIterator','methods':{'__construct':{'signature':'string $path','return_type':''},'current':{'signature':'void | DirectoryIterator','return_type':'DirectoryIterator'},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isDot':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | void','return_type':'void'},'__toString':{'signature':'void | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'domainexception':{'name':'DomainException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'emptyiterator':{'name':'EmptyIterator','methods':{'current':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | void','return_type':'void'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'filesystemiterator':{'name':'FilesystemIterator','constants':{'CURRENT_AS_PATHNAME':'32','CURRENT_AS_FILEINFO':'0','CURRENT_AS_SELF':'16','CURRENT_MODE_MASK':'240','KEY_AS_PATHNAME':'0','KEY_AS_FILENAME':'256','FOLLOW_SYMLINKS':'512','KEY_MODE_MASK':'3840','NEW_CURRENT_AND_KEY':'256','SKIP_DOTS':'4096','UNIX_PATHS':'8192',},'methods':{'__construct':{'signature':'string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS]','return_type':''},'current':{'signature':'void | DirectoryIterator','return_type':'DirectoryIterator'},'getFlags':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'[ int $flags] | void','return_type':'void'},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isDot':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'seek':{'signature':'int $position | void','return_type':'void'},'__toString':{'signature':'void | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'filteriterator':{'name':'FilterIterator','methods':{'accept':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'Iterator $iterator','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'globiterator':{'name':'GlobIterator','methods':{'__construct':{'signature':'string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getFlags':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'[ int $flags] | void','return_type':'void'},},},'infiniteiterator':{'name':'InfiniteIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'next':{'signature':'void | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'key':{'signature':'void | scalar','return_type':'scalar'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'invalidargumentexception':{'name':'InvalidArgumentException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'iteratoriterator':{'name':'IteratorIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'lengthexception':{'name':'LengthException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'limititerator':{'name':'LimitIterator','methods':{'__construct':{'signature':'Iterator $iterator [, int $offset = 0 [, int $count = -1]]','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'getPosition':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | int','return_type':'int'},'valid':{'signature':'void | bool','return_type':'bool'},},},'logicexception':{'name':'LogicException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'multipleiterator':{'name':'MultipleIterator','constants':{'MIT_NEED_ANY':'0','MIT_NEED_ALL':'1','MIT_KEYS_NUMERIC':'0','MIT_KEYS_ASSOC':'2',},'methods':{'__construct':{'signature':'[ int $flags = MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_NUMERIC]','return_type':''},'attachIterator':{'signature':'Iterator $iterator [, string $infos] | void','return_type':'void'},'containsIterator':{'signature':'Iterator $iterator | void','return_type':'void'},'countIterators':{'signature':'void | void','return_type':'void'},'current':{'signature':'void | array','return_type':'array'},'detachIterator':{'signature':'Iterator $iterator | void','return_type':'void'},'getFlags':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | array','return_type':'array'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'norewinditerator':{'name':'NoRewindIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'outofboundsexception':{'name':'OutOfBoundsException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'outofrangeexception':{'name':'OutOfRangeException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'overflowexception':{'name':'OverflowException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'parentiterator':{'name':'ParentIterator','methods':{'accept':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'RecursiveIterator $iterator','return_type':''},'getChildren':{'signature':'void | ParentIterator','return_type':'ParentIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},},},'rangeexception':{'name':'RangeException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'recursivearrayiterator':{'name':'RecursiveArrayIterator','methods':{'getChildren':{'signature':'void | RecursiveArrayIterator','return_type':'RecursiveArrayIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'append':{'signature':'mixed $value | void','return_type':'void'},'asort':{'signature':'void | void','return_type':'void'},'__construct':{'signature':'[ mixed $array = array() [, int $flags = 0]]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getArrayCopy':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | mixed','return_type':'mixed'},'ksort':{'signature':'void | void','return_type':'void'},'natcasesort':{'signature':'void | void','return_type':'void'},'natsort':{'signature':'void | void','return_type':'void'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'string $flags | void','return_type':'void'},'uasort':{'signature':'string $cmp_function | void','return_type':'void'},'uksort':{'signature':'string $cmp_function | void','return_type':'void'},'unserialize':{'signature':'string $serialized | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'recursivecachingiterator':{'name':'RecursiveCachingIterator','methods':{'__construct':{'signature':'Iterator $iterator [, string $flags = self::CALL_TOSTRING]','return_type':''},'getChildren':{'signature':'void | RecursiveCachingIterator','return_type':'RecursiveCachingIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | void','return_type':'void'},'getCache':{'signature':'void | void','return_type':'void'},'getFlags':{'signature':'void | void','return_type':'void'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'hasNext':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | void','return_type':'void'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'bitmask $flags | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'recursivecallbackfilteriterator':{'name':'RecursiveCallbackFilterIterator','methods':{'__construct':{'signature':'RecursiveIterator $iterator, string $callback','return_type':''},'getChildren':{'signature':'void | RecursiveCallbackFilterIterator','return_type':'RecursiveCallbackFilterIterator'},'hasChildren':{'signature':'void | void','return_type':'void'},'accept':{'signature':'void | string','return_type':'string'},},},'recursivedirectoryiterator':{'name':'RecursiveDirectoryIterator','methods':{'__construct':{'signature':'string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS]','return_type':''},'getChildren':{'signature':'void | mixed','return_type':'mixed'},'getSubPath':{'signature':'void | string','return_type':'string'},'getSubPathname':{'signature':'void | string','return_type':'string'},'hasChildren':{'signature':'[ bool $allow_links = false] | bool','return_type':'bool'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getFlags':{'signature':'void | int','return_type':'int'},'setFlags':{'signature':'[ int $flags] | void','return_type':'void'},},},'recursivefilteriterator':{'name':'RecursiveFilterIterator','methods':{'__construct':{'signature':'Iterator $iterator','return_type':''},'getChildren':{'signature':'void | void','return_type':'void'},'hasChildren':{'signature':'void | void','return_type':'void'},'accept':{'signature':'void | bool','return_type':'bool'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'recursiveiteratoriterator':{'name':'RecursiveIteratorIterator','constants':{'LEAVES_ONLY':'0','SELF_FIRST':'1','CHILD_FIRST':'2','CATCH_GET_CHILD':'16',},'methods':{'beginChildren':{'signature':'void | void','return_type':'void'},'beginIteration':{'signature':'void | void','return_type':'void'},'callGetChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'callHasChildren':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'Traversable $iterator [, int $mode = RecursiveIteratorIterator::LEAVES_ONLY [, int $flags = 0]]','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'endChildren':{'signature':'void | void','return_type':'void'},'endIteration':{'signature':'void | void','return_type':'void'},'getDepth':{'signature':'void | int','return_type':'int'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'getMaxDepth':{'signature':'void | mixed','return_type':'mixed'},'getSubIterator':{'signature':'[ int $level] | RecursiveIterator','return_type':'RecursiveIterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'nextElement':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setMaxDepth':{'signature':'[ string $max_depth = -1] | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'recursiveregexiterator':{'name':'RecursiveRegexIterator','methods':{'__construct':{'signature':'RecursiveIterator $iterator, string $regex [, int $mode = self::MATCH [, int $flags = 0 [, int $preg_flags = 0]]]','return_type':''},'getChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'accept':{'signature':'void | bool','return_type':'bool'},'getFlags':{'signature':'void | int','return_type':'int'},'getMode':{'signature':'void | int','return_type':'int'},'getPregFlags':{'signature':'void | int','return_type':'int'},'getRegex':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMode':{'signature':'int $mode | void','return_type':'void'},'setPregFlags':{'signature':'int $preg_flags | void','return_type':'void'},},},'recursivetreeiterator':{'name':'RecursiveTreeIterator','constants':{'BYPASS_CURRENT':'4','BYPASS_KEY':'8','PREFIX_LEFT':'0','PREFIX_MID_HAS_NEXT':'1','PREFIX_MID_LAST':'2','PREFIX_END_HAS_NEXT':'3','PREFIX_END_LAST':'4','PREFIX_RIGHT':'5',},'methods':{'beginChildren':{'signature':'void | void','return_type':'void'},'beginIteration':{'signature':'void | void','return_type':'void'},'callGetChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'callHasChildren':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'Traversable $iterator [, int $mode = RecursiveIteratorIterator::LEAVES_ONLY [, int $flags = 0]]','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'endChildren':{'signature':'void | void','return_type':'void'},'endIteration':{'signature':'void | void','return_type':'void'},'getEntry':{'signature':'void | string','return_type':'string'},'getPostfix':{'signature':'void | void','return_type':'void'},'getPrefix':{'signature':'void | string','return_type':'string'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'nextElement':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setPrefixPart':{'signature':'int $part, string $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},'getDepth':{'signature':'void | int','return_type':'int'},'getInnerIterator':{'signature':'void | iterator','return_type':'iterator'},'getMaxDepth':{'signature':'void | mixed','return_type':'mixed'},'getSubIterator':{'signature':'[ int $level] | RecursiveIterator','return_type':'RecursiveIterator'},'setMaxDepth':{'signature':'[ string $max_depth = -1] | void','return_type':'void'},},},'regexiterator':{'name':'RegexIterator','constants':{'MATCH':'0','GET_MATCH':'1','ALL_MATCHES':'2','SPLIT':'3','REPLACE':'4','USE_KEY':'1',},'methods':{'__construct':{'signature':'Iterator $iterator','return_type':''},'accept':{'signature':'void | bool','return_type':'bool'},'getFlags':{'signature':'void | int','return_type':'int'},'getMode':{'signature':'void | int','return_type':'int'},'getPregFlags':{'signature':'void | int','return_type':'int'},'getRegex':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMode':{'signature':'int $mode | void','return_type':'void'},'setPregFlags':{'signature':'int $preg_flags | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'runtimeexception':{'name':'RuntimeException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'spldoublylinkedlist':{'name':'SplDoublyLinkedList','methods':{'__construct':{'signature':'void','return_type':''},'bottom':{'signature':'void | mixed','return_type':'mixed'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getIteratorMode':{'signature':'void | int','return_type':'int'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'pop':{'signature':'void | mixed','return_type':'mixed'},'prev':{'signature':'void | void','return_type':'void'},'push':{'signature':'mixed $value | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setIteratorMode':{'signature':'int $mode | void','return_type':'void'},'shift':{'signature':'void | mixed','return_type':'mixed'},'top':{'signature':'void | mixed','return_type':'mixed'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'unshift':{'signature':'mixed $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splfileinfo':{'name':'SplFileInfo','methods':{'__construct':{'signature':'string $file_name','return_type':''},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFileInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getLinkTarget':{'signature':'void | string','return_type':'string'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getRealPath':{'signature':'void | string','return_type':'string'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'openFile':{'signature':'[ string $open_mode = r [, bool $use_include_path = false [, resource $context = NULL]]] | SplFileObject','return_type':'SplFileObject'},'setFileClass':{'signature':'[ string $class_name] | void','return_type':'void'},'setInfoClass':{'signature':'[ string $class_name] | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},},},'splfileobject':{'name':'SplFileObject','constants':{'DROP_NEW_LINE':'1','READ_AHEAD':'2','SKIP_EMPTY':'4','READ_CSV':'8',},'methods':{'__construct':{'signature':'string $file_name','return_type':''},'current':{'signature':'void | string|array','return_type':'string|array'},'eof':{'signature':'void | bool','return_type':'bool'},'fflush':{'signature':'void | bool','return_type':'bool'},'fgetc':{'signature':'void | string','return_type':'string'},'fgetcsv':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | array','return_type':'array'},'fgets':{'signature':'void | string','return_type':'string'},'fgetss':{'signature':'[ string $allowable_tags] | string','return_type':'string'},'flock':{'signature':'int $operation [, int &$wouldblock] | bool','return_type':'bool'},'fpassthru':{'signature':'void | int','return_type':'int'},'fputcsv':{'signature':'array $fields [, string $delimiter = '','' [, string $enclosure = ''"'']] | int','return_type':'int'},'fscanf':{'signature':'string $format [, mixed &$...] | mixed','return_type':'mixed'},'fseek':{'signature':'int $offset [, int $whence = SEEK_SET] | int','return_type':'int'},'fstat':{'signature':'void | array','return_type':'array'},'ftell':{'signature':'void | int','return_type':'int'},'ftruncate':{'signature':'int $size | bool','return_type':'bool'},'fwrite':{'signature':'string $str [, int $length] | int','return_type':'int'},'getChildren':{'signature':'void | void','return_type':'void'},'getCsvControl':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | int','return_type':'int'},'getMaxLineLen':{'signature':'void | int','return_type':'int'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $line_pos | void','return_type':'void'},'setCsvControl':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMaxLineLen':{'signature':'int $max_len | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFileInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getLinkTarget':{'signature':'void | string','return_type':'string'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getRealPath':{'signature':'void | string','return_type':'string'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'openFile':{'signature':'[ string $open_mode = r [, bool $use_include_path = false [, resource $context = NULL]]] | SplFileObject','return_type':'SplFileObject'},'setFileClass':{'signature':'[ string $class_name] | void','return_type':'void'},'setInfoClass':{'signature':'[ string $class_name] | void','return_type':'void'},},},'splfixedarray':{'name':'SplFixedArray','methods':{'__construct':{'signature':'[ int $size = 0]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getSize':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'int $index | bool','return_type':'bool'},'offsetGet':{'signature':'int $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'int $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'int $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setSize':{'signature':'int $size | int','return_type':'int'},'toArray':{'signature':'void | array','return_type':'array'},'valid':{'signature':'void | bool','return_type':'bool'},'__wakeup':{'signature':'void | void','return_type':'void'},},'static_methods':{'fromArray':{'signature':'array $array [, bool $save_indexes = true] | SplFixedArray','return_type':'SplFixedArray'},},},'splheap':{'name':'SplHeap','methods':{'__construct':{'signature':'void','return_type':''},'compare':{'signature':'mixed $value1, mixed $value2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splmaxheap':{'name':'SplMaxHeap','methods':{'compare':{'signature':'mixed $value1, mixed $value2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splminheap':{'name':'SplMinHeap','methods':{'compare':{'signature':'mixed $value1, mixed $value2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splobjectstorage':{'name':'SplObjectStorage','methods':{'addAll':{'signature':'SplObjectStorage $storage | void','return_type':'void'},'attach':{'signature':'object $object [, mixed $data = NULL] | void','return_type':'void'},'contains':{'signature':'object $object | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | object','return_type':'object'},'detach':{'signature':'object $object | void','return_type':'void'},'getHash':{'signature':'object $object | string','return_type':'string'},'getInfo':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'object $object | bool','return_type':'bool'},'offsetGet':{'signature':'object $object | mixed','return_type':'mixed'},'offsetSet':{'signature':'object $object [, mixed $data = NULL] | void','return_type':'void'},'offsetUnset':{'signature':'object $object | void','return_type':'void'},'removeAll':{'signature':'SplObjectStorage $storage | void','return_type':'void'},'removeAllExcept':{'signature':'SplObjectStorage $storage | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setInfo':{'signature':'mixed $data | void','return_type':'void'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splpriorityqueue':{'name':'SplPriorityQueue','methods':{'__construct':{'signature':'void','return_type':''},'compare':{'signature':'mixed $priority1, mixed $priority2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value, mixed $priority | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setExtractFlags':{'signature':'int $flags | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splqueue':{'name':'SplQueue','methods':{'__construct':{'signature':'void','return_type':''},'dequeue':{'signature':'void | mixed','return_type':'mixed'},'enqueue':{'signature':'mixed $value | void','return_type':'void'},'setIteratorMode':{'signature':'int $mode | void','return_type':'void'},'bottom':{'signature':'void | mixed','return_type':'mixed'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getIteratorMode':{'signature':'void | int','return_type':'int'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'pop':{'signature':'void | mixed','return_type':'mixed'},'prev':{'signature':'void | void','return_type':'void'},'push':{'signature':'mixed $value | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'shift':{'signature':'void | mixed','return_type':'mixed'},'top':{'signature':'void | mixed','return_type':'mixed'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'unshift':{'signature':'mixed $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splstack':{'name':'SplStack','methods':{'__construct':{'signature':'void','return_type':''},'setIteratorMode':{'signature':'int $mode | void','return_type':'void'},'bottom':{'signature':'void | mixed','return_type':'mixed'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getIteratorMode':{'signature':'void | int','return_type':'int'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'pop':{'signature':'void | mixed','return_type':'mixed'},'prev':{'signature':'void | void','return_type':'void'},'push':{'signature':'mixed $value | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'shift':{'signature':'void | mixed','return_type':'mixed'},'top':{'signature':'void | mixed','return_type':'mixed'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'unshift':{'signature':'mixed $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'spltempfileobject':{'name':'SplTempFileObject','methods':{'__construct':{'signature':'string $filename [, string $open_mode = "r" [, bool $use_include_path = false [, resource $context]]]','return_type':''},'current':{'signature':'void | string|array','return_type':'string|array'},'eof':{'signature':'void | bool','return_type':'bool'},'fflush':{'signature':'void | bool','return_type':'bool'},'fgetc':{'signature':'void | string','return_type':'string'},'fgetcsv':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | array','return_type':'array'},'fgets':{'signature':'void | string','return_type':'string'},'fgetss':{'signature':'[ string $allowable_tags] | string','return_type':'string'},'flock':{'signature':'int $operation [, int &$wouldblock] | bool','return_type':'bool'},'fpassthru':{'signature':'void | int','return_type':'int'},'fputcsv':{'signature':'array $fields [, string $delimiter = '','' [, string $enclosure = ''"'']] | int','return_type':'int'},'fscanf':{'signature':'string $format [, mixed &$...] | mixed','return_type':'mixed'},'fseek':{'signature':'int $offset [, int $whence = SEEK_SET] | int','return_type':'int'},'fstat':{'signature':'void | array','return_type':'array'},'ftell':{'signature':'void | int','return_type':'int'},'ftruncate':{'signature':'int $size | bool','return_type':'bool'},'fwrite':{'signature':'string $str [, int $length] | int','return_type':'int'},'getChildren':{'signature':'void | void','return_type':'void'},'getCsvControl':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | int','return_type':'int'},'getMaxLineLen':{'signature':'void | int','return_type':'int'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $line_pos | void','return_type':'void'},'setCsvControl':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMaxLineLen':{'signature':'int $max_len | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'underflowexception':{'name':'UnderflowException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'unexpectedvalueexception':{'name':'UnexpectedValueException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},} 2816a6878375SBram Moolenaarlet php_builtin['classes']['predefined_interfaces_and_classes']={'closure':{'name':'Closure','methods':{'__construct':{'signature':'void','return_type':''},'bindTo':{'signature':'object $newthis [, mixed $newscope = ''static''] | Closure','return_type':'Closure'},},'static_methods':{'bind':{'signature':'Closure $closure, object $newthis [, mixed $newscope = ''static''] | Closure','return_type':'Closure'},},},'generator':{'name':'Generator','methods':{'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'send':{'signature':'mixed $value | mixed','return_type':'mixed'},'throw':{'signature':'Exception $exception | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},'__wakeup':{'signature':'void | void','return_type':'void'},},},} 2817a6878375SBram Moolenaarlet php_builtin['classes']['curl']={'curlfile':{'name':'CURLFile','properties': {'name':{'initializer':'','type':''},'mime':{'initializer':'','type':''},'postname':{'initializer':'','type':''},},'methods':{'__construct':{'signature':'string $filename [, string $mimetype [, string $postname]]','return_type':''},'getFilename':{'signature':'void | string','return_type':'string'},'getMimeType':{'signature':'void | string','return_type':'string'},'getPostFilename':{'signature':'void | string','return_type':'string'},'setMimeType':{'signature':'string $mime | void','return_type':'void'},'setPostFilename':{'signature':'string $postname | void','return_type':'void'},'__wakeup':{'signature':'void | void','return_type':'void'},},},} 2818a6878375SBram Moolenaarlet php_builtin['classes']['date_time']={'dateinterval':{'name':'DateInterval','properties': {'y':{'initializer':'','type':'integer'},'m':{'initializer':'','type':'integer'},'d':{'initializer':'','type':'integer'},'h':{'initializer':'','type':'integer'},'i':{'initializer':'','type':'integer'},'s':{'initializer':'','type':'integer'},'invert':{'initializer':'','type':'integer'},'days':{'initializer':'','type':'mixed'},},'methods':{'__construct':{'signature':'string $interval_spec','return_type':''},'format':{'signature':'string $format | string','return_type':'string'},},'static_methods':{'createFromDateString':{'signature':'string $time | DateInterval','return_type':'DateInterval'},},},'dateperiod':{'name':'DatePeriod','constants':{'EXCLUDE_START_DATE':'1',},'methods':{'__construct':{'signature':'string $isostr [, int $options]','return_type':''},},},'datetime':{'name':'DateTime','constants':{'ATOM':'"Y-m-d\TH:i:sP"','COOKIE':'"l, d-M-y H:i:s T"','ISO8601':'"Y-m-d\TH:i:sO"','RFC822':'"D, d M y H:i:s O"','RFC850':'"l, d-M-y H:i:s T"','RFC1036':'"D, d M y H:i:s O"','RFC1123':'"D, d M Y H:i:s O"','RFC2822':'"D, d M Y H:i:s O"','RFC3339':'"Y-m-d\TH:i:sP"','RSS':'"D, d M Y H:i:s O"','W3C':'"Y-m-d\TH:i:sP"',},'methods':{'__construct':{'signature':'[ string $time = "now" [, DateTimeZone $timezone = NULL]]','return_type':''},'add':{'signature':'DateInterval $interval | DateTime','return_type':'DateTime'},'modify':{'signature':'string $modify | DateTime','return_type':'DateTime'},'setDate':{'signature':'int $year, int $month, int $day | DateTime','return_type':'DateTime'},'setISODate':{'signature':'int $year, int $week [, int $day = 1] | DateTime','return_type':'DateTime'},'setTime':{'signature':'int $hour, int $minute [, int $second = 0] | DateTime','return_type':'DateTime'},'setTimestamp':{'signature':'int $unixtimestamp | DateTime','return_type':'DateTime'},'setTimezone':{'signature':'DateTimeZone $timezone | DateTime','return_type':'DateTime'},'sub':{'signature':'DateInterval $interval | DateTime','return_type':'DateTime'},'diff':{'signature':'DateTimeInterface $datetime2 [, bool $absolute = false] | DateInterval','return_type':'DateInterval'},'format':{'signature':'string $format | string','return_type':'string'},'getOffset':{'signature':'void | int','return_type':'int'},'getTimestamp':{'signature':'void | int','return_type':'int'},'getTimezone':{'signature':'void | DateTimeZone','return_type':'DateTimeZone'},'__wakeup':{'signature':'void','return_type':''},},'static_methods':{'createFromFormat':{'signature':'string $format, string $time [, DateTimeZone $timezone] | DateTime','return_type':'DateTime'},'getLastErrors':{'signature':'void | array','return_type':'array'},'__set_state':{'signature':'array $array | DateTime','return_type':'DateTime'},},},'datetimeimmutable':{'name':'DateTimeImmutable','methods':{'__construct':{'signature':'[ string $time = "now" [, DateTimeZone $timezone = NULL]]','return_type':''},'add':{'signature':'DateInterval $interval | DateTimeImmutable','return_type':'DateTimeImmutable'},'modify':{'signature':'string $modify | DateTimeImmutable','return_type':'DateTimeImmutable'},'setDate':{'signature':'int $year, int $month, int $day | DateTimeImmutable','return_type':'DateTimeImmutable'},'setISODate':{'signature':'int $year, int $week [, int $day = 1] | DateTimeImmutable','return_type':'DateTimeImmutable'},'setTime':{'signature':'int $hour, int $minute [, int $second = 0] | DateTimeImmutable','return_type':'DateTimeImmutable'},'setTimestamp':{'signature':'int $unixtimestamp | DateTimeImmutable','return_type':'DateTimeImmutable'},'setTimezone':{'signature':'DateTimeZone $timezone | DateTimeImmutable','return_type':'DateTimeImmutable'},'sub':{'signature':'DateInterval $interval | DateTimeImmutable','return_type':'DateTimeImmutable'},'diff':{'signature':'DateTimeInterface $datetime2 [, bool $absolute = false] | DateInterval','return_type':'DateInterval'},'format':{'signature':'string $format | string','return_type':'string'},'getOffset':{'signature':'void | int','return_type':'int'},'getTimestamp':{'signature':'void | int','return_type':'int'},'getTimezone':{'signature':'void | DateTimeZone','return_type':'DateTimeZone'},'__wakeup':{'signature':'void','return_type':''},},'static_methods':{'createFromFormat':{'signature':'string $format, string $time [, DateTimeZone $timezone] | DateTimeImmutable','return_type':'DateTimeImmutable'},'getLastErrors':{'signature':'void | array','return_type':'array'},'__set_state':{'signature':'array $array | DateTimeImmutable','return_type':'DateTimeImmutable'},},},'datetimezone':{'name':'DateTimeZone','constants':{'AFRICA':'1','AMERICA':'2','ANTARCTICA':'4','ARCTIC':'8','ASIA':'16','ATLANTIC':'32','AUSTRALIA':'64','EUROPE':'128','INDIAN':'256','PACIFIC':'512','UTC':'1024','ALL':'2047','ALL_WITH_BC':'4095','PER_COUNTRY':'4096',},'methods':{'__construct':{'signature':'string $timezone','return_type':''},'getLocation':{'signature':'void | array','return_type':'array'},'getName':{'signature':'void | string','return_type':'string'},'getOffset':{'signature':'DateTime $datetime | int','return_type':'int'},'getTransitions':{'signature':'[ int $timestamp_begin [, int $timestamp_end]] | array','return_type':'array'},},'static_methods':{'listAbbreviations':{'signature':'void | array','return_type':'array'},'listIdentifiers':{'signature':'[ int $what = DateTimeZone::ALL [, string $country = NULL]] | array','return_type':'array'},},},} 2819a6878375SBram Moolenaarlet php_builtin['classes']['directories']={'directory':{'name':'Directory','properties': {'path':{'initializer':'','type':'string'},'handle':{'initializer':'','type':'resource'},},'methods':{'close':{'signature':'[ resource $dir_handle] | void','return_type':'void'},'read':{'signature':'[ resource $dir_handle] | string','return_type':'string'},'rewind':{'signature':'[ resource $dir_handle] | void','return_type':'void'},},},} 2820a6878375SBram Moolenaarlet php_builtin['classes']['dom']={'domattr':{'name':'DOMAttr','properties': {'name':{'initializer':'','type':'string'},'ownerElement':{'initializer':'','type':'DOMElement'},'schemaTypeInfo':{'initializer':'','type':'bool'},'specified':{'initializer':'','type':'bool'},'value':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'string $name [, string $value]','return_type':''},'isId':{'signature':'void | bool','return_type':'bool'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domcdatasection':{'name':'DOMCdataSection','methods':{'__construct':{'signature':'string $value','return_type':''},'isWhitespaceInElementContent':{'signature':'void | bool','return_type':'bool'},'splitText':{'signature':'int $offset | DOMText','return_type':'DOMText'},},},'domcharacterdata':{'name':'DOMCharacterData','properties': {'data':{'initializer':'','type':'string'},'length':{'initializer':'','type':'int'},},'methods':{'appendData':{'signature':'string $data | void','return_type':'void'},'deleteData':{'signature':'int $offset, int $count | void','return_type':'void'},'insertData':{'signature':'int $offset, string $data | void','return_type':'void'},'replaceData':{'signature':'int $offset, int $count, string $data | void','return_type':'void'},'substringData':{'signature':'int $offset, int $count | string','return_type':'string'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domcomment':{'name':'DOMComment','methods':{'__construct':{'signature':'[ string $value]','return_type':''},'appendData':{'signature':'string $data | void','return_type':'void'},'deleteData':{'signature':'int $offset, int $count | void','return_type':'void'},'insertData':{'signature':'int $offset, string $data | void','return_type':'void'},'replaceData':{'signature':'int $offset, int $count, string $data | void','return_type':'void'},'substringData':{'signature':'int $offset, int $count | string','return_type':'string'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domdocument':{'name':'DOMDocument','properties': {'actualEncoding':{'initializer':'','type':'string'},'config':{'initializer':'','type':'DOMConfiguration'},'doctype':{'initializer':'','type':'DOMDocumentType'},'documentElement':{'initializer':'','type':'DOMElement'},'documentURI':{'initializer':'','type':'string'},'encoding':{'initializer':'','type':'string'},'formatOutput':{'initializer':'','type':'bool'},'implementation':{'initializer':'','type':'DOMImplementation'},'preserveWhiteSpace':{'initializer':'true','type':'bool'},'recover':{'initializer':'','type':'bool'},'resolveExternals':{'initializer':'','type':'bool'},'standalone':{'initializer':'','type':'bool'},'strictErrorChecking':{'initializer':'true','type':'bool'},'substituteEntities':{'initializer':'','type':'bool'},'validateOnParse':{'initializer':'false','type':'bool'},'version':{'initializer':'','type':'string'},'xmlEncoding':{'initializer':'','type':'string'},'xmlStandalone':{'initializer':'','type':'bool'},'xmlVersion':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'[ string $version [, string $encoding]]','return_type':''},'createAttribute':{'signature':'string $name | DOMAttr','return_type':'DOMAttr'},'createAttributeNS':{'signature':'string $namespaceURI, string $qualifiedName | DOMAttr','return_type':'DOMAttr'},'createCDATASection':{'signature':'string $data | DOMCDATASection','return_type':'DOMCDATASection'},'createComment':{'signature':'string $data | DOMComment','return_type':'DOMComment'},'createDocumentFragment':{'signature':'void | DOMDocumentFragment','return_type':'DOMDocumentFragment'},'createElement':{'signature':'string $name [, string $value] | DOMElement','return_type':'DOMElement'},'createElementNS':{'signature':'string $namespaceURI, string $qualifiedName [, string $value] | DOMElement','return_type':'DOMElement'},'createEntityReference':{'signature':'string $name | DOMEntityReference','return_type':'DOMEntityReference'},'createProcessingInstruction':{'signature':'string $target [, string $data] | DOMProcessingInstruction','return_type':'DOMProcessingInstruction'},'createTextNode':{'signature':'string $content | DOMText','return_type':'DOMText'},'getElementById':{'signature':'string $elementId | DOMElement','return_type':'DOMElement'},'getElementsByTagName':{'signature':'string $name | DOMNodeList','return_type':'DOMNodeList'},'getElementsByTagNameNS':{'signature':'string $namespaceURI, string $localName | DOMNodeList','return_type':'DOMNodeList'},'importNode':{'signature':'DOMNode $importedNode [, bool $deep] | DOMNode','return_type':'DOMNode'},'load':{'signature':'string $filename [, int $options = 0] | mixed','return_type':'mixed'},'loadHTML':{'signature':'string $source [, int $options = 0] | bool','return_type':'bool'},'loadHTMLFile':{'signature':'string $filename [, int $options = 0] | bool','return_type':'bool'},'loadXML':{'signature':'string $source [, int $options = 0] | mixed','return_type':'mixed'},'normalizeDocument':{'signature':'void | void','return_type':'void'},'registerNodeClass':{'signature':'string $baseclass, string $extendedclass | bool','return_type':'bool'},'relaxNGValidate':{'signature':'string $filename | bool','return_type':'bool'},'relaxNGValidateSource':{'signature':'string $source | bool','return_type':'bool'},'save':{'signature':'string $filename [, int $options] | int','return_type':'int'},'saveHTML':{'signature':'[ DOMNode $node = NULL] | string','return_type':'string'},'saveHTMLFile':{'signature':'string $filename | int','return_type':'int'},'saveXML':{'signature':'[ DOMNode $node [, int $options]] | string','return_type':'string'},'schemaValidate':{'signature':'string $filename [, int $flags] | bool','return_type':'bool'},'schemaValidateSource':{'signature':'string $source [, int $flags] | bool','return_type':'bool'},'validate':{'signature':'void | bool','return_type':'bool'},'xinclude':{'signature':'[ int $options] | int','return_type':'int'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domdocumentfragment':{'name':'DOMDocumentFragment','methods':{'appendXML':{'signature':'string $data | bool','return_type':'bool'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domdocumenttype':{'name':'DOMDocumentType','properties': {'publicId':{'initializer':'','type':'string'},'systemId':{'initializer':'','type':'string'},'name':{'initializer':'','type':'string'},'entities':{'initializer':'','type':'DOMNamedNodeMap'},'notations':{'initializer':'','type':'DOMNamedNodeMap'},'internalSubset':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domelement':{'name':'DOMElement','properties': {'schemaTypeInfo':{'initializer':'','type':'bool'},'tagName':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'string $name [, string $value [, string $namespaceURI]]','return_type':''},'getAttribute':{'signature':'string $name | string','return_type':'string'},'getAttributeNode':{'signature':'string $name | DOMAttr','return_type':'DOMAttr'},'getAttributeNodeNS':{'signature':'string $namespaceURI, string $localName | DOMAttr','return_type':'DOMAttr'},'getAttributeNS':{'signature':'string $namespaceURI, string $localName | string','return_type':'string'},'getElementsByTagName':{'signature':'string $name | DOMNodeList','return_type':'DOMNodeList'},'getElementsByTagNameNS':{'signature':'string $namespaceURI, string $localName | DOMNodeList','return_type':'DOMNodeList'},'hasAttribute':{'signature':'string $name | bool','return_type':'bool'},'hasAttributeNS':{'signature':'string $namespaceURI, string $localName | bool','return_type':'bool'},'removeAttribute':{'signature':'string $name | bool','return_type':'bool'},'removeAttributeNode':{'signature':'DOMAttr $oldnode | bool','return_type':'bool'},'removeAttributeNS':{'signature':'string $namespaceURI, string $localName | bool','return_type':'bool'},'setAttribute':{'signature':'string $name, string $value | DOMAttr','return_type':'DOMAttr'},'setAttributeNode':{'signature':'DOMAttr $attr | DOMAttr','return_type':'DOMAttr'},'setAttributeNodeNS':{'signature':'DOMAttr $attr | DOMAttr','return_type':'DOMAttr'},'setAttributeNS':{'signature':'string $namespaceURI, string $qualifiedName, string $value | void','return_type':'void'},'setIdAttribute':{'signature':'string $name, bool $isId | void','return_type':'void'},'setIdAttributeNode':{'signature':'DOMAttr $attr, bool $isId | void','return_type':'void'},'setIdAttributeNS':{'signature':'string $namespaceURI, string $localName, bool $isId | void','return_type':'void'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domentity':{'name':'DOMEntity','properties': {'publicId':{'initializer':'','type':'string'},'systemId':{'initializer':'','type':'string'},'notationName':{'initializer':'','type':'string'},'actualEncoding':{'initializer':'','type':'string'},'encoding':{'initializer':'','type':'string'},'version':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domentityreference':{'name':'DOMEntityReference','methods':{'__construct':{'signature':'string $name','return_type':''},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domexception':{'name':'DOMException','properties': {'code':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'domimplementation':{'name':'DOMImplementation','methods':{'__construct':{'signature':'void','return_type':''},'createDocument':{'signature':'[ string $namespaceURI = NULL [, string $qualifiedName = NULL [, DOMDocumentType $doctype = NULL]]] | DOMDocument','return_type':'DOMDocument'},'createDocumentType':{'signature':'[ string $qualifiedName = NULL [, string $publicId = NULL [, string $systemId = NULL]]] | DOMDocumentType','return_type':'DOMDocumentType'},'hasFeature':{'signature':'string $feature, string $version | bool','return_type':'bool'},},},'domnamednodemap':{'name':'DOMNamedNodeMap','properties': {'length':{'initializer':'','type':'int'},},'methods':{'getNamedItem':{'signature':'string $name | DOMNode','return_type':'DOMNode'},'getNamedItemNS':{'signature':'string $namespaceURI, string $localName | DOMNode','return_type':'DOMNode'},'item':{'signature':'int $index | DOMNode','return_type':'DOMNode'},},},'domnode':{'name':'DOMNode','properties': {'nodeName':{'initializer':'','type':'string'},'nodeValue':{'initializer':'','type':'string'},'nodeType':{'initializer':'','type':'int'},'parentNode':{'initializer':'','type':'DOMNode'},'childNodes':{'initializer':'','type':'DOMNodeList'},'firstChild':{'initializer':'','type':'DOMNode'},'lastChild':{'initializer':'','type':'DOMNode'},'previousSibling':{'initializer':'','type':'DOMNode'},'nextSibling':{'initializer':'','type':'DOMNode'},'attributes':{'initializer':'','type':'DOMNamedNodeMap'},'ownerDocument':{'initializer':'','type':'DOMDocument'},'namespaceURI':{'initializer':'','type':'string'},'prefix':{'initializer':'','type':'string'},'localName':{'initializer':'','type':'string'},'baseURI':{'initializer':'','type':'string'},'textContent':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domnodelist':{'name':'DOMNodeList','properties': {'length':{'initializer':'','type':'int'},},'methods':{'item':{'signature':'int $index | DOMNode','return_type':'DOMNode'},},},'domnotation':{'name':'DOMNotation','properties': {'publicId':{'initializer':'','type':'string'},'systemId':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domprocessinginstruction':{'name':'DOMProcessingInstruction','properties': {'target':{'initializer':'','type':'string'},'data':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'string $name [, string $value]','return_type':''},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domtext':{'name':'DOMText','properties': {'wholeText':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'[ string $value]','return_type':''},'isWhitespaceInElementContent':{'signature':'void | bool','return_type':'bool'},'splitText':{'signature':'int $offset | DOMText','return_type':'DOMText'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domxpath':{'name':'DOMXPath','properties': {'document':{'initializer':'','type':'DOMDocument'},},'methods':{'__construct':{'signature':'DOMDocument $doc','return_type':''},'evaluate':{'signature':'string $expression [, DOMNode $contextnode [, bool $registerNodeNS = true]] | mixed','return_type':'mixed'},'query':{'signature':'string $expression [, DOMNode $contextnode [, bool $registerNodeNS = true]] | DOMNodeList','return_type':'DOMNodeList'},'registerNamespace':{'signature':'string $prefix, string $namespaceURI | bool','return_type':'bool'},'registerPhpFunctions':{'signature':'[ mixed $restrict] | void','return_type':'void'},},},} 2821a6878375SBram Moolenaarlet php_builtin['classes']['predefined_exceptions']={'errorexception':{'name':'ErrorException','properties': {'severity':{'initializer':'','type':'int'},'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'__construct':{'signature':'[ string $message = "" [, int $code = 0 [, int $severity = 1 [, string $filename = __FILE__ [, int $lineno = __LINE__ [, Exception $previous = NULL]]]]]]','return_type':''},'getSeverity':{'signature':'void | int','return_type':'int'},'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'exception':{'name':'Exception','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'__construct':{'signature':'[ string $message = "" [, int $code = 0 [, Exception $previous = NULL]]]','return_type':''},'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},} 2822a6878375SBram Moolenaarlet php_builtin['classes']['libxml']={'libxmlerror':{'name':'libXMLError','properties': {'level':{'initializer':'','type':'int'},'code':{'initializer':'','type':'int'},'column':{'initializer':'','type':'int'},'message':{'initializer':'','type':'string'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},},} 2823a6878375SBram Moolenaarlet php_builtin['classes']['mysqli']={'mysqli_driver':{'name':'mysqli_driver','properties': {'client_info':{'initializer':'','type':'string'},'client_version':{'initializer':'','type':'string'},'driver_version':{'initializer':'','type':'string'},'embedded':{'initializer':'','type':'string'},'reconnect':{'initializer':'','type':'bool'},'report_mode':{'initializer':'','type':'int'},},'methods':{'embedded_server_end':{'signature':'void | void','return_type':'void'},'embedded_server_start':{'signature':'bool $start, array $arguments, array $groups | bool','return_type':'bool'},},},'mysqli_result':{'name':'mysqli_result','properties': {'current_field':{'initializer':'','type':'int'},'field_count':{'initializer':'','type':'int'},'lengths':{'initializer':'','type':'array'},'num_rows':{'initializer':'','type':'int'},},'methods':{'data_seek':{'signature':'int $offset | bool','return_type':'bool'},'fetch_all':{'signature':'[ int $resulttype = MYSQLI_NUM] | mixed','return_type':'mixed'},'fetch_array':{'signature':'[ int $resulttype = MYSQLI_BOTH] | mixed','return_type':'mixed'},'fetch_assoc':{'signature':'void | array','return_type':'array'},'fetch_field_direct':{'signature':'int $fieldnr | object','return_type':'object'},'fetch_field':{'signature':'void | object','return_type':'object'},'fetch_fields':{'signature':'void | array','return_type':'array'},'fetch_object':{'signature':'[ string $class_name [, array $params]] | object','return_type':'object'},'fetch_row':{'signature':'void | mixed','return_type':'mixed'},'field_seek':{'signature':'int $fieldnr | bool','return_type':'bool'},'free':{'signature':'void | void','return_type':'void'},},},'mysqli_sql_exception':{'name':'mysqli_sql_exception','properties': {'sqlstate':{'initializer':'','type':'string'},'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},},'mysqli_stmt':{'name':'mysqli_stmt','properties': {'affected_rows':{'initializer':'','type':'int'},'errno':{'initializer':'','type':'int'},'error_list':{'initializer':'','type':'array'},'error':{'initializer':'','type':'string'},'field_count':{'initializer':'','type':'int'},'insert_id':{'initializer':'','type':'int'},'num_rows':{'initializer':'','type':'int'},'param_count':{'initializer':'','type':'int'},'sqlstate':{'initializer':'','type':'string'},},'methods':{'attr_get':{'signature':'int $attr | int','return_type':'int'},'attr_set':{'signature':'int $attr, int $mode | bool','return_type':'bool'},'bind_param':{'signature':'string $types, mixed &$var1 [, mixed &$...] | bool','return_type':'bool'},'bind_result':{'signature':'mixed &$var1 [, mixed &$...] | bool','return_type':'bool'},'close':{'signature':'void | bool','return_type':'bool'},'data_seek':{'signature':'int $offset | void','return_type':'void'},'execute':{'signature':'void | bool','return_type':'bool'},'fetch':{'signature':'void | bool','return_type':'bool'},'free_result':{'signature':'void | void','return_type':'void'},'get_result':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'get_warnings':{'signature':'mysqli_stmt $stmt | object','return_type':'object'},'prepare':{'signature':'string $query | mixed','return_type':'mixed'},'reset':{'signature':'void | bool','return_type':'bool'},'result_metadata':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'send_long_data':{'signature':'int $param_nr, string $data | bool','return_type':'bool'},'store_result':{'signature':'void | bool','return_type':'bool'},},},'mysqli_warning':{'name':'mysqli_warning','properties': {'message':{'initializer':'','type':''},'sqlstate':{'initializer':'','type':''},'errno':{'initializer':'','type':''},},'methods':{'__construct':{'signature':'void','return_type':''},'next':{'signature':'void | void','return_type':'void'},},},'mysqli':{'name':'mysqli','properties': {'affected_rows':{'initializer':'','type':'int'},'client_info':{'initializer':'','type':'string'},'client_version':{'initializer':'','type':'int'},'connect_errno':{'initializer':'','type':'string'},'connect_error':{'initializer':'','type':'string'},'errno':{'initializer':'','type':'int'},'error_list':{'initializer':'','type':'array'},'error':{'initializer':'','type':'string'},'field_count':{'initializer':'','type':'int'},'host_info':{'initializer':'','type':'string'},'protocol_version':{'initializer':'','type':'string'},'server_info':{'initializer':'','type':'string'},'server_version':{'initializer':'','type':'int'},'info':{'initializer':'','type':'string'},'insert_id':{'initializer':'','type':'mixed'},'sqlstate':{'initializer':'','type':'string'},'thread_id':{'initializer':'','type':'int'},'warning_count':{'initializer':'','type':'int'},},'methods':{'__construct':{'signature':'[ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = ini_get("mysqli.default_socket")]]]]]]','return_type':''},'autocommit':{'signature':'bool $mode | bool','return_type':'bool'},'change_user':{'signature':'string $user, string $password, string $database | bool','return_type':'bool'},'character_set_name':{'signature':'void | string','return_type':'string'},'close':{'signature':'void | bool','return_type':'bool'},'commit':{'signature':'[ int $flags [, string $name]] | bool','return_type':'bool'},'debug':{'signature':'string $message | bool','return_type':'bool'},'dump_debug_info':{'signature':'void | bool','return_type':'bool'},'get_charset':{'signature':'void | object','return_type':'object'},'get_client_info':{'signature':'void | string','return_type':'string'},'get_connection_stats':{'signature':'void | bool','return_type':'bool'},'get_warnings':{'signature':'void | mysqli_warning','return_type':'mysqli_warning'},'init':{'signature':'void | mysqli','return_type':'mysqli'},'kill':{'signature':'int $processid | bool','return_type':'bool'},'more_results':{'signature':'void | bool','return_type':'bool'},'multi_query':{'signature':'string $query | bool','return_type':'bool'},'next_result':{'signature':'void | bool','return_type':'bool'},'options':{'signature':'int $option, mixed $value | bool','return_type':'bool'},'ping':{'signature':'void | bool','return_type':'bool'},'prepare':{'signature':'string $query | mysqli_stmt','return_type':'mysqli_stmt'},'query':{'signature':'string $query [, int $resultmode = MYSQLI_STORE_RESULT] | mixed','return_type':'mixed'},'real_connect':{'signature':'[ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket [, int $flags]]]]]]] | bool','return_type':'bool'},'escape_string':{'signature':'string $escapestr | string','return_type':'string'},'real_query':{'signature':'string $query | bool','return_type':'bool'},'reap_async_query':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'refresh':{'signature':'int $options | bool','return_type':'bool'},'rollback':{'signature':'[ int $flags [, string $name]] | bool','return_type':'bool'},'rpl_query_type':{'signature':'string $query | int','return_type':'int'},'select_db':{'signature':'string $dbname | bool','return_type':'bool'},'send_query':{'signature':'string $query | bool','return_type':'bool'},'set_charset':{'signature':'string $charset | bool','return_type':'bool'},'set_local_infile_handler':{'signature':'mysqli $link, callable $read_func | bool','return_type':'bool'},'ssl_set':{'signature':'string $key, string $cert, string $ca, string $capath, string $cipher | bool','return_type':'bool'},'stat':{'signature':'void | string','return_type':'string'},'stmt_init':{'signature':'void | mysqli_stmt','return_type':'mysqli_stmt'},'store_result':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'use_result':{'signature':'void | mysqli_result','return_type':'mysqli_result'},},'static_methods':{'poll':{'signature':'array &$read, array &$error, array &$reject, int $sec [, int $usec] | int','return_type':'int'},},},} 2824a6878375SBram Moolenaarlet php_builtin['classes']['pdo']={'pdo':{'name':'PDO','constants':{'FETCH_ORI_ABS':'','ATTR_PERSISTENT':'','CLASS_CONSTANT':'','ATTR_DEFAULT_FETCH_MODE':'','FETCH_PROPS_LATE':'','FETCH_KEY_PAIR':'','FB_ATTR_DATE_FORMAT':'','FB_ATTR_TIME_FORMAT':'','FB_ATTR_TIMESTAMP_FORMAT':'','MYSQL_ATTR_READ_DEFAULT_FILE':'','MYSQL_ATTR_READ_DEFAULT_GROUP':'','ATTR_AUTOCOMMIT':'','FOURD_ATTR_CHARSET':'','FOURD_ATTR_PREFERRED_IMAGE_TYPES':'','PARAM_LOB':'','PARAM_BOOL':'','PARAM_NULL':'','PARAM_INT':'','PARAM_STR':'','PARAM_STMT':'','PARAM_INPUT_OUTPUT':'','FETCH_LAZY':'','FETCH_ASSOC':'','FETCH_NAMED':'','FETCH_NUM':'','FETCH_BOTH':'','FETCH_OBJ':'','FETCH_BOUND':'','FETCH_COLUMN':'','FETCH_CLASS':'','FETCH_INTO':'','FETCH_FUNC':'','FETCH_GROUP':'','FETCH_UNIQUE':'','FETCH_CLASSTYPE':'','FETCH_SERIALIZE':'','ATTR_PREFETCH':'','ATTR_TIMEOUT':'','ATTR_ERRMODE':'','ATTR_SERVER_VERSION':'','ATTR_CLIENT_VERSION':'','ATTR_SERVER_INFO':'','ATTR_CONNECTION_STATUS':'','ATTR_CASE':'','ATTR_CURSOR_NAME':'','ATTR_CURSOR':'','CURSOR_FWDONLY':'','CURSOR_SCROLL':'','ATTR_DRIVER_NAME':'','ATTR_ORACLE_NULLS':'','ATTR_STATEMENT_CLASS':'','ATTR_FETCH_CATALOG_NAMES':'','ATTR_FETCH_TABLE_NAMES':'','ATTR_STRINGIFY_FETCHES':'','ATTR_MAX_COLUMN_LEN':'','ATTR_EMULATE_PREPARES':'','ERRMODE_SILENT':'','ERRMODE_WARNING':'','ERRMODE_EXCEPTION':'','CASE_NATURAL':'','CASE_LOWER':'','CASE_UPPER':'','NULL_NATURAL':'','NULL_EMPTY_STRING':'','NULL_TO_STRING':'','FETCH_ORI_NEXT':'','FETCH_ORI_PRIOR':'','FETCH_ORI_FIRST':'','FETCH_ORI_LAST':'','FETCH_ORI_REL':'','ERR_NONE':'','PARAM_EVT_ALLOC':'','PARAM_EVT_FREE':'','PARAM_EVT_EXEC_PRE':'','PARAM_EVT_EXEC_POST':'','PARAM_EVT_FETCH_PRE':'','PARAM_EVT_FETCH_POST':'','PARAM_EVT_NORMALIZE':'','MYSQL_ATTR_INIT_COMMAND':'','MYSQL_ATTR_USE_BUFFERED_QUERY':'','MYSQL_ATTR_LOCAL_INFILE':'','MYSQL_ATTR_MAX_BUFFER_SIZE':'','MYSQL_ATTR_DIRECT_QUERY':'','MYSQL_ATTR_FOUND_ROWS':'','MYSQL_ATTR_IGNORE_SPACE':'','MYSQL_ATTR_COMPRESS':'','MYSQL_ATTR_SSL_CA':'','MYSQL_ATTR_SSL_CAPATH':'','MYSQL_ATTR_SSL_CERT':'','MYSQL_ATTR_SSL_CIPHER':'','MYSQL_ATTR_SSL_KEY':'','SQLSRV_TXN_READ_UNCOMMITTED':'','SQLSRV_TXN_READ_COMMITTED':'','SQLSRV_TXN_REPEATABLE_READ':'','SQLSRV_TXN_SNAPSHOT':'','SQLSRV_TXN_SERIALIZABLE':'','SQLSRV_ENCODING_BINARY':'','SQLSRV_ENCODING_SYSTEM':'','SQLSRV_ENCODING_UTF8':'','SQLSRV_ENCODING_DEFAULT':'','SQLSRV_ATTR_QUERY_TIMEOUT':'','SQLSRV_ATTR_DIRECT_QUERY':'',},'methods':{'__construct':{'signature':'string $dsn [, string $username [, string $password [, array $driver_options]]]','return_type':''},'beginTransaction':{'signature':'void | bool','return_type':'bool'},'commit':{'signature':'void | bool','return_type':'bool'},'errorCode':{'signature':'void | mixed','return_type':'mixed'},'errorInfo':{'signature':'void | array','return_type':'array'},'exec':{'signature':'string $statement | int','return_type':'int'},'getAttribute':{'signature':'int $attribute | mixed','return_type':'mixed'},'inTransaction':{'signature':'void | bool','return_type':'bool'},'lastInsertId':{'signature':'[ string $name = NULL] | string','return_type':'string'},'prepare':{'signature':'string $statement [, array $driver_options = array()] | PDOStatement','return_type':'PDOStatement'},'query':{'signature':'string $statement | PDOStatement','return_type':'PDOStatement'},'quote':{'signature':'string $string [, int $parameter_type = PDO::PARAM_STR] | string','return_type':'string'},'rollBack':{'signature':'void | bool','return_type':'bool'},'setAttribute':{'signature':'int $attribute, mixed $value | bool','return_type':'bool'},},'static_methods':{'getAvailableDrivers':{'signature':'void | array','return_type':'array'},},},'pdoexception':{'name':'PDOException','properties': {'errorInfo':{'initializer':'','type':'array'},'code':{'initializer':'','type':'int'},'message':{'initializer':'','type':'string'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'pdostatement':{'name':'PDOStatement','properties': {'queryString':{'initializer':'','type':'string'},},'methods':{'bindColumn':{'signature':'mixed $column, mixed &$param [, int $type [, int $maxlen [, mixed $driverdata]]] | bool','return_type':'bool'},'bindParam':{'signature':'mixed $parameter, mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options]]] | bool','return_type':'bool'},'bindValue':{'signature':'mixed $parameter, mixed $value [, int $data_type = PDO::PARAM_STR] | bool','return_type':'bool'},'closeCursor':{'signature':'void | bool','return_type':'bool'},'columnCount':{'signature':'void | int','return_type':'int'},'debugDumpParams':{'signature':'void | void','return_type':'void'},'errorCode':{'signature':'void | string','return_type':'string'},'errorInfo':{'signature':'void | array','return_type':'array'},'execute':{'signature':'[ array $input_parameters] | bool','return_type':'bool'},'fetch':{'signature':'[ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0]]] | mixed','return_type':'mixed'},'fetchAll':{'signature':'[ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array()]]] | array','return_type':'array'},'fetchColumn':{'signature':'[ int $column_number = 0] | string','return_type':'string'},'fetchObject':{'signature':'[ string $class_name = "stdClass" [, array $ctor_args]] | mixed','return_type':'mixed'},'getAttribute':{'signature':'int $attribute | mixed','return_type':'mixed'},'getColumnMeta':{'signature':'int $column | array','return_type':'array'},'nextRowset':{'signature':'void | bool','return_type':'bool'},'rowCount':{'signature':'void | int','return_type':'int'},'setAttribute':{'signature':'int $attribute, mixed $value | bool','return_type':'bool'},'setFetchMode':{'signature':'int $mode | bool','return_type':'bool'},},},} 2825a6878375SBram Moolenaarlet php_builtin['classes']['phar']={'phar':{'name':'Phar','methods':{'addEmptyDir':{'signature':'string $dirname | void','return_type':'void'},'addFile':{'signature':'string $file [, string $localname] | void','return_type':'void'},'addFromString':{'signature':'string $localname, string $contents | void','return_type':'void'},'buildFromDirectory':{'signature':'string $base_dir [, string $regex] | array','return_type':'array'},'buildFromIterator':{'signature':'Iterator $iter [, string $base_directory] | array','return_type':'array'},'compress':{'signature':'int $compression [, string $extension] | object','return_type':'object'},'compressAllFilesBZIP2':{'signature':'void | bool','return_type':'bool'},'compressAllFilesGZ':{'signature':'void | bool','return_type':'bool'},'compressFiles':{'signature':'int $compression | void','return_type':'void'},'__construct':{'signature':'string $fname [, int $flags [, string $alias]]','return_type':''},'convertToData':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | PharData','return_type':'PharData'},'convertToExecutable':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | Phar','return_type':'Phar'},'copy':{'signature':'string $oldfile, string $newfile | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'decompress':{'signature':'[ string $extension] | object','return_type':'object'},'decompressFiles':{'signature':'void | bool','return_type':'bool'},'delMetadata':{'signature':'void | bool','return_type':'bool'},'delete':{'signature':'string $entry | bool','return_type':'bool'},'extractTo':{'signature':'string $pathto [, string|array $files [, bool $overwrite = false]] | bool','return_type':'bool'},'getMetadata':{'signature':'void | mixed','return_type':'mixed'},'getModified':{'signature':'void | bool','return_type':'bool'},'getSignature':{'signature':'void | array','return_type':'array'},'getStub':{'signature':'void | string','return_type':'string'},'getVersion':{'signature':'void | string','return_type':'string'},'hasMetadata':{'signature':'void | bool','return_type':'bool'},'isBuffering':{'signature':'void | bool','return_type':'bool'},'isCompressed':{'signature':'void | mixed','return_type':'mixed'},'isFileFormat':{'signature':'int $format | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'offsetExists':{'signature':'string $offset | bool','return_type':'bool'},'offsetGet':{'signature':'string $offset | int','return_type':'int'},'offsetSet':{'signature':'string $offset, string $value | void','return_type':'void'},'offsetUnset':{'signature':'string $offset | bool','return_type':'bool'},'setAlias':{'signature':'string $alias | bool','return_type':'bool'},'setDefaultStub':{'signature':'[ string $index [, string $webindex]] | bool','return_type':'bool'},'setMetadata':{'signature':'mixed $metadata | void','return_type':'void'},'setSignatureAlgorithm':{'signature':'int $sigtype [, string $privatekey] | void','return_type':'void'},'setStub':{'signature':'string $stub [, int $len = -1] | bool','return_type':'bool'},'startBuffering':{'signature':'void | void','return_type':'void'},'stopBuffering':{'signature':'void | void','return_type':'void'},'uncompressAllFiles':{'signature':'void | bool','return_type':'bool'},},'static_methods':{'apiVersion':{'signature':'void | string','return_type':'string'},'canCompress':{'signature':'[ int $type = 0] | bool','return_type':'bool'},'canWrite':{'signature':'void | bool','return_type':'bool'},'createDefaultStub':{'signature':'[ string $indexfile [, string $webindexfile]] | string','return_type':'string'},'getSupportedCompression':{'signature':'void | array','return_type':'array'},'getSupportedSignatures':{'signature':'void | array','return_type':'array'},'interceptFileFuncs':{'signature':'void | void','return_type':'void'},'isValidPharFilename':{'signature':'string $filename [, bool $executable = true] | bool','return_type':'bool'},'loadPhar':{'signature':'string $filename [, string $alias] | bool','return_type':'bool'},'mapPhar':{'signature':'[ string $alias [, int $dataoffset = 0]] | bool','return_type':'bool'},'mount':{'signature':'string $pharpath, string $externalpath | void','return_type':'void'},'mungServer':{'signature':'array $munglist | void','return_type':'void'},'running':{'signature':'[ bool $retphar = true] | string','return_type':'string'},'unlinkArchive':{'signature':'string $archive | bool','return_type':'bool'},'webPhar':{'signature':'[ string $alias [, string $index = "index.php" [, string $f404 [, array $mimetypes [, callable $rewrites]]]]] | void','return_type':'void'},},},'phardata':{'name':'PharData','methods':{'addEmptyDir':{'signature':'string $dirname | void','return_type':'void'},'addFile':{'signature':'string $file [, string $localname] | void','return_type':'void'},'addFromString':{'signature':'string $localname, string $contents | void','return_type':'void'},'buildFromDirectory':{'signature':'string $base_dir [, string $regex] | array','return_type':'array'},'buildFromIterator':{'signature':'Iterator $iter [, string $base_directory] | array','return_type':'array'},'compress':{'signature':'int $compression [, string $extension] | object','return_type':'object'},'compressFiles':{'signature':'int $compression | void','return_type':'void'},'__construct':{'signature':'string $fname [, int $flags [, string $alias]]','return_type':''},'convertToData':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | PharData','return_type':'PharData'},'convertToExecutable':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | Phar','return_type':'Phar'},'copy':{'signature':'string $oldfile, string $newfile | bool','return_type':'bool'},'decompress':{'signature':'[ string $extension] | object','return_type':'object'},'decompressFiles':{'signature':'void | bool','return_type':'bool'},'delMetadata':{'signature':'void | bool','return_type':'bool'},'delete':{'signature':'string $entry | bool','return_type':'bool'},'extractTo':{'signature':'string $pathto [, string|array $files [, bool $overwrite = false]] | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'offsetSet':{'signature':'string $offset, string $value | void','return_type':'void'},'offsetUnset':{'signature':'string $offset | bool','return_type':'bool'},'setAlias':{'signature':'string $alias | bool','return_type':'bool'},'setDefaultStub':{'signature':'[ string $index [, string $webindex]] | bool','return_type':'bool'},'setMetadata':{'signature':'mixed $metadata | void','return_type':'void'},'setSignatureAlgorithm':{'signature':'int $sigtype [, string $privatekey] | void','return_type':'void'},'setStub':{'signature':'string $stub [, int $len = -1] | bool','return_type':'bool'},'compressAllFilesBZIP2':{'signature':'void | bool','return_type':'bool'},'compressAllFilesGZ':{'signature':'void | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'getMetadata':{'signature':'void | mixed','return_type':'mixed'},'getModified':{'signature':'void | bool','return_type':'bool'},'getSignature':{'signature':'void | array','return_type':'array'},'getStub':{'signature':'void | string','return_type':'string'},'getVersion':{'signature':'void | string','return_type':'string'},'hasMetadata':{'signature':'void | bool','return_type':'bool'},'isBuffering':{'signature':'void | bool','return_type':'bool'},'isCompressed':{'signature':'void | mixed','return_type':'mixed'},'isFileFormat':{'signature':'int $format | bool','return_type':'bool'},'offsetExists':{'signature':'string $offset | bool','return_type':'bool'},'offsetGet':{'signature':'string $offset | int','return_type':'int'},'startBuffering':{'signature':'void | void','return_type':'void'},'stopBuffering':{'signature':'void | void','return_type':'void'},'uncompressAllFiles':{'signature':'void | bool','return_type':'bool'},},'static_methods':{'apiVersion':{'signature':'void | string','return_type':'string'},'canCompress':{'signature':'[ int $type = 0] | bool','return_type':'bool'},'canWrite':{'signature':'void | bool','return_type':'bool'},'createDefaultStub':{'signature':'[ string $indexfile [, string $webindexfile]] | string','return_type':'string'},'getSupportedCompression':{'signature':'void | array','return_type':'array'},'getSupportedSignatures':{'signature':'void | array','return_type':'array'},'interceptFileFuncs':{'signature':'void | void','return_type':'void'},'isValidPharFilename':{'signature':'string $filename [, bool $executable = true] | bool','return_type':'bool'},'loadPhar':{'signature':'string $filename [, string $alias] | bool','return_type':'bool'},'mapPhar':{'signature':'[ string $alias [, int $dataoffset = 0]] | bool','return_type':'bool'},'mount':{'signature':'string $pharpath, string $externalpath | void','return_type':'void'},'mungServer':{'signature':'array $munglist | void','return_type':'void'},'running':{'signature':'[ bool $retphar = true] | string','return_type':'string'},'unlinkArchive':{'signature':'string $archive | bool','return_type':'bool'},'webPhar':{'signature':'[ string $alias [, string $index = "index.php" [, string $f404 [, array $mimetypes [, callable $rewrites]]]]] | void','return_type':'void'},},},'pharexception':{'name':'PharException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'pharfileinfo':{'name':'PharFileInfo','methods':{'chmod':{'signature':'int $permissions | void','return_type':'void'},'compress':{'signature':'int $compression | bool','return_type':'bool'},'__construct':{'signature':'string $entry','return_type':''},'decompress':{'signature':'void | bool','return_type':'bool'},'delMetadata':{'signature':'void | bool','return_type':'bool'},'getCRC32':{'signature':'void | int','return_type':'int'},'getCompressedSize':{'signature':'void | int','return_type':'int'},'getMetadata':{'signature':'void | mixed','return_type':'mixed'},'getPharFlags':{'signature':'void | int','return_type':'int'},'hasMetadata':{'signature':'void | bool','return_type':'bool'},'isCRCChecked':{'signature':'void | bool','return_type':'bool'},'isCompressed':{'signature':'[ int $compression_type = 9021976] | bool','return_type':'bool'},'isCompressedBZIP2':{'signature':'void | bool','return_type':'bool'},'isCompressedGZ':{'signature':'void | bool','return_type':'bool'},'setCompressedBZIP2':{'signature':'void | bool','return_type':'bool'},'setCompressedGZ':{'signature':'void | bool','return_type':'bool'},'setMetadata':{'signature':'mixed $metadata | void','return_type':'void'},'setUncompressed':{'signature':'void | bool','return_type':'bool'},},},} 2826a6878375SBram Moolenaarlet php_builtin['classes']['streams']={'php_user_filter':{'name':'php_user_filter','properties': {'filtername':{'initializer':'','type':''},'params':{'initializer':'','type':''},},'methods':{'filter':{'signature':'resource $in, resource $out, int &$consumed, bool $closing | int','return_type':'int'},'onClose':{'signature':'void | void','return_type':'void'},'onCreate':{'signature':'void | bool','return_type':'bool'},},},} 2827a6878375SBram Moolenaarlet php_builtin['classes']['sessions']={'sessionhandler':{'name':'SessionHandler','methods':{'close':{'signature':'void | bool','return_type':'bool'},'destroy':{'signature':'string $session_id | bool','return_type':'bool'},'gc':{'signature':'int $maxlifetime | bool','return_type':'bool'},'open':{'signature':'string $save_path, string $session_id | bool','return_type':'bool'},'read':{'signature':'string $session_id | string','return_type':'string'},'write':{'signature':'string $session_id, string $session_data | bool','return_type':'bool'},},},'sessionhandlerinterface':{'name':'SessionHandlerInterface','methods':{'close':{'signature':'void | bool','return_type':'bool'},'destroy':{'signature':'string $session_id | bool','return_type':'bool'},'gc':{'signature':'string $maxlifetime | bool','return_type':'bool'},'open':{'signature':'string $save_path, string $name | bool','return_type':'bool'},'read':{'signature':'string $session_id | string','return_type':'string'},'write':{'signature':'string $session_id, string $session_data | bool','return_type':'bool'},},},} 2828a6878375SBram Moolenaarlet php_builtin['classes']['simplexml']={'simplexmlelement':{'name':'SimpleXMLElement','methods':{'__construct':{'signature':'string $data [, int $options = 0 [, bool $data_is_url = false [, string $ns = "" [, bool $is_prefix = false]]]]','return_type':''},'addAttribute':{'signature':'string $name [, string $value [, string $namespace]] | void','return_type':'void'},'addChild':{'signature':'string $name [, string $value [, string $namespace]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'asXML':{'signature':'[ string $filename] | mixed','return_type':'mixed'},'attributes':{'signature':'[ string $ns = NULL [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'children':{'signature':'[ string $ns [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'count':{'signature':'void | int','return_type':'int'},'getDocNamespaces':{'signature':'[ bool $recursive = false [, bool $from_root = true]] | array','return_type':'array'},'getName':{'signature':'void | string','return_type':'string'},'getNamespaces':{'signature':'[ bool $recursive = false] | array','return_type':'array'},'registerXPathNamespace':{'signature':'string $prefix, string $ns | bool','return_type':'bool'},'__toString':{'signature':'void | string','return_type':'string'},'xpath':{'signature':'string $path | array','return_type':'array'},},},'simplexmliterator':{'name':'SimpleXMLIterator','methods':{'current':{'signature':'void | mixed','return_type':'mixed'},'getChildren':{'signature':'void | SimpleXMLIterator','return_type':'SimpleXMLIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'string $data [, int $options = 0 [, bool $data_is_url = false [, string $ns = "" [, bool $is_prefix = false]]]]','return_type':''},'addAttribute':{'signature':'string $name [, string $value [, string $namespace]] | void','return_type':'void'},'addChild':{'signature':'string $name [, string $value [, string $namespace]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'asXML':{'signature':'[ string $filename] | mixed','return_type':'mixed'},'attributes':{'signature':'[ string $ns = NULL [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'children':{'signature':'[ string $ns [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'count':{'signature':'void | int','return_type':'int'},'getDocNamespaces':{'signature':'[ bool $recursive = false [, bool $from_root = true]] | array','return_type':'array'},'getName':{'signature':'void | string','return_type':'string'},'getNamespaces':{'signature':'[ bool $recursive = false] | array','return_type':'array'},'registerXPathNamespace':{'signature':'string $prefix, string $ns | bool','return_type':'bool'},'__toString':{'signature':'void | string','return_type':'string'},'xpath':{'signature':'string $path | array','return_type':'array'},},},} 2829a6878375SBram Moolenaarlet php_builtin['classes']['spl_types']={'splbool':{'name':'SplBool','constants':{'__default':'false','false':'false','true':'true',},'methods':{'getConstList':{'signature':'[ bool $include_default = false] | array','return_type':'array'},},},'splenum':{'name':'SplEnum','constants':{'__default':'null',},'methods':{'getConstList':{'signature':'[ bool $include_default = false] | array','return_type':'array'},'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'splfloat':{'name':'SplFloat','constants':{'__default':'0',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'splint':{'name':'SplInt','constants':{'__default':'0',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'splstring':{'name':'SplString','constants':{'__default':'0',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'spltype':{'name':'SplType','constants':{'__default':'null',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},} 2830a6878375SBram Moolenaarlet php_builtin['classes']['xmlreader']={'xmlreader':{'name':'XMLReader','constants':{'NONE':'0','ELEMENT':'1','ATTRIBUTE':'2','TEXT':'3','CDATA':'4','ENTITY_REF':'5','ENTITY':'6','PI':'7','COMMENT':'8','DOC':'9','DOC_TYPE':'10','DOC_FRAGMENT':'11','NOTATION':'12','WHITESPACE':'13','SIGNIFICANT_WHITESPACE':'14','END_ELEMENT':'15','END_ENTITY':'16','XML_DECLARATION':'17','LOADDTD':'1','DEFAULTATTRS':'2','VALIDATE':'3','SUBST_ENTITIES':'4',},'properties': {'attributeCount':{'initializer':'','type':'int'},'baseURI':{'initializer':'','type':'string'},'depth':{'initializer':'','type':'int'},'hasAttributes':{'initializer':'','type':'bool'},'hasValue':{'initializer':'','type':'bool'},'isDefault':{'initializer':'','type':'bool'},'isEmptyElement':{'initializer':'','type':'bool'},'localName':{'initializer':'','type':'string'},'name':{'initializer':'','type':'string'},'namespaceURI':{'initializer':'','type':'string'},'nodeType':{'initializer':'','type':'int'},'prefix':{'initializer':'','type':'string'},'value':{'initializer':'','type':'string'},'xmlLang':{'initializer':'','type':'string'},},'methods':{'close':{'signature':'void | bool','return_type':'bool'},'expand':{'signature':'[ DOMNode $basenode] | DOMNode','return_type':'DOMNode'},'getAttribute':{'signature':'string $name | string','return_type':'string'},'getAttributeNo':{'signature':'int $index | string','return_type':'string'},'getAttributeNs':{'signature':'string $localName, string $namespaceURI | string','return_type':'string'},'getParserProperty':{'signature':'int $property | bool','return_type':'bool'},'isValid':{'signature':'void | bool','return_type':'bool'},'lookupNamespace':{'signature':'string $prefix | bool','return_type':'bool'},'moveToAttribute':{'signature':'string $name | bool','return_type':'bool'},'moveToAttributeNo':{'signature':'int $index | bool','return_type':'bool'},'moveToAttributeNs':{'signature':'string $localName, string $namespaceURI | bool','return_type':'bool'},'moveToElement':{'signature':'void | bool','return_type':'bool'},'moveToFirstAttribute':{'signature':'void | bool','return_type':'bool'},'moveToNextAttribute':{'signature':'void | bool','return_type':'bool'},'next':{'signature':'[ string $localname] | bool','return_type':'bool'},'open':{'signature':'string $URI [, string $encoding [, int $options = 0]] | bool','return_type':'bool'},'read':{'signature':'void | bool','return_type':'bool'},'readInnerXML':{'signature':'void | string','return_type':'string'},'readOuterXML':{'signature':'void | string','return_type':'string'},'readString':{'signature':'void | string','return_type':'string'},'setParserProperty':{'signature':'int $property, bool $value | bool','return_type':'bool'},'setRelaxNGSchema':{'signature':'string $filename | bool','return_type':'bool'},'setRelaxNGSchemaSource':{'signature':'string $source | bool','return_type':'bool'},'setSchema':{'signature':'string $filename | bool','return_type':'bool'},'xml':{'signature':'string $source [, string $encoding [, int $options = 0]] | bool','return_type':'bool'},},},} 2831a6878375SBram Moolenaarlet php_builtin['classes']['xmlwriter'] = {'xmlwriter':{'name':'XMLWriter','methods':{'endAttribute':{'signature':'void | bool','return_type':'bool'},'endCData':{'signature':'void | bool','return_type':'bool'},'endComment':{'signature':'void | bool','return_type':'bool'},'endDocument':{'signature':'void | bool','return_type':'bool'},'endDTDAttlist':{'signature':'void | bool','return_type':'bool'},'endDTDElement':{'signature':'void | bool','return_type':'bool'},'endDTDEntity':{'signature':'void | bool','return_type':'bool'},'endDTD':{'signature':'void | bool','return_type':'bool'},'endElement':{'signature':'void | bool','return_type':'bool'},'endPI':{'signature':'void | bool','return_type':'bool'},'flush':{'signature':'[bool $empty = true] | bool','return_type':'bool'},'fullEndElement':{'signature':'void | bool','return_type':'bool'},'openMemory':{'signature':'void | bool','return_type':'bool'},'openURI':{'signature':'string $uri | bool','return_type':'bool'},'outputMemory':{'signature':'[bool $flush = true] | bool','return_type':'bool'},'setIndentString':{'signature':'string $indentString | bool','return_type':'bool'},'setIndent':{'signature':'bool $indent | bool','return_type':'bool'},'startAttributeNS':{'signature':'string $prefix, string $name, string $uri | bool','return_type':'bool'},'startAttribute':{'signature':'string $name | bool','return_type':'bool'},'startCData':{'signature':'void | bool','return_type':'bool'},'startComment':{'signature':'void | bool','return_type':'bool'},'startDocument':{'signature':'[string $version = 1.0 [, string $encoding = NULL [, string $standalone ]]] | bool','return_type':'bool'},'startDTDAttlist':{'signature':'string $name | bool','return_type':'bool'},'startDTDElement':{'signature':'string $qualifiedName | bool','return_type':'bool'},'startDTDEntity':{'signature':'string $name, bool $isparam | bool','return_type':'bool'},'startDTD':{'signature':'string $qualifiedName [, string $publicId [, string $systemId ]] | bool','return_type':'bool'},'startElementNS':{'signature':'string $prefix, string $name, string $uri | bool','return_type':'bool'},'startElement':{'signature':'string $name | bool','return_type':'bool'},'startPI':{'signature':'string $target | bool','return_type':'bool'},'text':{'signature':'string $content | bool','return_type':'bool'},'writeAttributeNS':{'signature':'string $prefix, string $name, string $uri, string $content | bool','return_type':'bool'},'writeAttribute':{'signature':'string $name, string $value | bool','return_type':'bool'},'writeCData':{'signature':'string $content | bool','return_type':'bool'},'writeComment':{'signature':'string $content | bool','return_type':'bool'},'writeDTDAttlist':{'signature':'string $name, string $content | bool','return_type':'bool'},'writeDTDElement':{'signature':'string $name, string $content | bool','return_type':'bool'},'writeDTDEntity':{'signature':'string $name, string $content, bool $pe, string $pubid, string $sysid, string $ndataid | bool','return_type':'bool'},'writeDTD':{'signature':'string $name [, string $publicId [, string $systemId [, string $subset ]]] | bool','return_type':'bool'},'writeElementNS':{'signature':'string $prefix, string $name, string $uri [, string $content ] | bool','return_type':'bool'},'writeElement':{'signature':'string $name [, string $content ] | bool','return_type':'bool'},'writePI':{'signature':'string $target, string $content | bool','return_type':'bool'},'writeRaw':{'signature':'string $content | bool','return_type':'bool'},},},} 2832a6878375SBram Moolenaarlet php_builtin['classes']['zip']={'ziparchive':{'name':'ZipArchive','properties': {'status':{'initializer':'','type':'int'},'statusSys':{'initializer':'','type':'int'},'numFiles':{'initializer':'','type':'int'},'filename':{'initializer':'','type':'string'},'comment':{'initializer':'','type':'string'},},'methods':{'addEmptyDir':{'signature':'string $dirname | bool','return_type':'bool'},'addFile':{'signature':'string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0]]] | bool','return_type':'bool'},'addFromString':{'signature':'string $localname, string $contents | bool','return_type':'bool'},'addGlob':{'signature':'string $pattern [, int $flags = 0 [, array $options = array()]] | bool','return_type':'bool'},'addPattern':{'signature':'string $pattern [, string $path = ''.'' [, array $options = array()]] | bool','return_type':'bool'},'close':{'signature':'void | bool','return_type':'bool'},'deleteIndex':{'signature':'int $index | bool','return_type':'bool'},'deleteName':{'signature':'string $name | bool','return_type':'bool'},'extractTo':{'signature':'string $destination [, mixed $entries] | bool','return_type':'bool'},'getArchiveComment':{'signature':'[ int $flags] | string','return_type':'string'},'getCommentIndex':{'signature':'int $index [, int $flags] | string','return_type':'string'},'getCommentName':{'signature':'string $name [, int $flags] | string','return_type':'string'},'getFromIndex':{'signature':'int $index [, int $length = 0 [, int $flags]] | string','return_type':'string'},'getFromName':{'signature':'string $name [, int $length = 0 [, int $flags]] | string','return_type':'string'},'getNameIndex':{'signature':'int $index [, int $flags] | string','return_type':'string'},'getStatusString':{'signature':'void | string','return_type':'string'},'getStream':{'signature':'string $name | resource','return_type':'resource'},'locateName':{'signature':'string $name [, int $flags] | int','return_type':'int'},'open':{'signature':'string $filename [, int $flags] | mixed','return_type':'mixed'},'renameIndex':{'signature':'int $index, string $newname | bool','return_type':'bool'},'renameName':{'signature':'string $name, string $newname | bool','return_type':'bool'},'setArchiveComment':{'signature':'string $comment | bool','return_type':'bool'},'setCommentIndex':{'signature':'int $index, string $comment | bool','return_type':'bool'},'setCommentName':{'signature':'string $name, string $comment | bool','return_type':'bool'},'statIndex':{'signature':'int $index [, int $flags] | array','return_type':'array'},'statName':{'signature':'string $name [, int $flags] | array','return_type':'array'},'unchangeAll':{'signature':'void | bool','return_type':'bool'},'unchangeArchive':{'signature':'void | bool','return_type':'bool'},'unchangeIndex':{'signature':'int $index | bool','return_type':'bool'},'unchangeName':{'signature':'string $name | bool','return_type':'bool'},},},} 2833a6878375SBram Moolenaarlet php_builtin['interfaces']['predefined_interfaces_and_classes']={'arrayaccess':{'name':'ArrayAccess','methods':{'offsetExists':{'signature':'mixed $offset | boolean','return_type':'boolean'},'offsetGet':{'signature':'mixed $offset | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $offset, mixed $value | void','return_type':'void'},'offsetUnset':{'signature':'mixed $offset | void','return_type':'void'},},},'iterator':{'name':'Iterator','methods':{'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'iteratoraggregate':{'name':'IteratorAggregate','methods':{'getIterator':{'signature':'void | Traversable','return_type':'Traversable'},},},'serializable':{'name':'Serializable','methods':{'serialize':{'signature':'void | string','return_type':'string'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},},},'traversable':{'name':'Traversable',},} 2834a6878375SBram Moolenaarlet php_builtin['interfaces']['spl']={'countable':{'name':'Countable','methods':{'count':{'signature':'void | int','return_type':'int'},},},'outeriterator':{'name':'OuterIterator','methods':{'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'recursiveiterator':{'name':'RecursiveIterator','methods':{'getChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'seekableiterator':{'name':'SeekableIterator','methods':{'seek':{'signature':'int $position | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'splobserver':{'name':'SplObserver','methods':{'update':{'signature':'SplSubject $subject | void','return_type':'void'},},},'splsubject':{'name':'SplSubject','methods':{'attach':{'signature':'SplObserver $observer | void','return_type':'void'},'detach':{'signature':'SplObserver $observer | void','return_type':'void'},'notify':{'signature':'void | void','return_type':'void'},},},} 2835a6878375SBram Moolenaarlet php_builtin['interfaces']['date_time']={'datetimeinterface':{'name':'DateTimeInterface','methods':{'diff':{'signature':'DateTimeInterface $datetime2 [, bool $absolute = false] | DateInterval','return_type':'DateInterval'},'format':{'signature':'string $format | string','return_type':'string'},'getOffset':{'signature':'void | int','return_type':'int'},'getTimestamp':{'signature':'void | int','return_type':'int'},'getTimezone':{'signature':'void | DateTimeZone','return_type':'DateTimeZone'},'__wakeup':{'signature':'void','return_type':''},},},} 2836a6878375SBram Moolenaarlet php_builtin['interfaces']['json']={'jsonserializable':{'name':'JsonSerializable','methods':{'jsonSerialize':{'signature':'void | mixed','return_type':'mixed'},},},} 2837a6878375SBram Moolenaarlet php_builtin['constants']['common']={'TRUE':'','FALSE':'','NULL':'','E_NOTICE':'','E_DEPRECATED':'','E_RECOVERABLE_ERROR':'','E_ALL':'','E_STRICT':'','E_WARNING':'','E_ERROR':'','E_PARSE':'','E_CORE_ERROR':'','E_CORE_WARNING':'','E_COMPILE_ERROR':'','E_COMPILE_WARNING':'','E_USER_ERROR':'','E_USER_WARNING':'','E_USER_NOTICE':'','E_USER_DEPRECATED':'','__COMPILER_HALT_OFFSET__':'','__FILE__':'','__LINE__':'','__DIR__':'','__FUNCTION__':'','__CLASS__':'','__TRAIT__':'','__METHOD__':'','__NAMESPACE__':'',} 2838a6878375SBram Moolenaarlet php_builtin['constants']['arrays']={'CASE_LOWER':'','CASE_UPPER':'','SORT_ASC':'','SORT_DESC':'','SORT_REGULAR':'','SORT_NUMERIC':'','SORT_STRING':'','SORT_LOCALE_STRING':'','SORT_NATURAL':'','SORT_FLAG_CASE':'','COUNT_NORMAL':'','COUNT_RECURSIVE':'','EXTR_OVERWRITE':'','EXTR_SKIP':'','EXTR_PREFIX_SAME':'','EXTR_PREFIX_ALL':'','EXTR_PREFIX_INVALID':'','EXTR_PREFIX_IF_EXISTS':'','EXTR_IF_EXISTS':'','EXTR_REFS':'',} 2839a6878375SBram Moolenaarlet php_builtin['constants']['calendar']={'CAL_GREGORIAN':'','CAL_JULIAN':'','CAL_JEWISH':'','CAL_FRENCH':'','CAL_NUM_CALS':'','CAL_DOW_DAYNO':'','CAL_DOW_SHORT':'','CAL_DOW_LONG':'','CAL_MONTH_GREGORIAN_SHORT':'','CAL_MONTH_GREGORIAN_LONG':'','CAL_MONTH_JULIAN_SHORT':'','CAL_MONTH_JULIAN_LONG':'','CAL_MONTH_JEWISH':'','CAL_MONTH_FRENCH':'','CAL_EASTER_DEFAULT':'','CAL_EASTER_ROMAN':'','CAL_EASTER_ALWAYS_GREGORIAN':'','CAL_EASTER_ALWAYS_JULIAN':'','CAL_JEWISH_ADD_ALAFIM_GERESH':'','CAL_JEWISH_ADD_ALAFIM':'','CAL_JEWISH_ADD_GERESHAYIM':'',} 2840a6878375SBram Moolenaarlet php_builtin['constants']['curl']={'CURLOPT_POSTFIELDS':'','CURLOPT_CAINFO':'','CURLOPT_AUTOREFERER':'','CURLOPT_COOKIESESSION':'','CURLOPT_DNS_USE_GLOBAL_CACHE':'','CURLOPT_DNS_CACHE_TIMEOUT':'','CURLOPT_FTP_SSL':'','CURLFTPSSL_TRY':'','CURLFTPSSL_ALL':'','CURLFTPSSL_CONTROL':'','CURLFTPSSL_NONE':'','CURLOPT_PRIVATE':'','CURLOPT_FTPSSLAUTH':'','CURLOPT_PORT':'','CURLOPT_FILE':'','CURLOPT_INFILE':'','CURLOPT_INFILESIZE':'','CURLOPT_URL':'','CURLOPT_PROXY':'','CURLOPT_VERBOSE':'','CURLOPT_HEADER':'','CURLOPT_HTTPHEADER':'','CURLOPT_NOPROGRESS':'','CURLOPT_NOBODY':'','CURLOPT_FAILONERROR':'','CURLOPT_UPLOAD':'','CURLOPT_POST':'','CURLOPT_FTPLISTONLY':'','CURLOPT_FTPAPPEND':'','CURLOPT_FTP_CREATE_MISSING_DIRS':'','CURLOPT_NETRC':'','CURLOPT_FOLLOWLOCATION':'','CURLOPT_FTPASCII':'','CURLOPT_PUT':'','CURLOPT_MUTE':'','CURLOPT_USERPWD':'','CURLOPT_PROXYUSERPWD':'','CURLOPT_RANGE':'','CURLOPT_TIMEOUT':'','CURLOPT_TIMEOUT_MS':'','CURLOPT_TCP_NODELAY':'','CURLOPT_PROGRESSFUNCTION':'','CURLOPT_REFERER':'','CURLOPT_USERAGENT':'','CURLOPT_FTPPORT':'','CURLOPT_FTP_USE_EPSV':'','CURLOPT_LOW_SPEED_LIMIT':'','CURLOPT_LOW_SPEED_TIME':'','CURLOPT_RESUME_FROM':'','CURLOPT_COOKIE':'','CURLOPT_SSLCERT':'','CURLOPT_SSLCERTPASSWD':'','CURLOPT_WRITEHEADER':'','CURLOPT_SSL_VERIFYHOST':'','CURLOPT_COOKIEFILE':'','CURLOPT_SSLVERSION':'','CURLOPT_TIMECONDITION':'','CURLOPT_TIMEVALUE':'','CURLOPT_CUSTOMREQUEST':'','CURLOPT_STDERR':'','CURLOPT_TRANSFERTEXT':'','CURLOPT_RETURNTRANSFER':'','CURLOPT_QUOTE':'','CURLOPT_POSTQUOTE':'','CURLOPT_INTERFACE':'','CURLOPT_KRB4LEVEL':'','CURLOPT_HTTPPROXYTUNNEL':'','CURLOPT_FILETIME':'','CURLOPT_WRITEFUNCTION':'','CURLOPT_READFUNCTION':'','CURLOPT_PASSWDFUNCTION':'','CURLOPT_HEADERFUNCTION':'','CURLOPT_MAXREDIRS':'','CURLOPT_MAXCONNECTS':'','CURLOPT_CLOSEPOLICY':'','CURLOPT_FRESH_CONNECT':'','CURLOPT_FORBID_REUSE':'','CURLOPT_RANDOM_FILE':'','CURLOPT_EGDSOCKET':'','CURLOPT_CONNECTTIMEOUT':'','CURLOPT_CONNECTTIMEOUT_MS':'','CURLOPT_SSL_VERIFYPEER':'','CURLOPT_CAPATH':'','CURLOPT_COOKIEJAR':'','CURLOPT_SSL_CIPHER_LIST':'','CURLOPT_BINARYTRANSFER':'','CURLOPT_NOSIGNAL':'','CURLOPT_PROXYTYPE':'','CURLOPT_BUFFERSIZE':'','CURLOPT_HTTPGET':'','CURLOPT_HTTP_VERSION':'','CURLOPT_SSLKEY':'','CURLOPT_SSLKEYTYPE':'','CURLOPT_SSLKEYPASSWD':'','CURLOPT_SSLENGINE':'','CURLOPT_SSLENGINE_DEFAULT':'','CURLOPT_SSLCERTTYPE':'','CURLOPT_CRLF':'','CURLOPT_ENCODING':'','CURLOPT_PROXYPORT':'','CURLOPT_UNRESTRICTED_AUTH':'','CURLOPT_FTP_USE_EPRT':'','CURLOPT_HTTP200ALIASES':'','CURLOPT_HTTPAUTH':'','CURLAUTH_BASIC':'','CURLAUTH_DIGEST':'','CURLAUTH_GSSNEGOTIATE':'','CURLAUTH_NTLM':'','CURLAUTH_ANY':'','CURLAUTH_ANYSAFE':'','CURLOPT_PROXYAUTH':'','CURLOPT_MAX_RECV_SPEED_LARGE':'','CURLOPT_MAX_SEND_SPEED_LARGE':'','CURLCLOSEPOLICY_LEAST_RECENTLY_USED':'','CURLCLOSEPOLICY_LEAST_TRAFFIC':'','CURLCLOSEPOLICY_SLOWEST':'','CURLCLOSEPOLICY_CALLBACK':'','CURLCLOSEPOLICY_OLDEST':'','CURLINFO_PRIVATE':'','CURLINFO_EFFECTIVE_URL':'','CURLINFO_HTTP_CODE':'','CURLINFO_HEADER_OUT':'','CURLINFO_HEADER_SIZE':'','CURLINFO_REQUEST_SIZE':'','CURLINFO_TOTAL_TIME':'','CURLINFO_NAMELOOKUP_TIME':'','CURLINFO_CONNECT_TIME':'','CURLINFO_PRETRANSFER_TIME':'','CURLINFO_SIZE_UPLOAD':'','CURLINFO_SIZE_DOWNLOAD':'','CURLINFO_SPEED_DOWNLOAD':'','CURLINFO_SPEED_UPLOAD':'','CURLINFO_FILETIME':'','CURLINFO_SSL_VERIFYRESULT':'','CURLINFO_CONTENT_LENGTH_DOWNLOAD':'','CURLINFO_CONTENT_LENGTH_UPLOAD':'','CURLINFO_STARTTRANSFER_TIME':'','CURLINFO_CONTENT_TYPE':'','CURLINFO_REDIRECT_TIME':'','CURLINFO_REDIRECT_COUNT':'','CURL_TIMECOND_IFMODSINCE':'','CURL_TIMECOND_IFUNMODSINCE':'','CURL_TIMECOND_LASTMOD':'','CURL_VERSION_IPV6':'','CURL_VERSION_KERBEROS4':'','CURL_VERSION_SSL':'','CURL_VERSION_LIBZ':'','CURLVERSION_NOW':'','CURLE_OK':'','CURLE_UNSUPPORTED_PROTOCOL':'','CURLE_FAILED_INIT':'','CURLE_URL_MALFORMAT':'','CURLE_URL_MALFORMAT_USER':'','CURLE_COULDNT_RESOLVE_PROXY':'','CURLE_COULDNT_RESOLVE_HOST':'','CURLE_COULDNT_CONNECT':'','CURLE_FTP_WEIRD_SERVER_REPLY':'','CURLE_FTP_ACCESS_DENIED':'','CURLE_FTP_USER_PASSWORD_INCORRECT':'','CURLE_FTP_WEIRD_PASS_REPLY':'','CURLE_FTP_WEIRD_USER_REPLY':'','CURLE_FTP_WEIRD_PASV_REPLY':'','CURLE_FTP_WEIRD_227_FORMAT':'','CURLE_FTP_CANT_GET_HOST':'','CURLE_FTP_CANT_RECONNECT':'','CURLE_FTP_COULDNT_SET_BINARY':'','CURLE_PARTIAL_FILE':'','CURLE_FTP_COULDNT_RETR_FILE':'','CURLE_FTP_WRITE_ERROR':'','CURLE_FTP_QUOTE_ERROR':'','CURLE_HTTP_NOT_FOUND':'','CURLE_WRITE_ERROR':'','CURLE_MALFORMAT_USER':'','CURLE_FTP_COULDNT_STOR_FILE':'','CURLE_READ_ERROR':'','CURLE_OUT_OF_MEMORY':'','CURLE_OPERATION_TIMEOUTED':'','CURLE_FTP_COULDNT_SET_ASCII':'','CURLE_FTP_PORT_FAILED':'','CURLE_FTP_COULDNT_USE_REST':'','CURLE_FTP_COULDNT_GET_SIZE':'','CURLE_HTTP_RANGE_ERROR':'','CURLE_HTTP_POST_ERROR':'','CURLE_SSL_CONNECT_ERROR':'','CURLE_FTP_BAD_DOWNLOAD_RESUME':'','CURLE_FILE_COULDNT_READ_FILE':'','CURLE_LDAP_CANNOT_BIND':'','CURLE_LDAP_SEARCH_FAILED':'','CURLE_LIBRARY_NOT_FOUND':'','CURLE_FUNCTION_NOT_FOUND':'','CURLE_ABORTED_BY_CALLBACK':'','CURLE_BAD_FUNCTION_ARGUMENT':'','CURLE_BAD_CALLING_ORDER':'','CURLE_HTTP_PORT_FAILED':'','CURLE_BAD_PASSWORD_ENTERED':'','CURLE_TOO_MANY_REDIRECTS':'','CURLE_UNKNOWN_TELNET_OPTION':'','CURLE_TELNET_OPTION_SYNTAX':'','CURLE_OBSOLETE':'','CURLE_SSL_PEER_CERTIFICATE':'','CURLE_GOT_NOTHING':'','CURLE_SSL_ENGINE_NOTFOUND':'','CURLE_SSL_ENGINE_SETFAILED':'','CURLE_SEND_ERROR':'','CURLE_RECV_ERROR':'','CURLE_SHARE_IN_USE':'','CURLE_SSL_CERTPROBLEM':'','CURLE_SSL_CIPHER':'','CURLE_SSL_CACERT':'','CURLE_BAD_CONTENT_ENCODING':'','CURLE_LDAP_INVALID_URL':'','CURLE_FILESIZE_EXCEEDED':'','CURLE_FTP_SSL_FAILED':'','CURLFTPAUTH_DEFAULT':'','CURLFTPAUTH_SSL':'','CURLFTPAUTH_TLS':'','CURLPROXY_HTTP':'','CURLPROXY_SOCKS5':'','CURL_NETRC_OPTIONAL':'','CURL_NETRC_IGNORED':'','CURL_NETRC_REQUIRED':'','CURL_HTTP_VERSION_NONE':'','CURL_HTTP_VERSION_1_0':'','CURL_HTTP_VERSION_1_1':'','CURLM_CALL_MULTI_PERFORM':'','CURLM_OK':'','CURLM_BAD_HANDLE':'','CURLM_BAD_EASY_HANDLE':'','CURLM_OUT_OF_MEMORY':'','CURLM_INTERNAL_ERROR':'','CURLMSG_DONE':'','CURLOPT_KEYPASSWD':'','CURLOPT_SSH_AUTH_TYPES':'','CURLOPT_SSH_HOST_PUBLIC_KEY_MD5':'','CURLOPT_SSH_PRIVATE_KEYFILE':'','CURLOPT_SSH_PUBLIC_KEYFILE':'','CURLMOPT_PIPELINING':'','CURLMOPT_MAXCONNECTS':'','CURLSSH_AUTH_ANY':'','CURLSSH_AUTH_DEFAULT':'','CURLSSH_AUTH_HOST':'','CURLSSH_AUTH_KEYBOARD':'','CURLSSH_AUTH_NONE':'','CURLSSH_AUTH_PASSWORD':'','CURLSSH_AUTH_PUBLICKEY':'','CURL_WRAPPERS_ENABLED':'','CURLPAUSE_ALL':'','CURLPAUSE_CONT':'','CURLPAUSE_RECV':'','CURLPAUSE_RECV_CONT':'','CURLPAUSE_SEND':'','CURLPAUSE_SEND_CONT':'','CURLM_XXX':'','CURLOPT_CERTINFO':'','CURLOPT_CONNECT_ONLY':'','CURLINFO_':'','CURLOPT_PROTOCOLS':'','CURLOPT_REDIR_PROTOCOLS':'','CURLOPT_IPRESOLVE':'','CURL_IPRESOLVE_WHATEVER':'','CURL_IPRESOLVE_V4':'','CURL_IPRESOLVE_V6':'','CURLOPT_SHARE':'','CURLSHOPT_SHARE':'','CURLSHOPT_UNSHARE':'','CURL_LOCK_DATA_COOKIE':'','CURL_LOCK_DATA_DNS':'','CURL_LOCK_DATA_SSL_SESSION':'',} 2841a6878375SBram Moolenaarlet php_builtin['constants']['date_time']={'DATE_ATOM':'','DATE_COOKIE':'','DATE_ISO8601':'','DATE_RFC822':'','DATE_RFC850':'','DATE_RFC1036':'','DATE_RFC1123':'','DATE_RFC2822':'','DATE_RFC3339':'','DATE_RSS':'','DATE_W3C':'','SUNFUNCS_RET_TIMESTAMP':'','SUNFUNCS_RET_STRING':'','SUNFUNCS_RET_DOUBLE':'','LC_TIME':'',} 2842a6878375SBram Moolenaarlet php_builtin['constants']['libxml']={'LIBXML_ERR_WARNING':'','LIBXML_ERR_ERROR':'','LIBXML_ERR_FATAL':'','LIBXML_NONET':'','LIBXML_COMPACT':'','LIBXML_DTDATTR':'','LIBXML_DTDLOAD':'','LIBXML_DTDVALID':'','LIBXML_HTML_NOIMPLIED':'','LIBXML_HTML_NODEFDTD':'','LIBXML_NOBLANKS':'','LIBXML_NOCDATA':'','LIBXML_NOEMPTYTAG':'','LIBXML_NOENT':'','LIBXML_NOERROR':'','LIBXML_NOWARNING':'','LIBXML_NOXMLDECL':'','LIBXML_NSCLEAN':'','LIBXML_PARSEHUGE':'','LIBXML_PEDANTIC':'','LIBXML_XINCLUDE':'','LIBXML_ERR_NONE':'','LIBXML_VERSION':'','LIBXML_DOTTED_VERSION':'','LIBXML_SCHEMA_CREATE':'',} 2843a6878375SBram Moolenaarlet php_builtin['constants']['mysqli']={'MYSQLI_REPORT_OFF':'','MYSQLI_REPORT_ALL':'','MYSQLI_REPORT_STRICT':'','MYSQLI_REPORT_ERROR':'','MYSQLI_REPORT_INDEX':'','MYSQLI_ASSOC':'','MYSQLI_NUM':'','MYSQLI_BOTH':'','PHP_INT_MAX':'','MYSQLI_READ_DEFAULT_GROUP':'','MYSQLI_READ_DEFAULT_FILE':'','MYSQLI_OPT_CONNECT_TIMEOUT':'','MYSQLI_OPT_LOCAL_INFILE':'','MYSQLI_INIT_COMMAND':'','MYSQLI_CLIENT_SSL':'','MYSQLI_CLIENT_COMPRESS':'','MYSQLI_CLIENT_INTERACTIVE':'','MYSQLI_CLIENT_IGNORE_SPACE':'','MYSQLI_CLIENT_NO_SCHEMA':'','MYSQLI_CLIENT_MULTI_QUERIES':'','MYSQLI_STORE_RESULT':'','MYSQLI_USE_RESULT':'','MYSQLI_NOT_NULL_FLAG':'','MYSQLI_PRI_KEY_FLAG':'','MYSQLI_UNIQUE_KEY_FLAG':'','MYSQLI_MULTIPLE_KEY_FLAG':'','MYSQLI_BLOB_FLAG':'','MYSQLI_UNSIGNED_FLAG':'','MYSQLI_ZEROFILL_FLAG':'','MYSQLI_AUTO_INCREMENT_FLAG':'','MYSQLI_TIMESTAMP_FLAG':'','MYSQLI_SET_FLAG':'','MYSQLI_NUM_FLAG':'','MYSQLI_PART_KEY_FLAG':'','MYSQLI_GROUP_FLAG':'','MYSQLI_TYPE_DECIMAL':'','MYSQLI_TYPE_NEWDECIMAL':'','MYSQLI_TYPE_BIT':'','MYSQLI_TYPE_TINY':'','MYSQLI_TYPE_SHORT':'','MYSQLI_TYPE_LONG':'','MYSQLI_TYPE_FLOAT':'','MYSQLI_TYPE_DOUBLE':'','MYSQLI_TYPE_NULL':'','MYSQLI_TYPE_TIMESTAMP':'','MYSQLI_TYPE_LONGLONG':'','MYSQLI_TYPE_INT24':'','MYSQLI_TYPE_DATE':'','MYSQLI_TYPE_TIME':'','MYSQLI_TYPE_DATETIME':'','MYSQLI_TYPE_YEAR':'','MYSQLI_TYPE_NEWDATE':'','MYSQLI_TYPE_INTERVAL':'','MYSQLI_TYPE_ENUM':'','MYSQLI_TYPE_SET':'','MYSQLI_TYPE_TINY_BLOB':'','MYSQLI_TYPE_MEDIUM_BLOB':'','MYSQLI_TYPE_LONG_BLOB':'','MYSQLI_TYPE_BLOB':'','MYSQLI_TYPE_VAR_STRING':'','MYSQLI_TYPE_STRING':'','MYSQLI_TYPE_CHAR':'','MYSQLI_TYPE_GEOMETRY':'','MYSQLI_NEED_DATA':'','MYSQLI_NO_DATA':'','MYSQLI_DATA_TRUNCATED':'','MYSQLI_ENUM_FLAG':'','MYSQLI_BINARY_FLAG':'','MYSQLI_CURSOR_TYPE_FOR_UPDATE':'','MYSQLI_CURSOR_TYPE_NO_CURSOR':'','MYSQLI_CURSOR_TYPE_READ_ONLY':'','MYSQLI_CURSOR_TYPE_SCROLLABLE':'','MYSQLI_STMT_ATTR_CURSOR_TYPE':'','MYSQLI_STMT_ATTR_PREFETCH_ROWS':'','MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH':'','MYSQLI_SET_CHARSET_NAME':'','MYSQLI_DEBUG_TRACE_ENABLED':'','MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED':'','MYSQLI_SERVER_QUERY_NO_INDEX_USED':'','MYSQLI_REFRESH_GRANT':'','MYSQLI_REFRESH_LOG':'','MYSQLI_REFRESH_TABLES':'','MYSQLI_REFRESH_HOSTS':'','MYSQLI_REFRESH_STATUS':'','MYSQLI_REFRESH_THREADS':'','MYSQLI_REFRESH_SLAVE':'','MYSQLI_REFRESH_MASTER':'','MYSQLI_TRANS_COR_AND_CHAIN':'','MYSQLI_TRANS_COR_AND_NO_CHAIN':'','MYSQLI_TRANS_COR_RELEASE':'','MYSQLI_TRANS_COR_NO_RELEASE':'','MYSQL_READ_DEFAULT_FILE':'','MYSQLI_SERVER_PUBLIC_KEY':'','MYSQLI_NO_CHANGE_USER_ON_PCONNECT':'','MYSQLI_ASYNC':'','MYSQLI_OPT_INT_AND_FLOAT_NATIVE':'','MYSQLI_CLIENT_FOUND_ROWS':'','MULTI_STATEMENT':'','MYSQLI_RPL_MASTER':'','MYSQLI_RPL_SLAVE':'','MYSQLI_RPL_ADMIN':'',} 2844a6878375SBram Moolenaarlet php_builtin['constants']['spl']={'READ_AHEAD':'','MIT_NEED_ALL':'','MIT_KEYS_ASSOC':'','CALL_TOSTRING':'','CATCH_GET_CHILD':'','RIT_LEAVES_ONLY':'','LOCK_SH':'','LOCK_EX':'','LOCK_UN':'','LOCK_NB':'','SEEK_SET':'','SEEK_CUR':'','SEEK_END':'','PHP_INT_MAX':'',} 2845a6878375SBram Moolenaarlet php_builtin['constants']['unknow']={'PHP_INI_ALL':'','PHP_INI_PERDIR':'','PHP_INI_SYSTEM':'','PHP_INI_USER':'','COUNTER_FLAG_PERSIST':'','COUNTER_FLAG_SAVE':'','COUNTER_FLAG_NO_OVERWRITE':'','COUNTER_META_NAME':'','COUNTER_META_IS_PERISTENT':'','COUNTER_RESET_NEVER':'','COUNTER_RESET_PER_LOAD':'','COUNTER_RESET_PER_REQUEST':'','PDO_PLACEHOLDER_NAMED':'','PDO_PLACEHOLDER_POSITIONAL':'','PDO_PLACEHOLDER_NONE':'','PDO_CASE_NATURAL':'','PDO_CASE_UPPER':'','PDO_CASE_LOWER':'','PDO_ATTR_CASE':'','PHP_COUNTER_API':'','PHPAPI':'','COMPILE_DL_COUNTER':'','ZEND_GET_MODULE':'','HAVE_COUNTER':'','COUNTER_G':'','TSRMLS_DC':'','TSRMLS_FETCH':'','STANDARD_MODULE_HEADER':'','STANDARD_MODULE_HEADER_EX':'','STANDARD_MODULE_PROPERTIES':'','STANDARD_MODULE_PROPERTIES_EX':'','ZEND_MODULE_API_NO':'','ZEND_DEBUG':'','USING_ZTS':'','NO_VERSION_YET':'','NO_MODULE_GLOBALS':'','PHP_MODULE_GLOBALS':'','IGNORE_PATH':'','USE_PATH':'','IGNORE_URL':'','IGNORE_URL_WIN':'','ENFORCE_SAFE_MODE':'','REPORT_ERRORS':'','STREAM_MUST_SEEK':'','STREAM_WILL_CAST':'',} 2846a6878375SBram Moolenaarlet php_builtin['constants']['directories']={'DIRECTORY_SEPARATOR':'','PATH_SEPARATOR':'','SCANDIR_SORT_ASCENDING':'','SCANDIR_SORT_DESCENDING':'','SCANDIR_SORT_NONE':'',} 2847a6878375SBram Moolenaarlet php_builtin['constants']['dom']={'XML_ELEMENT_NODE':'','XML_ATTRIBUTE_NODE':'','XML_TEXT_NODE':'','XML_CDATA_SECTION_NODE':'','XML_ENTITY_REF_NODE':'','XML_ENTITY_NODE':'','XML_PI_NODE':'','XML_COMMENT_NODE':'','XML_DOCUMENT_NODE':'','XML_DOCUMENT_TYPE_NODE':'','XML_DOCUMENT_FRAG_NODE':'','XML_NOTATION_NODE':'','XML_HTML_DOCUMENT_NODE':'','XML_DTD_NODE':'','XML_ELEMENT_DECL_NODE':'','XML_ATTRIBUTE_DECL_NODE':'','XML_ENTITY_DECL_NODE':'','XML_NAMESPACE_DECL_NODE':'','XML_ATTRIBUTE_CDATA':'','XML_ATTRIBUTE_ID':'','XML_ATTRIBUTE_IDREF':'','XML_ATTRIBUTE_IDREFS':'','XML_ATTRIBUTE_ENTITY':'','XML_ATTRIBUTE_NMTOKEN':'','XML_ATTRIBUTE_NMTOKENS':'','XML_ATTRIBUTE_ENUMERATION':'','XML_ATTRIBUTE_NOTATION':'','DOM_PHP_ERR':'','DOM_INDEX_SIZE_ERR':'','DOMSTRING_SIZE_ERR':'','DOM_HIERARCHY_REQUEST_ERR':'','DOM_WRONG_DOCUMENT_ERR':'','DOM_INVALID_CHARACTER_ERR':'','DOM_NO_DATA_ALLOWED_ERR':'','DOM_NO_MODIFICATION_ALLOWED_ERR':'','DOM_NOT_FOUND_ERR':'','DOM_NOT_SUPPORTED_ERR':'','DOM_INUSE_ATTRIBUTE_ERR':'','DOM_INVALID_STATE_ERR':'','DOM_SYNTAX_ERR':'','DOM_INVALID_MODIFICATION_ERR':'','DOM_NAMESPACE_ERR':'','DOM_INVALID_ACCESS_ERR':'','DOM_VALIDATION_ERR':'','DOM_NOT_FOUND_ERROR':'','DOM_NOT_FOUND':'',} 2848a6878375SBram Moolenaarlet php_builtin['constants']['command_line_usage']={'PHP_SAPI':'','STDIN':'','STDOUT':'','STDERR':'',} 2849a6878375SBram Moolenaarlet php_builtin['constants']['handling_file_uploads']={'UPLOAD_ERR_OK':'','UPLOAD_ERR_INI_SIZE':'','UPLOAD_ERR_FORM_SIZE':'','UPLOAD_ERR_PARTIAL':'','UPLOAD_ERR_NO_FILE':'','UPLOAD_ERR_NO_TMP_DIR':'','UPLOAD_ERR_CANT_WRITE':'','UPLOAD_ERR_EXTENSION':'',} 2850a6878375SBram Moolenaarlet php_builtin['constants']['fileinfo']={'FILEINFO_NONE':'','FILEINFO_SYMLINK':'','FILEINFO_MIME_TYPE':'','FILEINFO_MIME_ENCODING':'','FILEINFO_MIME':'','FILEINFO_COMPRESS':'','FILEINFO_DEVICES':'','FILEINFO_CONTINUE':'','FILEINFO_PRESERVE_ATIME':'','FILEINFO_RAW':'',} 2851a6878375SBram Moolenaarlet php_builtin['constants']['filesystem']={'SEEK_SET':'','SEEK_CUR':'','SEEK_END':'','LOCK_SH':'','LOCK_EX':'','LOCK_UN':'','LOCK_NB':'','GLOB_BRACE':'','GLOB_ONLYDIR':'','GLOB_MARK':'','GLOB_NOSORT':'','GLOB_NOCHECK':'','GLOB_NOESCAPE':'','GLOB_AVAILABLE_FLAGS':'','PATHINFO_DIRNAME':'','PATHINFO_BASENAME':'','PATHINFO_EXTENSION':'','PATHINFO_FILENAME':'','FILE_USE_INCLUDE_PATH':'','FILE_NO_DEFAULT_CONTEXT':'','FILE_APPEND':'','FILE_IGNORE_NEW_LINES':'','FILE_SKIP_EMPTY_LINES':'','FILE_BINARY':'','FILE_TEXT':'','INI_SCANNER_NORMAL':'','INI_SCANNER_RAW':'','FNM_NOESCAPE':'','FNM_PATHNAME':'','FNM_PERIOD':'','FNM_CASEFOLD':'','GLOB_ERR':'',} 2852a6878375SBram Moolenaarlet php_builtin['constants']['filter']={'FILTER_FLAG_NO_ENCODE_QUOTES':'','INPUT_POST':'','INPUT_GET':'','INPUT_COOKIE':'','INPUT_ENV':'','INPUT_SERVER':'','INPUT_SESSION':'','INPUT_REQUEST':'','FILTER_FLAG_NONE':'','FILTER_REQUIRE_SCALAR':'','FILTER_REQUIRE_ARRAY':'','FILTER_FORCE_ARRAY':'','FILTER_NULL_ON_FAILURE':'','FILTER_VALIDATE_INT':'','FILTER_VALIDATE_BOOLEAN':'','FILTER_VALIDATE_FLOAT':'','FILTER_VALIDATE_REGEXP':'','FILTER_VALIDATE_URL':'','FILTER_VALIDATE_EMAIL':'','FILTER_VALIDATE_IP':'','FILTER_DEFAULT':'','FILTER_UNSAFE_RAW':'','FILTER_SANITIZE_STRING':'','FILTER_SANITIZE_STRIPPED':'','FILTER_SANITIZE_ENCODED':'','FILTER_SANITIZE_SPECIAL_CHARS':'','FILTER_SANITIZE_EMAIL':'','FILTER_SANITIZE_URL':'','FILTER_SANITIZE_NUMBER_INT':'','FILTER_SANITIZE_NUMBER_FLOAT':'','FILTER_SANITIZE_MAGIC_QUOTES':'','FILTER_CALLBACK':'','FILTER_FLAG_ALLOW_OCTAL':'','FILTER_FLAG_ALLOW_HEX':'','FILTER_FLAG_STRIP_LOW':'','FILTER_FLAG_STRIP_HIGH':'','FILTER_FLAG_ENCODE_LOW':'','FILTER_FLAG_ENCODE_HIGH':'','FILTER_FLAG_ENCODE_AMP':'','FILTER_FLAG_EMPTY_STRING_NULL':'','FILTER_FLAG_ALLOW_FRACTION':'','FILTER_FLAG_ALLOW_THOUSAND':'','FILTER_FLAG_ALLOW_SCIENTIFIC':'','FILTER_FLAG_PATH_REQUIRED':'','FILTER_FLAG_QUERY_REQUIRED':'','FILTER_FLAG_IPV4':'','FILTER_FLAG_IPV6':'','FILTER_FLAG_NO_RES_RANGE':'','FILTER_FLAG_NO_PRIV_RANGE':'','FILTER_SANITIZE_RAW':'','FILTER_SANITIZE_FULL_SPECIAL_CHARS':'','ENT_QUOTES':'',} 2853a6878375SBram Moolenaarlet php_builtin['constants']['php_options_info']={'ASSERT_CALLBACK':'','RUSAGE_CHILDREN':'','PHP_SAPI':'','PHP_OS':'','CREDITS_DOCS':'','CREDITS_GENERAL':'','CREDITS_GROUP':'','CREDITS_MODULES':'','CREDITS_FULLPAGE':'','PHP_VERSION_ID':'','PHP_VERSION':'','PATH_SEPARATOR':'','CREDITS_SAPI':'','CREDITS_QA':'','CREDITS_ALL':'','INFO_GENERAL':'','INFO_CREDITS':'','INFO_CONFIGURATION':'','INFO_MODULES':'','INFO_ENVIRONMENT':'','INFO_VARIABLES':'','INFO_LICENSE':'','INFO_ALL':'','ASSERT_ACTIVE':'','ASSERT_BAIL':'','ASSERT_WARNING':'','ASSERT_QUIET_EVAL':'','PHP_WINDOWS_VERSION_MAJOR':'','PHP_WINDOWS_VERSION_MINOR':'','PHP_WINDOWS_VERSION_BUILD':'','PHP_WINDOWS_VERSION_PLATFORM':'','PHP_WINDOWS_VERSION_SP_MAJOR':'','PHP_WINDOWS_VERSION_SP_MINOR':'','PHP_WINDOWS_VERSION_SUITEMASK':'','PHP_WINDOWS_VERSION_PRODUCTTYPE':'','PHP_WINDOWS_NT_DOMAIN_CONTROLLER':'','PHP_WINDOWS_NT_SERVER':'','PHP_WINDOWS_NT_WORKSTATION':'',} 2854a6878375SBram Moolenaarlet php_builtin['constants']['strings']={'CRYPT_SALT_LENGTH':'','CRYPT_STD_DES':'','CRYPT_EXT_DES':'','CRYPT_MD5':'','CRYPT_BLOWFISH':'','CRYPT_SHA256':'','CRYPT_SHA512':'','HTML_ENTITIES':'','HTML_SPECIALCHARS':'','ENT_COMPAT':'','ENT_QUOTES':'','ENT_NOQUOTES':'','ENT_HTML401':'','ENT_XML1':'','ENT_XHTML':'','ENT_HTML5':'','ENT_IGNORE':'','ENT_SUBSTITUTE':'','ENT_DISALLOWED':'','CHAR_MAX':'','LC_MONETARY':'','AM_STR':'','PM_STR':'','D_T_FMT':'','D_FMT':'','T_FMT':'','T_FMT_AMPM':'','ERA':'','ERA_YEAR':'','ERA_D_T_FMT':'','ERA_D_FMT':'','ERA_T_FMT':'','INT_CURR_SYMBOL':'','CURRENCY_SYMBOL':'','CRNCYSTR':'','MON_DECIMAL_POINT':'','MON_THOUSANDS_SEP':'','MON_GROUPING':'','POSITIVE_SIGN':'','NEGATIVE_SIGN':'','INT_FRAC_DIGITS':'','FRAC_DIGITS':'','P_CS_PRECEDES':'','P_SEP_BY_SPACE':'','N_CS_PRECEDES':'','N_SEP_BY_SPACE':'','P_SIGN_POSN':'','N_SIGN_POSN':'','DECIMAL_POINT':'','RADIXCHAR':'','THOUSANDS_SEP':'','THOUSEP':'','GROUPING':'','YESEXPR':'','NOEXPR':'','YESSTR':'','NOSTR':'','CODESET':'','LC_ALL':'','LC_COLLATE':'','LC_CTYPE':'','LC_NUMERIC':'','LC_TIME':'','LC_MESSAGES':'','PHP_INT_MAX':'','STR_PAD_RIGHT':'','STR_PAD_LEFT':'','STR_PAD_BOTH':'',} 2855a6878375SBram Moolenaarlet php_builtin['constants']['error_handling']={'DEBUG_BACKTRACE_PROVIDE_OBJECT':'','DEBUG_BACKTRACE_IGNORE_ARGS':'',} 2856a6878375SBram Moolenaarlet php_builtin['constants']['math']={'PHP_INT_MAX':'','M_PI':'','PHP_ROUND_HALF_UP':'','PHP_ROUND_HALF_DOWN':'','PHP_ROUND_HALF_EVEN':'','PHP_ROUND_HALF_ODD':'','M_E':'','M_LOG2E':'','M_LOG10E':'','M_LN2':'','M_LN10':'','M_PI_2':'','M_PI_4':'','M_1_PI':'','M_2_PI':'','M_SQRTPI':'','M_2_SQRTPI':'','M_SQRT2':'','M_SQRT3':'','M_SQRT1_2':'','M_LNPI':'','M_EULER':'','NAN':'','INF':'',} 2857a6878375SBram Moolenaarlet php_builtin['constants']['network']={'LOG_EMERG':'','LOG_ALERT':'','LOG_CRIT':'','LOG_ERR':'','LOG_WARNING':'','LOG_NOTICE':'','LOG_INFO':'','LOG_DEBUG':'','LOG_KERN':'','LOG_USER':'','LOG_MAIL':'','LOG_DAEMON':'','LOG_AUTH':'','LOG_SYSLOG':'','LOG_LPR':'','LOG_NEWS':'','LOG_CRON':'','LOG_AUTHPRIV':'','LOG_LOCAL0':'','LOG_LOCAL1':'','LOG_LOCAL2':'','LOG_LOCAL3':'','LOG_LOCAL4':'','LOG_LOCAL5':'','LOG_LOCAL6':'','LOG_LOCAL7':'','LOG_PID':'','LOG_CONS':'','LOG_ODELAY':'','LOG_NDELAY':'','LOG_NOWAIT':'','LOG_PERROR':'','DNS_A':'','DNS_CNAME':'','DNS_HINFO':'','DNS_MX':'','DNS_NS':'','DNS_PTR':'','DNS_SOA':'','DNS_TXT':'','DNS_AAAA':'','DNS_SRV':'','DNS_NAPTR':'','DNS_A6':'','DNS_ALL':'','DNS_ANY':'','SID':'','LOG_UUCP':'',} 2858a6878375SBram Moolenaarlet php_builtin['constants']['urls']={'PHP_QUERY_RFC1738':'','PHP_QUERY_RFC3986':'','PHP_URL_SCHEME':'','PHP_URL_HOST':'','PHP_URL_PORT':'','PHP_URL_USER':'','PHP_URL_PASS':'','PHP_URL_PATH':'','PHP_URL_QUERY':'','PHP_URL_FRAGMENT':'',} 2859a6878375SBram Moolenaarlet php_builtin['constants']['gd']={'IMAGETYPE_GIF':'','IMAGETYPE_JPEG':'','IMAGETYPE_PNG':'','IMAGETYPE_SWF':'','IMAGETYPE_PSD':'','IMAGETYPE_BMP':'','IMAGETYPE_TIFF_II':'','IMAGETYPE_TIFF_MM':'','IMAGETYPE_JPC':'','IMAGETYPE_JP2':'','IMAGETYPE_JPX':'','IMAGETYPE_JB2':'','IMAGETYPE_SWC':'','IMAGETYPE_IFF':'','IMAGETYPE_WBMP':'','IMAGETYPE_XBM':'','IMAGETYPE_ICO':'','IMG_CROP_THRESHOLD':'','IMG_ARC_PIE':'','IMG_ARC_CHORD':'','IMG_ARC_NOFILL':'','IMG_ARC_EDGED':'','IMG_FILTER_NEGATE':'','IMG_FILTER_GRAYSCALE':'','IMG_FILTER_BRIGHTNESS':'','IMG_FILTER_CONTRAST':'','IMG_FILTER_COLORIZE':'','IMG_FILTER_EDGEDETECT':'','IMG_FILTER_EMBOSS':'','IMG_FILTER_GAUSSIAN_BLUR':'','IMG_FILTER_SELECTIVE_BLUR':'','IMG_FILTER_MEAN_REMOVAL':'','IMG_FILTER_SMOOTH':'','IMG_FILTER_PIXELATE':'','IMG_FLIP_HORIZONTAL':'','IMG_FLIP_VERTICAL':'','IMG_FLIP_BOTH':'','IMG_GD2_RAW':'','IMG_GD2_COMPRESSED':'','IMG_EFFECT_REPLACE':'','IMG_EFFECT_ALPHABLEND':'','IMG_EFFECT_NORMAL':'','IMG_EFFECT_OVERLAY':'','PNG_NO_FILTER':'','PNG_ALL_FILTERS':'','IMG_NEAREST_NEIGHBOUR':'','IMG_BILINEAR_FIXED':'','IMG_BICUBIC':'','IMG_BICUBIC_FIXED':'','IMG_COLOR_BRUSHED':'','IMG_COLOR_STYLEDBRUSHED':'','IMG_BELL':'','IMG_BESSEL':'','IMG_BLACKMAN':'','IMG_BOX':'','IMG_BSPLINE':'','IMG_CATMULLROM':'','IMG_GAUSSIAN':'','IMG_GENERALIZED_CUBIC':'','IMG_HERMITE':'','IMG_HAMMING':'','IMG_HANNING':'','IMG_MITCHELL':'','IMG_POWER':'','IMG_QUADRATIC':'','IMG_SINC':'','IMG_WEIGHTED4':'','IMG_TRIANGLE':'','IMG_COLOR_STYLED':'','IMG_COLOR_TRANSPARENT':'','IMG_COLOR_TILED':'','IMG_GIF':'','IMG_JPG':'','IMG_PNG':'','IMG_WBMP':'','IMG_XPM':'','GD_VERSION':'','GD_MAJOR_VERSION':'','GD_MINOR_VERSION':'','GD_RELEASE_VERSION':'','GD_EXTRA_VERSION':'','GD_BUNDLED':'','IMG_JPEG':'','IMG_ARC_ROUNDED':'','IMAGETYPE_JPEG2000':'','PNG_FILTER_NONE':'','PNG_FILTER_SUB':'','PNG_FILTER_UP':'','PNG_FILTER_AVG':'','PNG_FILTER_PAETH':'',} 2860a6878375SBram Moolenaarlet php_builtin['constants']['json']={'JSON_BIGINT_AS_STRING':'','JSON_HEX_QUOT':'','JSON_HEX_TAG':'','JSON_HEX_AMP':'','JSON_HEX_APOS':'','JSON_NUMERIC_CHECK':'','JSON_PRETTY_PRINT':'','JSON_UNESCAPED_SLASHES':'','JSON_FORCE_OBJECT':'','JSON_UNESCAPED_UNICODE':'','JSON_ERROR_NONE':'','JSON_ERROR_DEPTH':'','JSON_ERROR_STATE_MISMATCH':'','JSON_ERROR_CTRL_CHAR':'','JSON_ERROR_SYNTAX':'','JSON_ERROR_UTF8':'','JSON_ERROR_RECURSION':'','JSON_ERROR_INF_OR_NAN':'','NAN':'','INF':'','JSON_ERROR_UNSUPPORTED_TYPE':'','JSON_PARTIAL_OUTPUT_ON_ERROR':'',} 2861a6878375SBram Moolenaarlet php_builtin['constants']['multibyte_string']={'MB_CASE_UPPER':'','MB_CASE_LOWER':'','MB_CASE_TITLE':'','MB_OVERLOAD_MAIL':'','MB_OVERLOAD_STRING':'','MB_OVERLOAD_REGEX':'',} 2862a6878375SBram Moolenaarlet php_builtin['constants']['mssql']={'SQLTEXT':'','SQLVARCHAR':'','SQLCHAR':'','SQLINT1':'','SQLINT2':'','SQLINT4':'','SQLBIT':'','SQLFLT4':'','SQLFLT8':'','SQLFLTN':'','MSSQL_ASSOC':'','MSSQL_NUM':'','MSSQL_BOTH':'',} 2863a6878375SBram Moolenaarlet php_builtin['constants']['mysql']={'MYSQL_CLIENT_SSL':'','MYSQL_CLIENT_COMPRESS':'','MYSQL_CLIENT_IGNORE_SPACE':'','MYSQL_CLIENT_INTERACTIVE':'','MYSQL_ASSOC':'','MYSQL_NUM':'','MYSQL_BOTH':'','MYSQL_PORT':'',} 2864a6878375SBram Moolenaarlet php_builtin['constants']['output_control']={'PHP_OUTPUT_HANDLER_STDFLAGS':'','PHP_OUTPUT_HANDLER_CLEANABLE':'','PHP_OUTPUT_HANDLER_FLUSHABLE':'','PHP_OUTPUT_HANDLER_REMOVABLE':'','PHP_OUTPUT_HANDLER_START':'','PHP_OUTPUT_HANDLER_WRITE':'','PHP_OUTPUT_HANDLER_FLUSH':'','PHP_OUTPUT_HANDLER_CLEAN':'','PHP_OUTPUT_HANDLER_FINAL':'','PHP_OUTPUT_HANDLER_CONT':'','PHP_OUTPUT_HANDLER_END':'',} 2865a6878375SBram Moolenaarlet php_builtin['constants']['password_hashing']={'PASSWORD_DEFAULT':'','PASSWORD_BCRYPT':'','CRYPT_BLOWFISH':'',} 2866a6878375SBram Moolenaarlet php_builtin['constants']['postgresql']={'PGSQL_CONNECT_FORCE_NEW':'','PGSQL_CONNECTION_OK':'','PGSQL_CONNECTION_BAD':'','PGSQL_CONV_IGNORE_DEFAULT':'','PGSQL_CONV_FORCE_NULL':'','PGSQL_CONV_IGNORE_NOT_NULL':'','PGSQL_DML_NO_CONV':'','PGSQL_DML_ESCAPE':'','PGSQL_DML_EXEC':'','PGSQL_DML_ASYNC':'','PGSQL_DML_STRING':'','PGSQL_ASSOC':'','PGSQL_NUM':'','PGSQL_BOTH':'','PGSQL_CONV_OPTS':'','INV_READ':'','INV_WRITE':'','INV_ARCHIVE':'','PGSQL_SEEK_SET':'','PGSQL_SEEK_CUR':'','PGSQL_SEEK_END':'','PGSQL_DIAG_SEVERITY':'','PGSQL_DIAG_SQLSTATE':'','PGSQL_DIAG_MESSAGE_PRIMARY':'','PGSQL_DIAG_MESSAGE_DETAIL':'','PGSQL_DIAG_MESSAGE_HINT':'','PGSQL_DIAG_STATEMENT_POSITION':'','PGSQL_DIAG_INTERNAL_POSITION':'','PGSQL_DIAG_INTERNAL_QUERY':'','PGSQL_DIAG_CONTEXT':'','PGSQL_DIAG_SOURCE_FILE':'','PGSQL_DIAG_SOURCE_LINE':'','PGSQL_DIAG_SOURCE_FUNCTION':'','PGSQL_STATUS_LONG':'','PGSQL_STATUS_STRING':'','PGSQL_EMPTY_QUERY':'','PGSQL_COMMAND_OK':'','PGSQL_TUPLES_OK':'','PGSQL_COPY_OUT':'','PGSQL_COPY_IN':'','PGSQL_BAD_RESPONSE':'','PGSQL_NONFATAL_ERROR':'','PGSQL_FATAL_ERROR':'','PGSQL_ERRORS_TERSE':'','PGSQL_ERRORS_DEFAULT':'','PGSQL_ERRORS_VERBOSE':'','PGSQL_TRANSACTION_IDLE':'','PGSQL_TRANSACTION_ACTIVE':'','PGSQL_TRANSACTION_INTRANS':'','PGSQL_TRANSACTION_INERROR':'','PGSQL_TRANSACTION_UNKNOWN':'','PG_DIAG_STATEMENT_POSITION':'','PG_DIAG_INTERNAL_QUERY':'',} 2867a6878375SBram Moolenaarlet php_builtin['constants']['pcre']={'PREG_GREP_INVERT':'','PREG_NO_ERROR':'','PREG_INTERNAL_ERROR':'','PREG_BACKTRACK_LIMIT_ERROR':'','PREG_RECURSION_LIMIT_ERROR':'','PREG_BAD_UTF8_ERROR':'','PREG_BAD_UTF8_OFFSET_ERROR':'','PREG_PATTERN_ORDER':'','PREG_SET_ORDER':'','PREG_OFFSET_CAPTURE':'','PREG_SPLIT_NO_EMPTY':'','PREG_SPLIT_DELIM_CAPTURE':'','PREG_SPLIT_OFFSET_CAPTURE':'','PCRE_VERSION':'',} 2868a6878375SBram Moolenaarlet php_builtin['constants']['program_execution']={'STDIN':'',} 2869a6878375SBram Moolenaarlet php_builtin['constants']['sessions']={'SID':'','PHP_SESSION_DISABLED':'','PHP_SESSION_NONE':'','PHP_SESSION_ACTIVE':'','UPLOAD_ERR_EXTENSION':'',} 2870a6878375SBram Moolenaarlet php_builtin['constants']['variable_handling']={'PHP_INT_MAX':'',} 2871a6878375SBram Moolenaarlet php_builtin['constants']['misc']={'WAIT_IO_COMPLETION':'','CONNECTION_ABORTED':'','CONNECTION_NORMAL':'','CONNECTION_TIMEOUT':'',} 2872a6878375SBram Moolenaarlet php_builtin['constants']['streams']={'STREAM_FILTER_READ':'','STREAM_FILTER_WRITE':'','STREAM_FILTER_ALL':'','PHP_INT_MAX':'','STREAM_CLIENT_CONNECT':'','STREAM_CLIENT_ASYNC_CONNECT':'','STREAM_CLIENT_PERSISTENT':'','STREAM_CRYPTO_METHOD_TLS_CLIENT':'','STREAM_CRYPTO_METHOD_TLS_SERVER':'','STREAM_PF_INET':'','STREAM_PF_INET6':'','STREAM_PF_UNIX':'','STREAM_SOCK_DGRAM':'','STREAM_SOCK_RAW':'','STREAM_SOCK_RDM':'','STREAM_SOCK_SEQPACKET':'','STREAM_SOCK_STREAM':'','STREAM_IPPROTO_ICMP':'','STREAM_IPPROTO_IP':'','STREAM_IPPROTO_RAW':'','STREAM_IPPROTO_TCP':'','STREAM_IPPROTO_UDP':'','STREAM_OOB':'','STREAM_PEEK':'','AF_INET':'','STREAM_SERVER_BIND':'','STREAM_SHUT_RD':'','STREAM_SHUT_WR':'','STREAM_SHUT_RDWR':'','STREAM_IS_URL':'','PSFS_PASS_ON':'','PSFS_FEED_ME':'','PSFS_ERR_FATAL':'','PSFS_FLAG_NORMAL':'','PSFS_FLAG_FLUSH_INC':'','PSFS_FLAG_FLUSH_CLOSE':'','STREAM_USE_PATH':'','STREAM_REPORT_ERRORS':'','STREAM_SERVER_LISTEN':'','STREAM_NOTIFY_RESOLVE':'','STREAM_NOTIFY_CONNECT':'','STREAM_NOTIFY_AUTH_REQUIRED':'','STREAM_NOTIFY_SEVERITY_ERR':'','STREAM_NOTIFY_MIME_TYPE_IS':'','STREAM_NOTIFY_FILE_SIZE_IS':'','STREAM_NOTIFY_REDIRECTED':'','STREAM_NOTIFY_PROGRESS':'','STREAM_NOTIFY_COMPLETED':'','STREAM_NOTIFY_FAILURE':'','STREAM_NOTIFY_AUTH_RESULT':'','STREAM_NOTIFY_SEVERITY_INFO':'','STREAM_NOTIFY_SEVERITY_WARN':'','STREAM_CAST_FOR_SELECT':'','STREAM_CAST_AS_STREAM':'','STREAM_META_TOUCH':'','STREAM_META_OWNER':'','STREAM_META_OWNER_NAME':'','STREAM_META_GROUP':'','STREAM_META_GROUP_NAME':'','STREAM_META_ACCESS':'','STREAM_MKDIR_RECURSIVE':'','LOCK_EX':'','LOCK_UN':'','LOCK_SH':'','LOCK_NB':'','SEEK_SET':'','SEEK_CUR':'','SEEK_END':'','STREAM_OPTION_BLOCKING':'','STREAM_OPTION_READ_TIMEOUT':'','STREAM_OPTION_WRITE_BUFFER':'','STREAM_BUFFER_NONE':'','STREAM_BUFFER_FULL':'',} 2873a6878375SBram Moolenaarlet php_builtin['constants']['iconv']={'ICONV_IMPL':'','ICONV_VERSION':'','ICONV_MIME_DECODE_STRICT':'','ICONV_MIME_DECODE_CONTINUE_ON_ERROR':'',} 2874a6878375SBram Moolenaarlet php_builtin['constants']['phpini_directives']={'PATH_SEPARATOR':'','PHP_INI_SYSTEM':'',} 2875a6878375SBram Moolenaarlet php_builtin['constants']['types']={'NAN':'','PHP_INT_SIZE':'','PHP_INT_MAX':'',} 2876a6878375SBram Moolenaarlet php_builtin['constants']['pdo']={'PDO_PARAM_BOOL':'',} 2877a6878375SBram Moolenaarlet php_builtin['constants']['list_of_reserved_words']={'PHP_VERSION':'','PHP_MAJOR_VERSION':'','PHP_MINOR_VERSION':'','PHP_RELEASE_VERSION':'','PHP_VERSION_ID':'','PHP_EXTRA_VERSION':'','PHP_ZTS':'','PHP_DEBUG':'','PHP_MAXPATHLEN':'','PHP_OS':'','PHP_SAPI':'','PHP_EOL':'','PHP_INT_MAX':'','PHP_INT_SIZE':'','DEFAULT_INCLUDE_PATH':'','PEAR_INSTALL_DIR':'','PEAR_EXTENSION_DIR':'','PHP_EXTENSION_DIR':'','PHP_PREFIX':'','PHP_BINDIR':'','PHP_BINARY':'','PHP_MANDIR':'','PHP_LIBDIR':'','PHP_DATADIR':'','PHP_SYSCONFDIR':'','PHP_LOCALSTATEDIR':'','PHP_CONFIG_FILE_PATH':'','PHP_CONFIG_FILE_SCAN_DIR':'','PHP_SHLIB_SUFFIX':'',} 2878a6878375SBram Moolenaarlet php_builtin['constants']['php_type_comparison_tables']={'NAN':'',} 2879a6878375SBram Moolenaar 2880a6878375SBram Moolenaar" Built in functions 2881a6878375SBram Moolenaarlet g:php_builtin_functions = {} 2882a6878375SBram Moolenaarfor [ext, data] in items(php_builtin['functions']) 2883a6878375SBram Moolenaar call extend(g:php_builtin_functions, data) 2884a6878375SBram Moolenaarendfor 2885a6878375SBram Moolenaar 2886*6c391a74SBram Moolenaar" Built in class 2887a6878375SBram Moolenaarlet g:php_builtin_classes = {} 2888a6878375SBram Moolenaarfor [ext, data] in items(php_builtin['classes']) 2889a6878375SBram Moolenaar call extend(g:php_builtin_classes, data) 2890a6878375SBram Moolenaarendfor 2891a6878375SBram Moolenaar 2892a6878375SBram Moolenaar" Built in interfaces 2893a6878375SBram Moolenaarlet g:php_builtin_interfaces = {} 2894a6878375SBram Moolenaarfor [ext, data] in items(php_builtin['interfaces']) 2895a6878375SBram Moolenaar call extend(g:php_builtin_interfaces, data) 2896a6878375SBram Moolenaarendfor 2897a6878375SBram Moolenaar 2898a6878375SBram Moolenaar" Built in constants 2899a6878375SBram Moolenaarlet g:php_constants = {} 2900a6878375SBram Moolenaarfor [ext, data] in items(php_builtin['constants']) 2901a6878375SBram Moolenaar call extend(g:php_constants, data) 2902a6878375SBram Moolenaarendfor 2903a6878375SBram Moolenaar 2904*6c391a74SBram Moolenaar" When the classname not found or found but the tags doesn't contain that 2905*6c391a74SBram Moolenaar" class we will try to complete any method of any builtin class. To speed up 2906a6878375SBram Moolenaar" that lookup we compile a 'ClassName::MethodName':'info' dictionary from the 2907*6c391a74SBram Moolenaar" builtin class information 2908a6878375SBram Moolenaarlet g:php_builtin_object_functions = {} 2909a6878375SBram Moolenaar 2910a6878375SBram Moolenaar" When completing for 'everyting imaginable' (no class context, not a 2911a6878375SBram Moolenaar" variable) we need a list of built-in classes in a format of {'classname':''} 2912a6878375SBram Moolenaar" for performance reasons we precompile this too 2913a6878375SBram Moolenaarlet g:php_builtin_classnames = {} 2914a6878375SBram Moolenaar 2915a6878375SBram Moolenaar" In order to reduce file size, empty keys are omitted from class structures. 2916a6878375SBram Moolenaar" To make the structure of in-memory hashes normalized we will add them in runtime 2917a6878375SBram Moolenaarlet required_class_hash_keys = ['constants', 'properties', 'static_properties', 'methods', 'static_methods'] 2918a6878375SBram Moolenaar 2919a6878375SBram Moolenaarfor [classname, class_info] in items(g:php_builtin_classes) 2920a6878375SBram Moolenaar for property_name in required_class_hash_keys 2921a6878375SBram Moolenaar if !has_key(class_info, property_name) 2922a6878375SBram Moolenaar let class_info[property_name] = {} 2923a6878375SBram Moolenaar endif 2924a6878375SBram Moolenaar endfor 2925a6878375SBram Moolenaar 2926822ff866SBram Moolenaar let g:php_builtin_classnames[classname] = '' 2927a6878375SBram Moolenaar for [method_name, method_info] in items(class_info.methods) 2928a6878375SBram Moolenaar let g:php_builtin_object_functions[classname.'::'.method_name.'('] = method_info.signature 2929a6878375SBram Moolenaar endfor 2930a6878375SBram Moolenaar for [method_name, method_info] in items(class_info.static_methods) 2931a6878375SBram Moolenaar let g:php_builtin_object_functions[classname.'::'.method_name.'('] = method_info.signature 2932a6878375SBram Moolenaar endfor 2933a6878375SBram Moolenaarendfor 2934a6878375SBram Moolenaar 2935a6878375SBram Moolenaarlet g:php_builtin_interfacenames = {} 2936a6878375SBram Moolenaarfor [interfacename, info] in items(g:php_builtin_interfaces) 2937a6878375SBram Moolenaar for property_name in required_class_hash_keys 2938a6878375SBram Moolenaar if !has_key(class_info, property_name) 2939a6878375SBram Moolenaar let class_info[property_name] = {} 2940a6878375SBram Moolenaar endif 2941a6878375SBram Moolenaar endfor 2942a6878375SBram Moolenaar 2943a6878375SBram Moolenaar let g:php_builtin_interfacenames[interfacename] = '' 2944a6878375SBram Moolenaar for [method_name, method_info] in items(class_info.methods) 2945822ff866SBram Moolenaar let g:php_builtin_object_functions[interfacename.'::'.method_name.'('] = method_info.signature 2946a6878375SBram Moolenaar endfor 2947a6878375SBram Moolenaar for [method_name, method_info] in items(class_info.static_methods) 2948822ff866SBram Moolenaar let g:php_builtin_object_functions[interfacename.'::'.method_name.'('] = method_info.signature 2949a6878375SBram Moolenaar endfor 2950a6878375SBram Moolenaarendfor 2951a6878375SBram Moolenaar 2952a6878375SBram Moolenaar 2953a6878375SBram Moolenaar" Add control structures (they are outside regular pattern of PHP functions) 2954a6878375SBram Moolenaarlet php_control = { 2955a6878375SBram Moolenaar \ 'include(': 'string filename | resource', 2956a6878375SBram Moolenaar \ 'include_once(': 'string filename | resource', 2957a6878375SBram Moolenaar \ 'require(': 'string filename | resource', 2958a6878375SBram Moolenaar \ 'require_once(': 'string filename | resource', 2959a6878375SBram Moolenaar \ } 2960a6878375SBram Moolenaarcall extend(g:php_builtin_functions, php_control) 2961a6878375SBram Moolenaar 2962a6878375SBram Moolenaar 2963a6878375SBram Moolenaar" Built-in variables " {{{ 2964a6878375SBram Moolenaarlet g:php_builtin_vars ={ 2965a6878375SBram Moolenaar \ '$GLOBALS':'', 2966ceaf7b8bSBram Moolenaar \ '$_SERVER':'', 2967ceaf7b8bSBram Moolenaar \ '$_GET':'', 2968ceaf7b8bSBram Moolenaar \ '$_POST':'', 2969ceaf7b8bSBram Moolenaar \ '$_COOKIE':'', 2970ceaf7b8bSBram Moolenaar \ '$_FILES':'', 2971ceaf7b8bSBram Moolenaar \ '$_ENV':'', 2972ceaf7b8bSBram Moolenaar \ '$_REQUEST':'', 2973ceaf7b8bSBram Moolenaar \ '$_SESSION':'', 2974ceaf7b8bSBram Moolenaar \ '$HTTP_SERVER_VARS':'', 2975ceaf7b8bSBram Moolenaar \ '$HTTP_ENV_VARS':'', 2976ceaf7b8bSBram Moolenaar \ '$HTTP_COOKIE_VARS':'', 2977ceaf7b8bSBram Moolenaar \ '$HTTP_GET_VARS':'', 2978ceaf7b8bSBram Moolenaar \ '$HTTP_POST_VARS':'', 2979ceaf7b8bSBram Moolenaar \ '$HTTP_POST_FILES':'', 2980ceaf7b8bSBram Moolenaar \ '$HTTP_SESSION_VARS':'', 2981ceaf7b8bSBram Moolenaar \ '$php_errormsg':'', 2982a6878375SBram Moolenaar \ '$this':'', 2983ceaf7b8bSBram Moolenaar \ } 2984ceaf7b8bSBram Moolenaar" }}} 2985910f66f9SBram Moolenaarendfunction 2986910f66f9SBram Moolenaar" }}} 2987910f66f9SBram Moolenaar 2988a6878375SBram Moolenaar" vim: foldmethod=marker:noexpandtab:ts=8:sts=4 2989