diff options
| author | veetaha <veetaha2@gmail.com> | 2020-04-22 02:28:44 +0300 |
|---|---|---|
| committer | veetaha <veetaha2@gmail.com> | 2020-04-22 12:35:03 +0300 |
| commit | c12d0e0214ea3d7262eff4b9e21a033ee423ef99 (patch) | |
| tree | ece08a471d69fa678ac1cd588c2def1149fddec8 /editors/code/src | |
| parent | 07bd4bedcb9a0c560578399e840b413b500d4a46 (diff) | |
| download | rust-c12d0e0214ea3d7262eff4b9e21a033ee423ef99.tar.gz rust-c12d0e0214ea3d7262eff4b9e21a033ee423ef99.zip | |
Refactor the workaround a bit
Diffstat (limited to 'editors/code/src')
| -rw-r--r-- | editors/code/src/commands/syntax_tree.ts | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/editors/code/src/commands/syntax_tree.ts b/editors/code/src/commands/syntax_tree.ts index f00f46be238..cfcf47b2fc5 100644 --- a/editors/code/src/commands/syntax_tree.ts +++ b/editors/code/src/commands/syntax_tree.ts @@ -216,37 +216,34 @@ class AstInspector implements vscode.HoverProvider, vscode.DefinitionProvider, D return new vscode.Range(begin, end); } - // Shitty memoize the last value, otherwise the CPU is at 100% single core + // Memoize the last value, otherwise the CPU is at 100% single core // with quadratic lookups when we build rust2Ast cache - memo?: [vscode.TextDocument, number, number]; + cache?: { doc: vscode.TextDocument; offset: number; line: number }; - positionAt(doc: vscode.TextDocument, offset: number): vscode.Position { + positionAt(doc: vscode.TextDocument, targetOffset: number): vscode.Position { if (doc.eol === vscode.EndOfLine.LF) { - return doc.positionAt(offset); + return doc.positionAt(targetOffset); } - // God damn shitty workaround for crlf line endings + // Shitty workaround for crlf line endings // We are still in this prehistoric era of carriage returns here... - let i = 0; - let curOffset = 0; + let line = 0; + let offset = 0; - if (this.memo) { - const [memDoc, memOffset, memI] = this.memo; - if (memDoc === doc && memOffset <= offset) { - curOffset = memOffset; - i = memI; - } + const cache = this.cache; + if (cache?.doc === doc && cache.offset <= targetOffset) { + ({ line, offset } = cache); } while (true) { - const lineLenWithLf = doc.lineAt(i).text.length + 1; - curOffset += lineLenWithLf; - if (curOffset > offset) { - this.memo = [doc, curOffset - lineLenWithLf, i]; - return doc.positionAt(offset + i); + const lineLenWithLf = doc.lineAt(line).text.length + 1; + if (offset + lineLenWithLf > targetOffset) { + this.cache = { doc, offset, line }; + return doc.positionAt(targetOffset + line); } - i += 1; + offset += lineLenWithLf; + line += 1; } } } |
