Skip to content

Commit 5f8591d

Browse files
committed
perf(robot): remove unnecessary token list caching from document cache
Token lists were cached separately in document._cache, but only used as intermediate input for AST model building. No external caller ever accessed the cached token lists directly. Move token generation into model builder methods so tokens are only produced on cache miss. On cache hit, neither tokenization nor model building occurs. - Eliminates up to 6 cached token lists per document in Language Server - No behavior change for CLI (tokens were already uncached for version=None) - Remove ~80 lines of redundant caching infrastructure
1 parent e0e8d81 commit 5f8591d

File tree

1 file changed

+36
-132
lines changed

1 file changed

+36
-132
lines changed

packages/robot/src/robotcode/robot/diagnostics/document_cache_helper.py

Lines changed: 36 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from pathlib import Path
99
from typing import (
1010
Any,
11-
Callable,
1211
Iterable,
1312
Iterator,
1413
List,
@@ -176,43 +175,16 @@ def __get_document_type(self, document: TextDocument) -> DocumentType:
176175
return DocumentType.UNKNOWN
177176

178177
def get_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
179-
if data_only:
180-
return self.__get_tokens_data_only(document)
181-
return self.__get_tokens(document)
182-
183-
def __get_tokens_data_only(self, document: TextDocument) -> List[Token]:
184-
document_type = self.get_document_type(document)
185-
if document_type == DocumentType.INIT:
186-
return self.get_init_tokens(document, True)
187-
if document_type == DocumentType.GENERAL:
188-
return self.get_general_tokens(document, True)
189-
if document_type == DocumentType.RESOURCE:
190-
return self.get_resource_tokens(document, True)
191-
192-
raise UnknownFileTypeError(str(document.uri))
193-
194-
def __get_tokens(self, document: TextDocument) -> List[Token]:
195178
document_type = self.get_document_type(document)
196179
if document_type == DocumentType.INIT:
197-
return self.get_init_tokens(document)
180+
return self.__get_init_tokens(document, data_only)
198181
if document_type == DocumentType.GENERAL:
199-
return self.get_general_tokens(document)
182+
return self.__get_general_tokens(document, data_only)
200183
if document_type == DocumentType.RESOURCE:
201-
return self.get_resource_tokens(document)
184+
return self.__get_resource_tokens(document, data_only)
202185

203186
raise UnknownFileTypeError(str(document.uri))
204187

205-
def get_general_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
206-
if document.version is None:
207-
if data_only:
208-
return self.__get_general_tokens_data_only(document)
209-
210-
return self.__get_general_tokens(document)
211-
212-
if data_only:
213-
return document.get_cache(self.__get_general_tokens_data_only)
214-
return document.get_cache(self.__get_general_tokens)
215-
216188
def __internal_get_tokens(
217189
self,
218190
source: Any,
@@ -270,85 +242,20 @@ def __internal_get_init_tokens(
270242

271243
return robot.api.get_init_tokens(source, data_only=data_only, tokenize_variables=tokenize_variables)
272244

273-
def __get_general_tokens_data_only(self, document: TextDocument) -> List[Token]:
274-
lang = self.get_languages_for_document(document)
275-
276-
def get(text: str) -> List[Token]:
277-
with io.StringIO(text) as content:
278-
return [e for e in self.__internal_get_tokens(content, True, lang=lang)]
279-
280-
return self.__get_tokens_internal(document, get)
281-
282-
def __get_general_tokens(self, document: TextDocument) -> List[Token]:
283-
lang = self.get_languages_for_document(document)
284-
285-
def get(text: str) -> List[Token]:
286-
with io.StringIO(text) as content:
287-
return [e for e in self.__internal_get_tokens(content, lang=lang)]
288-
289-
return self.__get_tokens_internal(document, get)
290-
291-
def __get_tokens_internal(self, document: TextDocument, get: Callable[[str], List[Token]]) -> List[Token]:
292-
return get(document.text())
293-
294-
def get_resource_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
295-
if document.version is None:
296-
if data_only:
297-
return self.__get_resource_tokens_data_only(document)
298-
299-
return self.__get_resource_tokens(document)
300-
301-
if data_only:
302-
return document.get_cache(self.__get_resource_tokens_data_only)
303-
304-
return document.get_cache(self.__get_resource_tokens)
305-
306-
def __get_resource_tokens_data_only(self, document: TextDocument) -> List[Token]:
307-
lang = self.get_languages_for_document(document)
308-
309-
def get(text: str) -> List[Token]:
310-
with io.StringIO(text) as content:
311-
return [e for e in self.__internal_get_resource_tokens(content, True, lang=lang)]
312-
313-
return self.__get_tokens_internal(document, get)
314-
315-
def __get_resource_tokens(self, document: TextDocument) -> List[Token]:
245+
def __get_general_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
316246
lang = self.get_languages_for_document(document)
247+
with io.StringIO(document.text()) as content:
248+
return [e for e in self.__internal_get_tokens(content, data_only, lang=lang)]
317249

318-
def get(text: str) -> List[Token]:
319-
with io.StringIO(text) as content:
320-
return [e for e in self.__internal_get_resource_tokens(content, lang=lang)]
321-
322-
return self.__get_tokens_internal(document, get)
323-
324-
def get_init_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
325-
if document.version is None:
326-
if data_only:
327-
return self.__get_init_tokens_data_only(document)
328-
329-
return self.__get_init_tokens(document)
330-
331-
if data_only:
332-
return document.get_cache(self.__get_init_tokens_data_only)
333-
return document.get_cache(self.__get_init_tokens)
334-
335-
def __get_init_tokens_data_only(self, document: TextDocument) -> List[Token]:
250+
def __get_resource_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
336251
lang = self.get_languages_for_document(document)
252+
with io.StringIO(document.text()) as content:
253+
return [e for e in self.__internal_get_resource_tokens(content, data_only, lang=lang)]
337254

338-
def get(text: str) -> List[Token]:
339-
with io.StringIO(text) as content:
340-
return [e for e in self.__internal_get_init_tokens(content, True, lang=lang)]
341-
342-
return self.__get_tokens_internal(document, get)
343-
344-
def __get_init_tokens(self, document: TextDocument) -> List[Token]:
255+
def __get_init_tokens(self, document: TextDocument, data_only: bool = False) -> List[Token]:
345256
lang = self.get_languages_for_document(document)
346-
347-
def get(text: str) -> List[Token]:
348-
with io.StringIO(text) as content:
349-
return [e for e in self.__internal_get_init_tokens(content, lang=lang)]
350-
351-
return self.__get_tokens_internal(document, get)
257+
with io.StringIO(document.text()) as content:
258+
return [e for e in self.__internal_get_init_tokens(content, data_only, lang=lang)]
352259

353260
def get_model(self, document: TextDocument, data_only: bool = True) -> ast.AST:
354261
document_type = self.get_document_type(document)
@@ -387,59 +294,56 @@ def get_tokens(source: str, data_only: bool = False, lang: Any = None) -> Iterat
387294
def get_general_model(self, document: TextDocument, data_only: bool = True) -> ast.AST:
388295
if document.version is None:
389296
if data_only:
390-
return self.__get_general_model_data_only(document, self.get_general_tokens(document, True))
297+
return self.__get_general_model_data_only(document)
391298

392-
return self.__get_general_model(document, self.get_general_tokens(document))
299+
return self.__get_general_model(document)
393300

394301
if data_only:
395-
return document.get_cache(self.__get_general_model_data_only, self.get_general_tokens(document, True))
302+
return document.get_cache(self.__get_general_model_data_only)
396303

397-
return document.get_cache(self.__get_general_model, self.get_general_tokens(document))
304+
return document.get_cache(self.__get_general_model)
398305

399-
def __get_general_model_data_only(self, document: TextDocument, tokens: Iterable[Any]) -> ast.AST:
400-
return self.__get_model(document, tokens, DocumentType.GENERAL)
306+
def __get_general_model_data_only(self, document: TextDocument) -> ast.AST:
307+
return self.__get_model(document, self.__get_general_tokens(document, True), DocumentType.GENERAL)
401308

402-
def __get_general_model(self, document: TextDocument, tokens: Iterable[Any]) -> ast.AST:
403-
return self.__get_model(document, tokens, DocumentType.GENERAL)
309+
def __get_general_model(self, document: TextDocument) -> ast.AST:
310+
return self.__get_model(document, self.__get_general_tokens(document), DocumentType.GENERAL)
404311

405312
def get_resource_model(self, document: TextDocument, data_only: bool = True) -> ast.AST:
406313
if document.version is None:
407314
if data_only:
408-
return self.__get_resource_model_data_only(document, self.get_resource_tokens(document, True))
315+
return self.__get_resource_model_data_only(document)
409316

410-
return self.__get_resource_model(document, self.get_resource_tokens(document))
317+
return self.__get_resource_model(document)
411318

412319
if data_only:
413-
return document.get_cache(
414-
self.__get_resource_model_data_only,
415-
self.get_resource_tokens(document, True),
416-
)
320+
return document.get_cache(self.__get_resource_model_data_only)
417321

418-
return document.get_cache(self.__get_resource_model, self.get_resource_tokens(document))
322+
return document.get_cache(self.__get_resource_model)
419323

420-
def __get_resource_model_data_only(self, document: TextDocument, tokens: Iterable[Any]) -> ast.AST:
421-
return self.__get_model(document, tokens, DocumentType.RESOURCE)
324+
def __get_resource_model_data_only(self, document: TextDocument) -> ast.AST:
325+
return self.__get_model(document, self.__get_resource_tokens(document, True), DocumentType.RESOURCE)
422326

423-
def __get_resource_model(self, document: TextDocument, tokens: Iterable[Any]) -> ast.AST:
424-
return self.__get_model(document, tokens, DocumentType.RESOURCE)
327+
def __get_resource_model(self, document: TextDocument) -> ast.AST:
328+
return self.__get_model(document, self.__get_resource_tokens(document), DocumentType.RESOURCE)
425329

426330
def get_init_model(self, document: TextDocument, data_only: bool = True) -> ast.AST:
427331
if document.version is None:
428332
if data_only:
429-
return self.__get_init_model_data_only(document, self.get_init_tokens(document, True))
333+
return self.__get_init_model_data_only(document)
430334

431-
return self.__get_init_model(document, self.get_init_tokens(document))
335+
return self.__get_init_model(document)
432336

433337
if data_only:
434-
return document.get_cache(self.__get_init_model_data_only, self.get_init_tokens(document, True))
338+
return document.get_cache(self.__get_init_model_data_only)
435339

436-
return document.get_cache(self.__get_init_model, self.get_init_tokens(document))
340+
return document.get_cache(self.__get_init_model)
437341

438-
def __get_init_model_data_only(self, document: TextDocument, tokens: Iterable[Any]) -> ast.AST:
439-
return self.__get_model(document, tokens, DocumentType.INIT)
342+
def __get_init_model_data_only(self, document: TextDocument) -> ast.AST:
343+
return self.__get_model(document, self.__get_init_tokens(document, True), DocumentType.INIT)
440344

441-
def __get_init_model(self, document: TextDocument, tokens: Iterable[Any]) -> ast.AST:
442-
return self.__get_model(document, tokens, DocumentType.INIT)
345+
def __get_init_model(self, document: TextDocument) -> ast.AST:
346+
return self.__get_model(document, self.__get_init_tokens(document), DocumentType.INIT)
443347

444348
def get_namespace(self, document: TextDocument) -> Namespace:
445349
document_type = self.get_document_type(document)

0 commit comments

Comments
 (0)