(ts, cm)
| 272 | // Maintaining argument hints |
| 273 | |
| 274 | function updateArgHints(ts, cm) { |
| 275 | closeArgHints(ts); |
| 276 | |
| 277 | if (cm.somethingSelected()) return; |
| 278 | var state = cm.getTokenAt(cm.getCursor()).state; |
| 279 | var inner = CodeMirror.innerMode(cm.getMode(), state); |
| 280 | if (inner.mode.name != "javascript") return; |
| 281 | var lex = inner.state.lexical; |
| 282 | if (lex.info != "call") return; |
| 283 | |
| 284 | var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize"); |
| 285 | for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { |
| 286 | var str = cm.getLine(line), extra = 0; |
| 287 | for (var pos = 0;;) { |
| 288 | var tab = str.indexOf("\t", pos); |
| 289 | if (tab == -1) break; |
| 290 | extra += tabSize - (tab + extra) % tabSize - 1; |
| 291 | pos = tab + 1; |
| 292 | } |
| 293 | ch = lex.column - extra; |
| 294 | if (str.charAt(ch) == "(") {found = true; break;} |
| 295 | } |
| 296 | if (!found) return; |
| 297 | |
| 298 | var start = Pos(line, ch); |
| 299 | var cache = ts.cachedArgHints; |
| 300 | if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) |
| 301 | return showArgHints(ts, cm, argPos); |
| 302 | |
| 303 | ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) { |
| 304 | if (error || !data.type || !(/^fn\(/).test(data.type)) return; |
| 305 | ts.cachedArgHints = { |
| 306 | start: pos, |
| 307 | type: parseFnType(data.type), |
| 308 | name: data.exprName || data.name || "fn", |
| 309 | guess: data.guess, |
| 310 | doc: cm.getDoc() |
| 311 | }; |
| 312 | showArgHints(ts, cm, argPos); |
| 313 | }); |
| 314 | } |
| 315 | |
| 316 | function showArgHints(ts, cm, pos) { |
| 317 | closeArgHints(ts); |
no test coverage detected