blob: 2853fbade1beabb9ea18b9da89d492f816dee6cc [file] [log] [blame]
Bram Moolenaar1ef15e32006-02-01 21:56:25 +00001" Vim completion script
2" Language: Java Script
3" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
4" Last Change: 2006 Jan 30
5
6function! javascriptcomplete#CompleteJS(findstart, base)
7 if a:findstart
8 " locate the start of the word
9 let line = getline('.')
10 let start = col('.') - 1
11 let curline = line('.')
12 let compl_begin = col('.') - 2
13 " Bit risky but JS is rather limited language and local chars shouldn't
14 " fint way into names
15 while start >= 0 && line[start - 1] =~ '\w'
16 let start -= 1
17 endwhile
18 let b:compl_context = getline('.')[0:compl_begin]
19 return start
20 else
21 " Initialize base return lists
22 let res = []
23 let res2 = []
24 " a:base is very short - we need context
25 let context = b:compl_context
26 " Shortcontext is context without a:base, useful for checking if we are
27 " looking for objects
28 let shortcontext = substitute(context, a:base.'$', '', '')
29 unlet! b:compl_context
30
31 if shortcontext =~ '\.$'
32 " Complete methods and properties for objects
33 " DOM separate
34 let doms = ['style.']
35 " Arrays
36 let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
37 let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift',
38 \ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
39 \ 'watch', 'unwatch']
40 call map(arraymeth, 'v:val."("')
41 let arrays = arrayprop + arraymeth
42
43 " Boolean - complete subset of array values
44 " properties - constructor, prototype
45 " methods - toSource, toString, valueOf
46
47 " Date
48 " properties - constructor, prototype
49 let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
50 \ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
51 \ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
52 \ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
53 \ 'getYear', 'parse', 'parse',
54 \ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
55 \ 'setMinutes', 'setMonth', 'setSeconds',
56 \ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
57 \ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
58 \ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
59 \ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
60 call map(datemeth, 'v:val."("')
61 let dates = datemeth
62
63 " Function
64 let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
65 \ 'arity', 'constructor', 'length', 'prototype']
66 let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
67 call map(funcmeth, 'v:val."("')
68 let funcs = funcprop + funcmeth
69
70 " Math
71 let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
72 let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
73 \ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
74 \ 'watch', 'unwatch']
75 call map(mathmeth, 'v:val."("')
76 let maths = mathprop + mathmeth
77
78 " Number
79 let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY',
80 \ 'constructor', 'prototype']
81 let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
82 \ 'watch', 'unwatch']
83 call map(numbmeth, 'v:val."("')
84 let numbs = numbprop + numbmeth
85
86 " Object
87 let objeprop = ['constructor', 'prototype']
88 let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
89 call map(objemeth, 'v:val."("')
90 let objes = objeprop + objemeth
91
92 " RegExp
93 let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
94 let regemeth = ['exec', 'toSource', 'toString', 'test', 'watch', 'unwatch']
95 call map(regemeth, 'v:val."("')
96 let reges = regeprop + regemeth
97
98 " String
99 let striprop = ['constructor', 'length', 'prototype']
100 let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
101 \ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
102 \ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
103 \ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
104 \ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
105 call map(strimeth, 'v:val."("')
106 let stris = striprop + strimeth
107
108 " User created properties
109 if exists("b:jsrange")
110 let file = getline(b:jsrange[0],b:jsrange[1])
111 unlet! b:jsrange
112 else
113 let file = getline(1, '$')
114 endif
115 let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\w"')
116 let juser_props1 = join(user_props1, ' ')
117 let user_props1 = split(juser_props1, '\zethis\.')
118 unlet! juser_props1
119 call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\w\\+\\ze")')
120 let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\w"')
121 call map(user_props2, 'matchstr(v:val, "\\.prototype\\.\\zs\\w\\+\\ze")')
122 let user_props = user_props1 + user_props2
123
124 " HTML DOM properties
125 " Anchors - anchor.
126 let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
127 \ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
128 let anchmeth = ['blur', 'focus']
129 call map(anchmeth, 'v:val."("')
130 let anths = anchprop + anchmeth
131 " Area - area.
132 let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
133 \ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
134 let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
135 call map(areameth, 'v:val."("')
136 let areas = areaprop + areameth
137 " Base - base.
138 let baseprop = ['href', 'id', 'target']
139 let bases = baseprop
140 " Body - body.
141 let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
142 \ 'text', 'vLink']
143 let bodys = bodyprop
144 " Document - document.
145 let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
146 \ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
147 let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
148 \ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
149 \ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
150 \ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
151 call map(documeth, 'v:val."("')
152 let docus = docuprop + documeth
153 " Form - form.
154 let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
155 \ 'method', 'name', 'tabIndex', 'target']
156 let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
157 call map(formmeth, 'v:val."("')
158 let forms = formprop + formmeth
159 " Frame - frame.
160 let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
161 \ 'name', 'noResize', 'scrolling', 'src']
162 let frammeth = ['blur', 'focus']
163 call map(frammeth, 'v:val."("')
164 let frams = framprop + frammeth
165 " Frameset - frameset.
166 let fsetprop = ['cols', 'id', 'rows']
167 let fsetmeth = ['blur', 'focus']
168 call map(fsetmeth, 'v:val."("')
169 let fsets = fsetprop + fsetmeth
170 " History - history.
171 let histprop = ['length']
172 let histmeth = ['back', 'forward', 'go']
173 call map(histmeth, 'v:val."("')
174 let hists = histprop + histmeth
175 " Iframe - iframe.
176 let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
177 \ 'name', 'scrolling', 'src', 'width']
178 let ifras = ifraprop
179 " Image - image.
180 let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
181 \ 'lowsrc', 'name', 'src', 'useMap', 'vspace', 'width']
182 let imagmeth = ['onAbort', 'onError', 'onLoad']
183 call map(imagmeth, 'v:val."("')
184 let imags = histprop + imagmeth
185 " Button - accessible only by other properties
186 let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
187 let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
188 call map(buttmeth, 'v:val."("')
189 let butts = buttprop + buttmeth
190 " Checkbox - accessible only by other properties
191 let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
192 \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
193 let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
194 call map(checmeth, 'v:val."("')
195 let checs = checprop + checmeth
196 " File upload - accessible only by other properties
197 let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
198 \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
199 let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
200 call map(filemeth, 'v:val."("')
201 let files = fileprop + filemeth
202 " Hidden - accessible only by other properties
203 let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value']
204 let hidds = hiddprop
205 " Password - accessible only by other properties
206 let passprop = ['accept', 'accessKey', 'defaultValue',
207 \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex',
208 \ 'type', 'value']
209 let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown',
210 \ 'onKeyPress', 'onKeyUp']
211 call map(passmeth, 'v:val."("')
212 let passs = passprop + passmeth
213 " Radio - accessible only by other properties
214 let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
215 \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
216 let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
217 call map(radimeth, 'v:val."("')
218 let radis = radiprop + radimeth
219 " Reset - accessible only by other properties
220 let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
221 \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
222 let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
223 call map(resemeth, 'v:val."("')
224 let reses = reseprop + resemeth
225 " Submit - accessible only by other properties
226 let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
227 \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
228 let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
229 call map(submmeth, 'v:val."("')
230 let subms = submprop + submmeth
231 " Text - accessible only by other properties
232 let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
233 \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly',
234 \ 'size', 'tabIndex', 'type', 'value']
235 let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
236 \ 'onKeyPress', 'onKeyUp', 'onSelect']
237 call map(textmeth, 'v:val."("')
238 let texts = textprop + textmeth
239 " Link - link.
240 let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
241 \ 'rel', 'rev', 'target', 'type']
242 let linkmeth = ['onLoad']
243 call map(linkmeth, 'v:val."("')
244 let links = linkprop + linkmeth
245 " Location - location.
246 let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
247 \ 'search']
248 let locameth = ['assign', 'reload', 'replace']
249 call map(locameth, 'v:val."("')
250 let locas = locaprop + locameth
251 " Meta - meta.
252 let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
253 let metas = metaprop
254 " Navigator - navigator.
255 let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
256 \ 'platform', 'userAgent']
257 let navimeth = ['javaEnabled', 'taintEnabled']
258 call map(navimeth, 'v:val."("')
259 let navis = naviprop + navimeth
260 " Object - object.
261 let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
262 \ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
263 \ 'type', 'useMap', 'vspace', 'width']
264 let objes = objeprop
265 " Option - accessible only by other properties
266 let optiprop = ['defaultSelected',
267 \ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
268 let optis = optiprop
269 " Screen - screen.
270 let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
271 let scres = screprop
272 " Select - accessible only by other properties
273 let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name',
274 \ 'selectedIndex', 'size', 'tabIndex', 'type', 'value']
275 let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
276 call map(selemeth, 'v:val."("')
277 let seles = seleprop + selemeth
278 " Style - style.
279 let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
280 \ 'backgroundPosition', 'backgroundRepeat',
281 \ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
282 \ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
283 \ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
284 \ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
285 \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
286 \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
287 \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
288 \ 'paddingLeft', 'paddingRight', 'paddingTop',
289 \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
290 \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
291 \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
292 \ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
293 \ 'width',
294 \ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
295 \ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
296 \ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
297 \ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
298 \ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
299 \ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
300 \ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
301 \ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
302 let styls = stylprop
303 " Table - table.
304 let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
305 \ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
306 let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
307 \ 'deleteTFoot', 'deleteTHead', 'insertRow']
308 call map(tablmeth, 'v:val."("')
309 let tabls = tablprop + tablmeth
310 " Table data - TableData.
311 let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
312 \ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
313 let tdats = tdatprop
314 " Table row - TableRow.
315 let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
316 \ 'vAlign']
317 let trowmeth = ['deleteCell', 'insertCell']
318 call map(trowmeth, 'v:val."("')
319 let trows = trowprop + trowmeth
320 " Textarea - accessible only by other properties
321 let tareprop = ['accessKey', 'cols', 'defaultValue',
322 \ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',
323 \ 'tabIndex', 'type', 'value']
324 let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
325 call map(taremeth, 'v:val."("')
326 let tares = tareprop + taremeth
327 " Window - window.
328 let windprop = ['frames', 'closed', 'defaultStatus', 'length', 'name', 'opener', 'parent',
329 \ 'self', 'status', 'top']
330 let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
331 \ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
332 \ 'setTimeout']
333 call map(windmeth, 'v:val."("')
334 let winds = windprop + windmeth
335 " XMLHttpRequest - access by new xxx()
336 let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
337 \ 'status', 'statusText']
338 let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
339 \ 'send', 'setRequestHeader']
340 call map(xmlhmeth, 'v:val."("')
341 let xmlhs = xmlhprop + xmlhmeth
342
343 let object = matchstr(shortcontext, '\zs\w\+\ze\(\[.\{-}\]\)\?\.$')
344 let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
345 let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze')
346
347 if object_type == 'Date'
348 let values = dates
349 elseif object_type == 'Image'
350 let values = imags
351 elseif object_type == 'Array'
352 let values = arrays
353 elseif object_type == 'Boolean'
354 " TODO: a bit more than real boolean
355 let values = arrays
356 elseif object_type == 'XMLHttpRequest'
357 let values = xmlhs
358 elseif object_type == 'String'
359 let values = stris
360 endif
361
362 if !exists('values')
363 " List of properties
364 if shortcontext =~ 'Math\.$'
365 let values = maths
366 elseif shortcontext =~ 'anchor\.$'
367 let values = anths
368 elseif shortcontext =~ 'area\.$'
369 let values = areas
370 elseif shortcontext =~ 'base\.$'
371 let values = bases
372 elseif shortcontext =~ 'body\.$'
373 let values = bodys
374 elseif shortcontext =~ 'document\.$'
375 let values = docus
376 elseif shortcontext =~ 'form\.$'
377 let values = forms
378 elseif shortcontext =~ 'frameset\.$'
379 let values = fsets
380 elseif shortcontext =~ 'history\.$'
381 let values = hists
382 elseif shortcontext =~ 'iframe\.$'
383 let values = ifras
384 elseif shortcontext =~ 'image\.$'
385 let values = imags
386 elseif shortcontext =~ 'link\.$'
387 let values = links
388 elseif shortcontext =~ 'location\.$'
389 let values = locas
390 elseif shortcontext =~ 'meta\.$'
391 let values = metas
392 elseif shortcontext =~ 'navigator\.$'
393 let values = navis
394 elseif shortcontext =~ 'object\.$'
395 let values = objes
396 elseif shortcontext =~ 'screen\.$'
397 let values = scres
398 elseif shortcontext =~ 'style\.$'
399 let values = styls
400 elseif shortcontext =~ 'table\.$'
401 let values = tabls
402 elseif shortcontext =~ 'TableData\.$'
403 let values = tdats
404 elseif shortcontext =~ 'TableRow\.$'
405 let values = trows
406 elseif shortcontext =~ 'window\.$'
407 let values = winds
408 else
409 let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
410 let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
411 let values += ifras + imags + links + locas + metas + navis + objes + scres + styls
412 let values += tabls + trows + winds
413 endif
414 endif
415
416 for m in values
417 if m =~? '^'.a:base
418 call add(res, m)
419 elseif m =~? a:base
420 call add(res2, m)
421 endif
422 endfor
423
424 unlet! values
425 return res + res2
426
427 endif
428
429 if exists("b:jsrange")
430 let file = getline(b:jsrange[0],b:jsrange[1])
431 unlet! b:jsrange
432 else
433 let file = getline(1, '$')
434 endif
435
436 " Get variables data.
437 let variables = filter(copy(file), 'v:val =~ "var\\s"')
438 call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
439 call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
440 let vars = []
441 " This loop is necessary to get variable names from constructs like:
442 " var var1, var2, var3 = "something";
443 for i in range(len(variables))
444 let comma_separated = split(variables[i], ',\s*')
445 call map(comma_separated, 'matchstr(v:val, "\\w\\+")')
446 let vars += comma_separated
447 endfor
448
449 let variables = sort(vars)
450
451 " Add undeclared variables.
452 let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="')
453 call map(undeclared_variables, 'matchstr(v:val, "^\\s*\\zs\\w\\+\\ze")')
454
455 let variables += sort(undeclared_variables)
456
457 " Get functions
458 let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
459 let arguments = copy(functions)
460 call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\w\\+")')
461 call map(functions, 'v:val."("')
462
463 " Get functions arguments
464 call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
465 let jargs = join(arguments, ',')
466 let jargs = substitute(jargs, '\s', '', 'g')
467 let arguments = split(jargs, ',')
468
469 " Built-in functions
470 let builtin = []
471
472 " Top-level HTML DOM objects
473 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']
474 call map(htmldom, 'v:val."."')
475
476 " Top-level properties
477 let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
478 \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
479 \ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
480
481 " Keywords
482 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"]
483
484 let values = variables + functions + htmldom + arguments + builtin + properties + keywords
485
486 for m in values
487 if m =~? '^'.a:base
488 call add(res, m)
489 elseif m =~? a:base
490 call add(res2, m)
491 endif
492 endfor
493
494 return res + res2
495endfunction