11ef15e30SBram Moolenaar" Vim completion script 21ef15e30SBram Moolenaar" Language: Java Script 3*e7b1ea02SBram Moolenaar" Maintainer: Jay Sitter ([email protected]) 4*e7b1ea02SBram Moolenaar" URL: https://github.com/jsit/javascriptcomplete.vim/ 5*e7b1ea02SBram Moolenaar" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) 6*e7b1ea02SBram Moolenaar" Last Change: 2020 Jul 30 71ef15e30SBram Moolenaar 81ef15e30SBram Moolenaarfunction! javascriptcomplete#CompleteJS(findstart, base) 91ef15e30SBram Moolenaar if a:findstart 101ef15e30SBram Moolenaar " locate the start of the word 111ef15e30SBram Moolenaar let line = getline('.') 121ef15e30SBram Moolenaar let start = col('.') - 1 131ef15e30SBram Moolenaar let curline = line('.') 141ef15e30SBram Moolenaar let compl_begin = col('.') - 2 151ef15e30SBram Moolenaar " Bit risky but JS is rather limited language and local chars shouldn't 161ef15e30SBram Moolenaar " fint way into names 171d2ba7faSBram Moolenaar while start >= 0 && line[start - 1] =~ '\k' 181ef15e30SBram Moolenaar let start -= 1 191ef15e30SBram Moolenaar endwhile 201ef15e30SBram Moolenaar let b:compl_context = getline('.')[0:compl_begin] 211ef15e30SBram Moolenaar return start 221ef15e30SBram Moolenaar else 231ef15e30SBram Moolenaar " Initialize base return lists 241ef15e30SBram Moolenaar let res = [] 251ef15e30SBram Moolenaar let res2 = [] 261ef15e30SBram Moolenaar " a:base is very short - we need context 271ef15e30SBram Moolenaar " Shortcontext is context without a:base, useful for checking if we are 288b6144bdSBram Moolenaar " looking for objects and for what objects we are looking for 298b6144bdSBram Moolenaar let context = b:compl_context 301ef15e30SBram Moolenaar let shortcontext = substitute(context, a:base.'$', '', '') 311ef15e30SBram Moolenaar unlet! b:compl_context 321ef15e30SBram Moolenaar 338b6144bdSBram Moolenaar if exists("b:jsrange") 348b6144bdSBram Moolenaar let file = getline(b:jsrange[0],b:jsrange[1]) 358b6144bdSBram Moolenaar unlet! b:jsrange 368b6144bdSBram Moolenaar 378b6144bdSBram Moolenaar if len(b:js_extfiles) > 0 388b6144bdSBram Moolenaar let file = b:js_extfiles + file 398b6144bdSBram Moolenaar endif 408b6144bdSBram Moolenaar 418b6144bdSBram Moolenaar else 428b6144bdSBram Moolenaar let file = getline(1, '$') 438b6144bdSBram Moolenaar endif 448b6144bdSBram Moolenaar 458b6144bdSBram Moolenaar 468b6144bdSBram Moolenaar " Completion of properties, methods, etc. {{{ 471ef15e30SBram Moolenaar if shortcontext =~ '\.$' 481ef15e30SBram Moolenaar " Complete methods and properties for objects 491ef15e30SBram Moolenaar " DOM separate 501ef15e30SBram Moolenaar let doms = ['style.'] 511ef15e30SBram Moolenaar " Arrays 521ef15e30SBram Moolenaar let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype'] 531ef15e30SBram Moolenaar let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 541ef15e30SBram Moolenaar \ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf', 551ef15e30SBram Moolenaar \ 'watch', 'unwatch'] 561ef15e30SBram Moolenaar call map(arraymeth, 'v:val."("') 571ef15e30SBram Moolenaar let arrays = arrayprop + arraymeth 581ef15e30SBram Moolenaar 591ef15e30SBram Moolenaar " Boolean - complete subset of array values 601ef15e30SBram Moolenaar " properties - constructor, prototype 611ef15e30SBram Moolenaar " methods - toSource, toString, valueOf 621ef15e30SBram Moolenaar 631ef15e30SBram Moolenaar " Date 641ef15e30SBram Moolenaar " properties - constructor, prototype 651ef15e30SBram Moolenaar let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', 661ef15e30SBram Moolenaar \ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset', 671ef15e30SBram Moolenaar \ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 681ef15e30SBram Moolenaar \ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', 691ef15e30SBram Moolenaar \ 'getYear', 'parse', 'parse', 701ef15e30SBram Moolenaar \ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds', 711ef15e30SBram Moolenaar \ 'setMinutes', 'setMonth', 'setSeconds', 721ef15e30SBram Moolenaar \ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', 731ef15e30SBram Moolenaar \ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime', 741ef15e30SBram Moolenaar \ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString', 751ef15e30SBram Moolenaar \ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch'] 761ef15e30SBram Moolenaar call map(datemeth, 'v:val."("') 771ef15e30SBram Moolenaar let dates = datemeth 781ef15e30SBram Moolenaar 791ef15e30SBram Moolenaar " Function 801ef15e30SBram Moolenaar let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length', 811ef15e30SBram Moolenaar \ 'arity', 'constructor', 'length', 'prototype'] 821ef15e30SBram Moolenaar let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf'] 831ef15e30SBram Moolenaar call map(funcmeth, 'v:val."("') 841ef15e30SBram Moolenaar let funcs = funcprop + funcmeth 851ef15e30SBram Moolenaar 861ef15e30SBram Moolenaar " Math 871ef15e30SBram Moolenaar let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT'] 881ef15e30SBram Moolenaar let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 891ef15e30SBram Moolenaar \ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan', 901ef15e30SBram Moolenaar \ 'watch', 'unwatch'] 911ef15e30SBram Moolenaar call map(mathmeth, 'v:val."("') 921ef15e30SBram Moolenaar let maths = mathprop + mathmeth 931ef15e30SBram Moolenaar 941ef15e30SBram Moolenaar " Number 951ef15e30SBram Moolenaar let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY', 961ef15e30SBram Moolenaar \ 'constructor', 'prototype'] 971ef15e30SBram Moolenaar let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf', 981ef15e30SBram Moolenaar \ 'watch', 'unwatch'] 991ef15e30SBram Moolenaar call map(numbmeth, 'v:val."("') 1001ef15e30SBram Moolenaar let numbs = numbprop + numbmeth 1011ef15e30SBram Moolenaar 1021ef15e30SBram Moolenaar " Object 1031ef15e30SBram Moolenaar let objeprop = ['constructor', 'prototype'] 1041ef15e30SBram Moolenaar let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf'] 1051ef15e30SBram Moolenaar call map(objemeth, 'v:val."("') 1061ef15e30SBram Moolenaar let objes = objeprop + objemeth 1071ef15e30SBram Moolenaar 1081ef15e30SBram Moolenaar " RegExp 1091ef15e30SBram Moolenaar let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype'] 1108b6144bdSBram Moolenaar let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch'] 1111ef15e30SBram Moolenaar call map(regemeth, 'v:val."("') 1121ef15e30SBram Moolenaar let reges = regeprop + regemeth 1131ef15e30SBram Moolenaar 1141ef15e30SBram Moolenaar " String 1151ef15e30SBram Moolenaar let striprop = ['constructor', 'length', 'prototype'] 1161ef15e30SBram Moolenaar let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat', 1171ef15e30SBram Moolenaar \ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics', 1181ef15e30SBram Moolenaar \ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small', 1191ef15e30SBram Moolenaar \ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase', 1201ef15e30SBram Moolenaar \ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch'] 1211ef15e30SBram Moolenaar call map(strimeth, 'v:val."("') 1221ef15e30SBram Moolenaar let stris = striprop + strimeth 1231ef15e30SBram Moolenaar 1241ef15e30SBram Moolenaar " User created properties 1251d2ba7faSBram Moolenaar let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"') 1261ef15e30SBram Moolenaar let juser_props1 = join(user_props1, ' ') 1271ef15e30SBram Moolenaar let user_props1 = split(juser_props1, '\zethis\.') 1281ef15e30SBram Moolenaar unlet! juser_props1 1291d2ba7faSBram Moolenaar call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")') 1308b6144bdSBram Moolenaar 1311d2ba7faSBram Moolenaar let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"') 1328b6144bdSBram Moolenaar let juser_props2 = join(user_props2, ' ') 1338b6144bdSBram Moolenaar let user_props2 = split(juser_props2, '\zeprototype\.') 1348b6144bdSBram Moolenaar unlet! juser_props2 1351d2ba7faSBram Moolenaar call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")') 1361ef15e30SBram Moolenaar let user_props = user_props1 + user_props2 1371ef15e30SBram Moolenaar 1381ef15e30SBram Moolenaar " HTML DOM properties 1391ef15e30SBram Moolenaar " Anchors - anchor. 1401ef15e30SBram Moolenaar let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML', 1411ef15e30SBram Moolenaar \ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus'] 1421ef15e30SBram Moolenaar let anchmeth = ['blur', 'focus'] 1431ef15e30SBram Moolenaar call map(anchmeth, 'v:val."("') 1441ef15e30SBram Moolenaar let anths = anchprop + anchmeth 1451ef15e30SBram Moolenaar " Area - area. 1461ef15e30SBram Moolenaar let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id', 1471ef15e30SBram Moolenaar \ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target'] 1481ef15e30SBram Moolenaar let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver'] 1491ef15e30SBram Moolenaar call map(areameth, 'v:val."("') 1501ef15e30SBram Moolenaar let areas = areaprop + areameth 1511ef15e30SBram Moolenaar " Base - base. 1521ef15e30SBram Moolenaar let baseprop = ['href', 'id', 'target'] 1531ef15e30SBram Moolenaar let bases = baseprop 1541ef15e30SBram Moolenaar " Body - body. 1551ef15e30SBram Moolenaar let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop', 1561ef15e30SBram Moolenaar \ 'text', 'vLink'] 1571ef15e30SBram Moolenaar let bodys = bodyprop 1581ef15e30SBram Moolenaar " Document - document. 159*e7b1ea02SBram Moolenaar let docuprop = ['anchors', 'body', 'characterSet', 'doctype', 160*e7b1ea02SBram Moolenaar \ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms', 161*e7b1ea02SBram Moolenaar \ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet', 162*e7b1ea02SBram Moolenaar \ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts', 163*e7b1ea02SBram Moolenaar \ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets', 164*e7b1ea02SBram Moolenaar \ 'timeline', 'visibilityState', 'cookie', 'defaultView', 165*e7b1ea02SBram Moolenaar \ 'designMode', 'dir', 'domain', 'lastModified', 'location', 166*e7b1ea02SBram Moolenaar \ 'readyState', 'referrer', 'title', 'URL', 'activeElement', 167*e7b1ea02SBram Moolenaar \ 'fullscreenElement', 'styleSheets'] 168*e7b1ea02SBram Moolenaar let documeth = ['adoptNode', 'close', 'createAttribute', 169*e7b1ea02SBram Moolenaar \ 'createAttributeNS', 'createCDATASection', 'createComment', 170*e7b1ea02SBram Moolenaar \ 'createDocumentFragment', 'createElement', 'createElementNS', 171*e7b1ea02SBram Moolenaar \ 'createEvent', 'createExpression', 'createNSResolver', 172*e7b1ea02SBram Moolenaar \ 'createNodeIterator', 'createProcessingInstruction', 'createRange', 173*e7b1ea02SBram Moolenaar \ 'createTextNode', 'createTouchList', 'createTreeWalker', 174*e7b1ea02SBram Moolenaar \ 'enableStyleSheetsForSet', 'evaluate', 'focus', 'getElementById', 175*e7b1ea02SBram Moolenaar \ 'getElementById', 'getElementsByClassName', 'getElementsByName', 176*e7b1ea02SBram Moolenaar \ 'getElementsByTagName', 'getElementsByTagNameNS', 177*e7b1ea02SBram Moolenaar \ 'hasStorageAccess', 'importNode', 'onClick', 'onDblClick', 178*e7b1ea02SBram Moolenaar \ 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onMouseDown', 179*e7b1ea02SBram Moolenaar \ 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 180*e7b1ea02SBram Moolenaar \ 'onResize', 'open', 'querySelector', 'querySelectorAll', 181*e7b1ea02SBram Moolenaar \ 'requestStorageAccess', 'write', 'writeln'] 182*e7b1ea02SBram Moolenaar 1831ef15e30SBram Moolenaar call map(documeth, 'v:val."("') 1848b6144bdSBram Moolenaar let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild', 1858b6144bdSBram Moolenaar \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 1868b6144bdSBram Moolenaar \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling'] 1878b6144bdSBram Moolenaar let docuxmeth = ['createAttribute', 'createCDATASection', 1888b6144bdSBram Moolenaar \ 'createComment', 'createDocument', 'createDocumentFragment', 1898b6144bdSBram Moolenaar \ 'createElement', 'createEntityReference', 'createProcessingInstruction', 1908b6144bdSBram Moolenaar \ 'createTextNode'] 1918b6144bdSBram Moolenaar call map(docuxmeth, 'v:val."("') 1928b6144bdSBram Moolenaar let docus = docuprop + docuxprop + documeth + docuxmeth 1931ef15e30SBram Moolenaar " Form - form. 1941ef15e30SBram Moolenaar let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length', 1951ef15e30SBram Moolenaar \ 'method', 'name', 'tabIndex', 'target'] 1961ef15e30SBram Moolenaar let formmeth = ['reset', 'submit', 'onReset', 'onSubmit'] 1971ef15e30SBram Moolenaar call map(formmeth, 'v:val."("') 1981ef15e30SBram Moolenaar let forms = formprop + formmeth 1991ef15e30SBram Moolenaar " Frame - frame. 2001ef15e30SBram Moolenaar let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth', 2011ef15e30SBram Moolenaar \ 'name', 'noResize', 'scrolling', 'src'] 2021ef15e30SBram Moolenaar let frammeth = ['blur', 'focus'] 2031ef15e30SBram Moolenaar call map(frammeth, 'v:val."("') 2041ef15e30SBram Moolenaar let frams = framprop + frammeth 2051ef15e30SBram Moolenaar " Frameset - frameset. 2061ef15e30SBram Moolenaar let fsetprop = ['cols', 'id', 'rows'] 2071ef15e30SBram Moolenaar let fsetmeth = ['blur', 'focus'] 2081ef15e30SBram Moolenaar call map(fsetmeth, 'v:val."("') 2091ef15e30SBram Moolenaar let fsets = fsetprop + fsetmeth 2101ef15e30SBram Moolenaar " History - history. 2111ef15e30SBram Moolenaar let histprop = ['length'] 2121ef15e30SBram Moolenaar let histmeth = ['back', 'forward', 'go'] 2131ef15e30SBram Moolenaar call map(histmeth, 'v:val."("') 2141ef15e30SBram Moolenaar let hists = histprop + histmeth 2151ef15e30SBram Moolenaar " Iframe - iframe. 2161ef15e30SBram Moolenaar let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth', 2171ef15e30SBram Moolenaar \ 'name', 'scrolling', 'src', 'width'] 2181ef15e30SBram Moolenaar let ifras = ifraprop 2191ef15e30SBram Moolenaar " Image - image. 2201ef15e30SBram Moolenaar let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc', 2218b6144bdSBram Moolenaar \ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width'] 2221ef15e30SBram Moolenaar let imagmeth = ['onAbort', 'onError', 'onLoad'] 2231ef15e30SBram Moolenaar call map(imagmeth, 'v:val."("') 2241ef15e30SBram Moolenaar let imags = histprop + imagmeth 2251ef15e30SBram Moolenaar " Button - accessible only by other properties 2261ef15e30SBram Moolenaar let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2271ef15e30SBram Moolenaar let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] 2281ef15e30SBram Moolenaar call map(buttmeth, 'v:val."("') 2291ef15e30SBram Moolenaar let butts = buttprop + buttmeth 2301ef15e30SBram Moolenaar " Checkbox - accessible only by other properties 2311ef15e30SBram Moolenaar let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 2321ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2331ef15e30SBram Moolenaar let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] 2341ef15e30SBram Moolenaar call map(checmeth, 'v:val."("') 2351ef15e30SBram Moolenaar let checs = checprop + checmeth 2361ef15e30SBram Moolenaar " File upload - accessible only by other properties 2371ef15e30SBram Moolenaar let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2381ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2391ef15e30SBram Moolenaar let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] 2401ef15e30SBram Moolenaar call map(filemeth, 'v:val."("') 2411ef15e30SBram Moolenaar let files = fileprop + filemeth 2421ef15e30SBram Moolenaar " Hidden - accessible only by other properties 2431ef15e30SBram Moolenaar let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value'] 2441ef15e30SBram Moolenaar let hidds = hiddprop 2451ef15e30SBram Moolenaar " Password - accessible only by other properties 2461ef15e30SBram Moolenaar let passprop = ['accept', 'accessKey', 'defaultValue', 2471ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex', 2481ef15e30SBram Moolenaar \ 'type', 'value'] 2491ef15e30SBram Moolenaar let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown', 2501ef15e30SBram Moolenaar \ 'onKeyPress', 'onKeyUp'] 2511ef15e30SBram Moolenaar call map(passmeth, 'v:val."("') 2521ef15e30SBram Moolenaar let passs = passprop + passmeth 2531ef15e30SBram Moolenaar " Radio - accessible only by other properties 2541ef15e30SBram Moolenaar let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 2551ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 2561ef15e30SBram Moolenaar let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus'] 2571ef15e30SBram Moolenaar call map(radimeth, 'v:val."("') 2581ef15e30SBram Moolenaar let radis = radiprop + radimeth 2591ef15e30SBram Moolenaar " Reset - accessible only by other properties 2601ef15e30SBram Moolenaar let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2611ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 2621ef15e30SBram Moolenaar let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus'] 2631ef15e30SBram Moolenaar call map(resemeth, 'v:val."("') 2641ef15e30SBram Moolenaar let reses = reseprop + resemeth 2651ef15e30SBram Moolenaar " Submit - accessible only by other properties 2661ef15e30SBram Moolenaar let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2671ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 2681ef15e30SBram Moolenaar let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart'] 2691ef15e30SBram Moolenaar call map(submmeth, 'v:val."("') 2701ef15e30SBram Moolenaar let subms = submprop + submmeth 2711ef15e30SBram Moolenaar " Text - accessible only by other properties 2721ef15e30SBram Moolenaar let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 2731ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 2741ef15e30SBram Moolenaar \ 'size', 'tabIndex', 'type', 'value'] 2751ef15e30SBram Moolenaar let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown', 2761ef15e30SBram Moolenaar \ 'onKeyPress', 'onKeyUp', 'onSelect'] 2771ef15e30SBram Moolenaar call map(textmeth, 'v:val."("') 2781ef15e30SBram Moolenaar let texts = textprop + textmeth 2791ef15e30SBram Moolenaar " Link - link. 2801ef15e30SBram Moolenaar let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media', 2811ef15e30SBram Moolenaar \ 'rel', 'rev', 'target', 'type'] 2821ef15e30SBram Moolenaar let linkmeth = ['onLoad'] 2831ef15e30SBram Moolenaar call map(linkmeth, 'v:val."("') 2841ef15e30SBram Moolenaar let links = linkprop + linkmeth 2851ef15e30SBram Moolenaar " Location - location. 2861ef15e30SBram Moolenaar let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol', 2871ef15e30SBram Moolenaar \ 'search'] 2881ef15e30SBram Moolenaar let locameth = ['assign', 'reload', 'replace'] 2891ef15e30SBram Moolenaar call map(locameth, 'v:val."("') 2901ef15e30SBram Moolenaar let locas = locaprop + locameth 2911ef15e30SBram Moolenaar " Meta - meta. 2921ef15e30SBram Moolenaar let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme'] 2931ef15e30SBram Moolenaar let metas = metaprop 2941ef15e30SBram Moolenaar " Navigator - navigator. 2951ef15e30SBram Moolenaar let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled', 2961ef15e30SBram Moolenaar \ 'platform', 'userAgent'] 2971ef15e30SBram Moolenaar let navimeth = ['javaEnabled', 'taintEnabled'] 2981ef15e30SBram Moolenaar call map(navimeth, 'v:val."("') 2991ef15e30SBram Moolenaar let navis = naviprop + navimeth 3001ef15e30SBram Moolenaar " Object - object. 3011ef15e30SBram Moolenaar let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data', 3021ef15e30SBram Moolenaar \ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex', 3031ef15e30SBram Moolenaar \ 'type', 'useMap', 'vspace', 'width'] 3041ef15e30SBram Moolenaar let objes = objeprop 3051ef15e30SBram Moolenaar " Option - accessible only by other properties 3061ef15e30SBram Moolenaar let optiprop = ['defaultSelected', 3071ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value'] 3081ef15e30SBram Moolenaar let optis = optiprop 3091ef15e30SBram Moolenaar " Screen - screen. 3101ef15e30SBram Moolenaar let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width'] 3111ef15e30SBram Moolenaar let scres = screprop 3121ef15e30SBram Moolenaar " Select - accessible only by other properties 3131ef15e30SBram Moolenaar let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name', 3141ef15e30SBram Moolenaar \ 'selectedIndex', 'size', 'tabIndex', 'type', 'value'] 3151ef15e30SBram Moolenaar let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus'] 3161ef15e30SBram Moolenaar call map(selemeth, 'v:val."("') 3171ef15e30SBram Moolenaar let seles = seleprop + selemeth 3181ef15e30SBram Moolenaar " Style - style. 3191ef15e30SBram Moolenaar let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage', 3201ef15e30SBram Moolenaar \ 'backgroundPosition', 'backgroundRepeat', 3211ef15e30SBram Moolenaar \ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop', 3221ef15e30SBram Moolenaar \ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 3231ef15e30SBram Moolenaar \ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle', 3241ef15e30SBram Moolenaar \ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 3251ef15e30SBram Moolenaar \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom', 3261ef15e30SBram Moolenaar \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth', 3271ef15e30SBram Moolenaar \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom', 3281ef15e30SBram Moolenaar \ 'paddingLeft', 'paddingRight', 'paddingTop', 3291ef15e30SBram Moolenaar \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content', 3301ef15e30SBram Moolenaar \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction', 3311ef15e30SBram Moolenaar \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight', 3321ef15e30SBram Moolenaar \ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility', 3331ef15e30SBram Moolenaar \ 'width', 3341ef15e30SBram Moolenaar \ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType', 3351ef15e30SBram Moolenaar \ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex', 3361ef15e30SBram Moolenaar \ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside', 3371ef15e30SBram Moolenaar \ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout', 3381ef15e30SBram Moolenaar \ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 3391ef15e30SBram Moolenaar \ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes', 3401ef15e30SBram Moolenaar \ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition', 3411ef15e30SBram Moolenaar \ 'unicodeBidi', 'whiteSpace', 'wordSpacing'] 3421ef15e30SBram Moolenaar let styls = stylprop 3431ef15e30SBram Moolenaar " Table - table. 3441ef15e30SBram Moolenaar let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding', 3451ef15e30SBram Moolenaar \ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width'] 3461ef15e30SBram Moolenaar let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow', 3471ef15e30SBram Moolenaar \ 'deleteTFoot', 'deleteTHead', 'insertRow'] 3481ef15e30SBram Moolenaar call map(tablmeth, 'v:val."("') 3491ef15e30SBram Moolenaar let tabls = tablprop + tablmeth 3501ef15e30SBram Moolenaar " Table data - TableData. 3511ef15e30SBram Moolenaar let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff', 3521ef15e30SBram Moolenaar \ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width'] 3531ef15e30SBram Moolenaar let tdats = tdatprop 3541ef15e30SBram Moolenaar " Table row - TableRow. 3551ef15e30SBram Moolenaar let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex', 3561ef15e30SBram Moolenaar \ 'vAlign'] 3571ef15e30SBram Moolenaar let trowmeth = ['deleteCell', 'insertCell'] 3581ef15e30SBram Moolenaar call map(trowmeth, 'v:val."("') 3591ef15e30SBram Moolenaar let trows = trowprop + trowmeth 3601ef15e30SBram Moolenaar " Textarea - accessible only by other properties 3611ef15e30SBram Moolenaar let tareprop = ['accessKey', 'cols', 'defaultValue', 3621ef15e30SBram Moolenaar \ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows', 3638b6144bdSBram Moolenaar \ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd'] 3641ef15e30SBram Moolenaar let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus'] 3651ef15e30SBram Moolenaar call map(taremeth, 'v:val."("') 3661ef15e30SBram Moolenaar let tares = tareprop + taremeth 3671ef15e30SBram Moolenaar " Window - window. 3688b6144bdSBram Moolenaar let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history', 3698b6144bdSBram Moolenaar \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self', 3708b6144bdSBram Moolenaar \ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject'] 3711ef15e30SBram Moolenaar let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus', 3721ef15e30SBram Moolenaar \ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval', 3731ef15e30SBram Moolenaar \ 'setTimeout'] 3741ef15e30SBram Moolenaar call map(windmeth, 'v:val."("') 3751ef15e30SBram Moolenaar let winds = windprop + windmeth 3761ef15e30SBram Moolenaar " XMLHttpRequest - access by new xxx() 3771ef15e30SBram Moolenaar let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML', 3788b6144bdSBram Moolenaar \ 'status', 'statusText', 'parseError'] 3791ef15e30SBram Moolenaar let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open', 3801ef15e30SBram Moolenaar \ 'send', 'setRequestHeader'] 3811ef15e30SBram Moolenaar call map(xmlhmeth, 'v:val."("') 3821ef15e30SBram Moolenaar let xmlhs = xmlhprop + xmlhmeth 3831ef15e30SBram Moolenaar 3848b6144bdSBram Moolenaar " XML DOM 3858b6144bdSBram Moolenaar " Attributes - element.attributes[x]. 3868b6144bdSBram Moolenaar let xdomattrprop = ['name', 'specified', 'value'] 3878b6144bdSBram Moolenaar " Element - anyelement. 3888b6144bdSBram Moolenaar let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 3898b6144bdSBram Moolenaar \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 3908b6144bdSBram Moolenaar \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName'] 391*e7b1ea02SBram Moolenaar let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode', 392*e7b1ea02SBram Moolenaar \ 'dispatchEvent', 'getAttribute', 'getAttributeNode', 393*e7b1ea02SBram Moolenaar \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 394*e7b1ea02SBram Moolenaar \ 'normalize', 'removeAttribute', 'removeAttributeNode', 395*e7b1ea02SBram Moolenaar \ 'removeChild', 'removeEventListener', 'replaceChild', 3968b6144bdSBram Moolenaar \ 'setAttribute', 'setAttributeNode'] 3978b6144bdSBram Moolenaar call map(xdomelemmeth, 'v:val."("') 3988b6144bdSBram Moolenaar let xdomelems = xdomelemprop + xdomelemmeth 3998b6144bdSBram Moolenaar " Node - anynode. 4008b6144bdSBram Moolenaar let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 4018b6144bdSBram Moolenaar \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 4028b6144bdSBram Moolenaar \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling'] 4038b6144bdSBram Moolenaar let xdomnodemeth = ['appendChild', 'cloneNode', 4048b6144bdSBram Moolenaar \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild'] 4058b6144bdSBram Moolenaar call map(xdomnodemeth, 'v:val."("') 4068b6144bdSBram Moolenaar let xdomnodes = xdomnodeprop + xdomnodemeth 4078b6144bdSBram Moolenaar " NodeList 4088b6144bdSBram Moolenaar let xdomnliss = ['length', 'item('] 4098b6144bdSBram Moolenaar " Error - parseError. 4108b6144bdSBram Moolenaar let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos'] 4118b6144bdSBram Moolenaar 4128b6144bdSBram Moolenaar " Find object type declaration to reduce number of suggestions. {{{ 4138b6144bdSBram Moolenaar " 1. Get object name 4148b6144bdSBram Moolenaar " 2. Find object declaration line 4158b6144bdSBram Moolenaar " 3. General declaration follows "= new Type" syntax, additional else 4168b6144bdSBram Moolenaar " for regexp "= /re/" 4178b6144bdSBram Moolenaar " 4. Make correction for Microsoft.XMLHTTP ActiveXObject 4188b6144bdSBram Moolenaar " 5. Repeat for external files 4191d2ba7faSBram Moolenaar let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$') 4208b6144bdSBram Moolenaar if len(object) > 0 4211ef15e30SBram Moolenaar let decl_line = search(object.'.\{-}=\s*new\s*', 'bn') 4228b6144bdSBram Moolenaar if decl_line > 0 4231d2ba7faSBram Moolenaar let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze') 4248b6144bdSBram Moolenaar if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' 4258b6144bdSBram Moolenaar let object_type = 'XMLHttpRequest' 4268b6144bdSBram Moolenaar endif 4278b6144bdSBram Moolenaar else 4288b6144bdSBram Moolenaar let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn') 4298b6144bdSBram Moolenaar if decl_line > 0 4308b6144bdSBram Moolenaar let object_type = 'RegExp' 4318b6144bdSBram Moolenaar endif 4328b6144bdSBram Moolenaar endif 4338b6144bdSBram Moolenaar " We didn't find var declaration in current file but we may have 4348b6144bdSBram Moolenaar " something in external files. 4358b6144bdSBram Moolenaar if decl_line == 0 && exists("b:js_extfiles") 4368b6144bdSBram Moolenaar let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"') 4378b6144bdSBram Moolenaar if len(dext_line) > 0 4381d2ba7faSBram Moolenaar let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze') 4398b6144bdSBram Moolenaar if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' 4408b6144bdSBram Moolenaar let object_type = 'XMLHttpRequest' 4418b6144bdSBram Moolenaar endif 4428b6144bdSBram Moolenaar else 4438b6144bdSBram Moolenaar let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"') 4448b6144bdSBram Moolenaar if len(dext_line) > 0 4458b6144bdSBram Moolenaar let object_type = 'RegExp' 4468b6144bdSBram Moolenaar endif 4478b6144bdSBram Moolenaar endif 4488b6144bdSBram Moolenaar endif 4498b6144bdSBram Moolenaar endif 4508b6144bdSBram Moolenaar " }}} 4518b6144bdSBram Moolenaar 4528b6144bdSBram Moolenaar if !exists('object_type') 4538b6144bdSBram Moolenaar let object_type = '' 4548b6144bdSBram Moolenaar endif 4551ef15e30SBram Moolenaar 4561ef15e30SBram Moolenaar if object_type == 'Date' 4571ef15e30SBram Moolenaar let values = dates 4581ef15e30SBram Moolenaar elseif object_type == 'Image' 4591ef15e30SBram Moolenaar let values = imags 4601ef15e30SBram Moolenaar elseif object_type == 'Array' 4611ef15e30SBram Moolenaar let values = arrays 4621ef15e30SBram Moolenaar elseif object_type == 'Boolean' 4631ef15e30SBram Moolenaar " TODO: a bit more than real boolean 4641ef15e30SBram Moolenaar let values = arrays 4651ef15e30SBram Moolenaar elseif object_type == 'XMLHttpRequest' 4661ef15e30SBram Moolenaar let values = xmlhs 4671ef15e30SBram Moolenaar elseif object_type == 'String' 4681ef15e30SBram Moolenaar let values = stris 4698b6144bdSBram Moolenaar elseif object_type == 'RegExp' 4708b6144bdSBram Moolenaar let values = reges 4718b6144bdSBram Moolenaar elseif object_type == 'Math' 4728b6144bdSBram Moolenaar let values = maths 4731ef15e30SBram Moolenaar endif 4741ef15e30SBram Moolenaar 4751ef15e30SBram Moolenaar if !exists('values') 4761ef15e30SBram Moolenaar " List of properties 4771ef15e30SBram Moolenaar if shortcontext =~ 'Math\.$' 4781ef15e30SBram Moolenaar let values = maths 4798b6144bdSBram Moolenaar elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$' 4801ef15e30SBram Moolenaar let values = anths 4811ef15e30SBram Moolenaar elseif shortcontext =~ 'area\.$' 4821ef15e30SBram Moolenaar let values = areas 4831ef15e30SBram Moolenaar elseif shortcontext =~ 'base\.$' 4841ef15e30SBram Moolenaar let values = bases 4851ef15e30SBram Moolenaar elseif shortcontext =~ 'body\.$' 4861ef15e30SBram Moolenaar let values = bodys 4871ef15e30SBram Moolenaar elseif shortcontext =~ 'document\.$' 4881ef15e30SBram Moolenaar let values = docus 4898b6144bdSBram Moolenaar elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$' 4901ef15e30SBram Moolenaar let values = forms 4911ef15e30SBram Moolenaar elseif shortcontext =~ 'frameset\.$' 4921ef15e30SBram Moolenaar let values = fsets 4931ef15e30SBram Moolenaar elseif shortcontext =~ 'history\.$' 4941ef15e30SBram Moolenaar let values = hists 4951ef15e30SBram Moolenaar elseif shortcontext =~ 'iframe\.$' 4961ef15e30SBram Moolenaar let values = ifras 4978b6144bdSBram Moolenaar elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$' 4981ef15e30SBram Moolenaar let values = imags 4998b6144bdSBram Moolenaar elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$' 5001ef15e30SBram Moolenaar let values = links 5011ef15e30SBram Moolenaar elseif shortcontext =~ 'location\.$' 5021ef15e30SBram Moolenaar let values = locas 5031ef15e30SBram Moolenaar elseif shortcontext =~ 'meta\.$' 5041ef15e30SBram Moolenaar let values = metas 5051ef15e30SBram Moolenaar elseif shortcontext =~ 'navigator\.$' 5061ef15e30SBram Moolenaar let values = navis 5071ef15e30SBram Moolenaar elseif shortcontext =~ 'object\.$' 5081ef15e30SBram Moolenaar let values = objes 5091ef15e30SBram Moolenaar elseif shortcontext =~ 'screen\.$' 5101ef15e30SBram Moolenaar let values = scres 5111ef15e30SBram Moolenaar elseif shortcontext =~ 'style\.$' 5121ef15e30SBram Moolenaar let values = styls 5131ef15e30SBram Moolenaar elseif shortcontext =~ 'table\.$' 5141ef15e30SBram Moolenaar let values = tabls 5151ef15e30SBram Moolenaar elseif shortcontext =~ 'TableData\.$' 5161ef15e30SBram Moolenaar let values = tdats 5171ef15e30SBram Moolenaar elseif shortcontext =~ 'TableRow\.$' 5181ef15e30SBram Moolenaar let values = trows 5191ef15e30SBram Moolenaar elseif shortcontext =~ 'window\.$' 5201ef15e30SBram Moolenaar let values = winds 5218b6144bdSBram Moolenaar elseif shortcontext =~ 'parseError\.$' 5228b6144bdSBram Moolenaar let values = xdomerror 5238b6144bdSBram Moolenaar elseif shortcontext =~ 'attributes\[\d\+\]\.$' 5248b6144bdSBram Moolenaar let values = xdomattrprop 5251ef15e30SBram Moolenaar else 5261ef15e30SBram Moolenaar let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris 5271ef15e30SBram Moolenaar let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists 5288b6144bdSBram Moolenaar let values += ifras + imags + links + locas + metas + navis + objes + scres 5298b6144bdSBram Moolenaar let values += tabls + trows + tares + winds 5308b6144bdSBram Moolenaar let values += xdomnodes + xdomnliss + xdomelems 5311ef15e30SBram Moolenaar endif 5321ef15e30SBram Moolenaar endif 5331ef15e30SBram Moolenaar 5341ef15e30SBram Moolenaar for m in values 5351ef15e30SBram Moolenaar if m =~? '^'.a:base 5361ef15e30SBram Moolenaar call add(res, m) 5371ef15e30SBram Moolenaar elseif m =~? a:base 5381ef15e30SBram Moolenaar call add(res2, m) 5391ef15e30SBram Moolenaar endif 5401ef15e30SBram Moolenaar endfor 5411ef15e30SBram Moolenaar 5421ef15e30SBram Moolenaar unlet! values 5431ef15e30SBram Moolenaar return res + res2 5441ef15e30SBram Moolenaar 5451ef15e30SBram Moolenaar endif 5468b6144bdSBram Moolenaar " }}} 5471ef15e30SBram Moolenaar 5481ef15e30SBram Moolenaar " Get variables data. 5491ef15e30SBram Moolenaar let variables = filter(copy(file), 'v:val =~ "var\\s"') 5501ef15e30SBram Moolenaar call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")') 5511ef15e30SBram Moolenaar call map(variables, 'substitute(v:val, ";\\|$", ",", "g")') 5521ef15e30SBram Moolenaar let vars = [] 5538b6144bdSBram Moolenaar " This loop (and next one) is necessary to get variable names from 5548b6144bdSBram Moolenaar " constructs like: var var1, var2, var3 = "something"; 5551ef15e30SBram Moolenaar for i in range(len(variables)) 5561ef15e30SBram Moolenaar let comma_separated = split(variables[i], ',\s*') 5571d2ba7faSBram Moolenaar call map(comma_separated, 'matchstr(v:val, "\\k\\+")') 5581ef15e30SBram Moolenaar let vars += comma_separated 5591ef15e30SBram Moolenaar endfor 5601ef15e30SBram Moolenaar 5611ef15e30SBram Moolenaar let variables = sort(vars) 5628b6144bdSBram Moolenaar unlet! vars 5631ef15e30SBram Moolenaar 5648b6144bdSBram Moolenaar " Add "no var" variables. 5651d2ba7faSBram Moolenaar let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="') 5668b6144bdSBram Moolenaar let u_vars = [] 5678b6144bdSBram Moolenaar for i in range(len(undeclared_variables)) 5688b6144bdSBram Moolenaar let split_equal = split(undeclared_variables[i], '\s*=') 5691d2ba7faSBram Moolenaar call map(split_equal, 'matchstr(v:val, "\\k\\+$")') 5708b6144bdSBram Moolenaar let u_vars += split_equal 5718b6144bdSBram Moolenaar endfor 5721ef15e30SBram Moolenaar 5738b6144bdSBram Moolenaar let variables += sort(u_vars) 5748b6144bdSBram Moolenaar unlet! u_vars 5751ef15e30SBram Moolenaar 5761ef15e30SBram Moolenaar " Get functions 5771ef15e30SBram Moolenaar let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"') 5781ef15e30SBram Moolenaar let arguments = copy(functions) 5791d2ba7faSBram Moolenaar call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")') 5801ef15e30SBram Moolenaar call map(functions, 'v:val."("') 5818b6144bdSBram Moolenaar let functions = sort(functions) 5821ef15e30SBram Moolenaar 5831d2ba7faSBram Moolenaar " Create table to keep arguments for additional 'menu' info 5841d2ba7faSBram Moolenaar let b:js_menuinfo = {} 5851d2ba7faSBram Moolenaar for i in arguments 5861d2ba7faSBram Moolenaar let g:ia = i 5871d2ba7faSBram Moolenaar let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))') 588214641f7SBram Moolenaar if len(f_elements) >= 3 5891d2ba7faSBram Moolenaar let b:js_menuinfo[f_elements[1].'('] = f_elements[2] 5901d2ba7faSBram Moolenaar endif 5911d2ba7faSBram Moolenaar endfor 5921d2ba7faSBram Moolenaar 5931ef15e30SBram Moolenaar " Get functions arguments 5941ef15e30SBram Moolenaar call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")') 5951ef15e30SBram Moolenaar let jargs = join(arguments, ',') 5961ef15e30SBram Moolenaar let jargs = substitute(jargs, '\s', '', 'g') 5971ef15e30SBram Moolenaar let arguments = split(jargs, ',') 5988b6144bdSBram Moolenaar let arguments = sort(arguments) 5991ef15e30SBram Moolenaar 6001ef15e30SBram Moolenaar " Built-in functions 6018b6144bdSBram Moolenaar let builtin = ['alert(', 'confirm('] 6021ef15e30SBram Moolenaar 6031ef15e30SBram Moolenaar " Top-level HTML DOM objects 6041ef15e30SBram Moolenaar let htmldom = ['document', 'anchor', 'area', 'base', 'body', 'document', 'event', 'form', 'frame', 'frameset', 'history', 'iframe', 'image', 'input', 'link', 'location', 'meta', 'navigator', 'object', 'option', 'screen', 'select', 'table', 'tableData', 'tableHeader', 'tableRow', 'textarea', 'window'] 6051ef15e30SBram Moolenaar call map(htmldom, 'v:val."."') 6061ef15e30SBram Moolenaar 6071ef15e30SBram Moolenaar " Top-level properties 6081ef15e30SBram Moolenaar let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 6091ef15e30SBram Moolenaar \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat', 6101ef15e30SBram Moolenaar \ 'parseInt', 'String', 'undefined', 'escape', 'unescape'] 6111ef15e30SBram Moolenaar 6121ef15e30SBram Moolenaar " Keywords 6131ef15e30SBram Moolenaar let keywords = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "XMLHttpRequest", "ActiveXObject", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double ", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in ", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super ", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with"] 6141ef15e30SBram Moolenaar 6151ef15e30SBram Moolenaar let values = variables + functions + htmldom + arguments + builtin + properties + keywords 6161ef15e30SBram Moolenaar 6171ef15e30SBram Moolenaar for m in values 6181ef15e30SBram Moolenaar if m =~? '^'.a:base 6191ef15e30SBram Moolenaar call add(res, m) 6201ef15e30SBram Moolenaar elseif m =~? a:base 6211ef15e30SBram Moolenaar call add(res2, m) 6221ef15e30SBram Moolenaar endif 6231ef15e30SBram Moolenaar endfor 6241ef15e30SBram Moolenaar 6251d2ba7faSBram Moolenaar let menu = res + res2 6261d2ba7faSBram Moolenaar let final_menu = [] 6271d2ba7faSBram Moolenaar for i in range(len(menu)) 6281d2ba7faSBram Moolenaar let item = menu[i] 6291d2ba7faSBram Moolenaar if item =~ '($' 6301d2ba7faSBram Moolenaar let kind = 'f' 6311d2ba7faSBram Moolenaar if has_key(b:js_menuinfo, item) 6321d2ba7faSBram Moolenaar let m_info = b:js_menuinfo[item] 6331d2ba7faSBram Moolenaar else 6341d2ba7faSBram Moolenaar let m_info = '' 6351d2ba7faSBram Moolenaar endif 6361d2ba7faSBram Moolenaar else 6371d2ba7faSBram Moolenaar let kind = 'v' 6381d2ba7faSBram Moolenaar let m_info = '' 6391d2ba7faSBram Moolenaar endif 6401d2ba7faSBram Moolenaar let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}] 6411d2ba7faSBram Moolenaar endfor 6421d2ba7faSBram Moolenaar let g:fm = final_menu 6431d2ba7faSBram Moolenaar return final_menu 6441d2ba7faSBram Moolenaar 6451ef15e30SBram Moolenaarendfunction 6468b6144bdSBram Moolenaar 6478b6144bdSBram Moolenaar" vim:set foldmethod=marker: 648