aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/code/src/commands/syntax_tree.ts35
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 f00f46be2..cfcf47b2f 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
216 return new vscode.Range(begin, end); 216 return new vscode.Range(begin, end);
217 } 217 }
218 218
219 // Shitty memoize the last value, otherwise the CPU is at 100% single core 219 // Memoize the last value, otherwise the CPU is at 100% single core
220 // with quadratic lookups when we build rust2Ast cache 220 // with quadratic lookups when we build rust2Ast cache
221 memo?: [vscode.TextDocument, number, number]; 221 cache?: { doc: vscode.TextDocument; offset: number; line: number };
222 222
223 positionAt(doc: vscode.TextDocument, offset: number): vscode.Position { 223 positionAt(doc: vscode.TextDocument, targetOffset: number): vscode.Position {
224 if (doc.eol === vscode.EndOfLine.LF) { 224 if (doc.eol === vscode.EndOfLine.LF) {
225 return doc.positionAt(offset); 225 return doc.positionAt(targetOffset);
226 } 226 }
227 227
228 // God damn shitty workaround for crlf line endings 228 // Shitty workaround for crlf line endings
229 // We are still in this prehistoric era of carriage returns here... 229 // We are still in this prehistoric era of carriage returns here...
230 230
231 let i = 0; 231 let line = 0;
232 let curOffset = 0; 232 let offset = 0;
233 233
234 if (this.memo) { 234 const cache = this.cache;
235 const [memDoc, memOffset, memI] = this.memo; 235 if (cache?.doc === doc && cache.offset <= targetOffset) {
236 if (memDoc === doc && memOffset <= offset) { 236 ({ line, offset } = cache);
237 curOffset = memOffset;
238 i = memI;
239 }
240 } 237 }
241 238
242 while (true) { 239 while (true) {
243 const lineLenWithLf = doc.lineAt(i).text.length + 1; 240 const lineLenWithLf = doc.lineAt(line).text.length + 1;
244 curOffset += lineLenWithLf; 241 if (offset + lineLenWithLf > targetOffset) {
245 if (curOffset > offset) { 242 this.cache = { doc, offset, line };
246 this.memo = [doc, curOffset - lineLenWithLf, i]; 243 return doc.positionAt(targetOffset + line);
247 return doc.positionAt(offset + i);
248 } 244 }
249 i += 1; 245 offset += lineLenWithLf;
246 line += 1;
250 } 247 }
251 } 248 }
252} 249}