| 322 | } |
| 323 | |
| 324 | private evaluateVariable(varExpr: VariableExpression): Value { |
| 325 | if (varExpr.namespace === undefined) { |
| 326 | for (let i = this.localScopes.length - 1; i >= 0; i--) { |
| 327 | const _var = this.localScopes[i].get(varExpr.name); |
| 328 | if (_var !== undefined) { |
| 329 | return _var.value; |
| 330 | } |
| 331 | } |
| 332 | } |
| 333 | |
| 334 | if (varExpr.namespace === 'g' || varExpr.namespace === undefined) { |
| 335 | const _var = EvaluationContext.globalVariables.get(varExpr.name); |
| 336 | if (_var === undefined) { |
| 337 | throw VimError.UndefinedVariable( |
| 338 | varExpr.namespace ? `${varExpr.namespace}:${varExpr.name}` : varExpr.name, |
| 339 | ); |
| 340 | } else { |
| 341 | return _var.value; |
| 342 | } |
| 343 | } else if (varExpr.namespace === 'v') { |
| 344 | // TODO: v:count, v:count1, v:prevcount |
| 345 | // TODO: v:operator |
| 346 | // TODO: v:register |
| 347 | // TODO: v:statusmsg, v:warningmsg, v:errmsg |
| 348 | if (varExpr.name === 'true') { |
| 349 | return bool(true); |
| 350 | } else if (varExpr.name === 'false') { |
| 351 | return bool(false); |
| 352 | } else if (varExpr.name === 'hlsearch') { |
| 353 | return bool(globalState.hl); |
| 354 | } else if (varExpr.name === 't_number') { |
| 355 | return int(0); |
| 356 | } else if (varExpr.name === 't_string') { |
| 357 | return int(1); |
| 358 | } else if (varExpr.name === 't_func') { |
| 359 | return int(2); |
| 360 | } else if (varExpr.name === 't_list') { |
| 361 | return int(3); |
| 362 | } else if (varExpr.name === 't_dict') { |
| 363 | return int(4); |
| 364 | } else if (varExpr.name === 't_float') { |
| 365 | return int(5); |
| 366 | } else if (varExpr.name === 't_bool') { |
| 367 | return int(6); |
| 368 | } else if (varExpr.name === 't_blob') { |
| 369 | return int(10); |
| 370 | } else if (varExpr.name === 'numbermax') { |
| 371 | return int(Number.MAX_SAFE_INTEGER); |
| 372 | } else if (varExpr.name === 'numbermin') { |
| 373 | return int(Number.MIN_SAFE_INTEGER); |
| 374 | } else if (varExpr.name === 'numbersize') { |
| 375 | // NOTE: In VimScript this refers to a 64 bit integer; we have a 64 bit float because JavaScript |
| 376 | return int(64); |
| 377 | } else if (varExpr.name === 'errors') { |
| 378 | return list(this.errors.map(str)); |
| 379 | } else if (varExpr.name === 'searchforward') { |
| 380 | return int(globalState.searchState?.direction === SearchDirection.Backward ? 0 : 1); |
| 381 | } |