Skip to content

Commit e2e4cbd

Browse files
committed
perf(diagnostics): consolidate to single AST model and remove data_only parameter
This eliminates the second cached AST model per document, saving ~500KB/doc in CLI and ~200KB/doc in the Language Server. Releasing the model reference after analysis frees an additional ~100-500KB/doc in CLI mode.
1 parent 5cb7bb7 commit e2e4cbd

16 files changed

Lines changed: 58 additions & 84 deletions

packages/language_server/src/robotcode/language_server/robotframework/parts/code_action_documentation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def collect(
6767

6868
namespace = self.parent.documents_cache.get_namespace(document)
6969

70-
model = self.parent.documents_cache.get_model(document, False)
70+
model = self.parent.documents_cache.get_model(document)
7171
node = get_node_at_position(model, range.start)
7272

7373
if context.only and isinstance(node, (LibraryImport, ResourceImport)):

packages/language_server/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def code_action_create_keyword(
155155
CodeActionTriggerKind.INVOKED,
156156
CodeActionTriggerKind.AUTOMATIC,
157157
]:
158-
model = self.parent.documents_cache.get_model(document, False)
158+
model = self.parent.documents_cache.get_model(document)
159159
namespace = self.parent.documents_cache.get_namespace(document)
160160

161161
for diagnostic in (
@@ -218,7 +218,7 @@ def resolve_code_action_create_keyword(self, code_action: CodeAction, data: Code
218218
if document is None:
219219
return None
220220

221-
model = self.parent.documents_cache.get_model(document, False)
221+
model = self.parent.documents_cache.get_model(document)
222222
node = get_node_at_position(model, data.range.start)
223223

224224
if isinstance(node, (KeywordCall, Fixture, TestTemplate, Template)):
@@ -282,7 +282,7 @@ def resolve_code_action_create_keyword(self, code_action: CodeAction, data: Code
282282
return None
283283

284284
def _apply_create_keyword(self, document: TextDocument, insert_text: str) -> Tuple[WorkspaceEdit, Range]:
285-
model = self.parent.documents_cache.get_model(document, False)
285+
model = self.parent.documents_cache.get_model(document)
286286
namespace = self.parent.documents_cache.get_namespace(document)
287287

288288
insert_text, insert_range = self.create_insert_keyword_workspace_edit(document, model, namespace, insert_text)
@@ -406,7 +406,7 @@ def code_action_create_local_variable(
406406
diagnostic.range.start.line == diagnostic.range.end.line
407407
and diagnostic.range.start.character < diagnostic.range.end.character
408408
):
409-
model = self.parent.documents_cache.get_model(document, False)
409+
model = self.parent.documents_cache.get_model(document)
410410
nodes = get_nodes_at_position(model, range.start)
411411

412412
if not any(n for n in nodes if isinstance(n, (Keyword, TestCase))):
@@ -451,7 +451,7 @@ def resolve_code_action_create_local_variable(
451451
if document is None:
452452
return None
453453

454-
model = self.parent.documents_cache.get_model(document, False)
454+
model = self.parent.documents_cache.get_model(document)
455455
nodes = get_nodes_at_position(model, data.range.start)
456456

457457
if not any(n for n in nodes if isinstance(n, (Keyword, TestCase))):
@@ -554,7 +554,7 @@ def resolve_code_action_create_suite_variable(
554554
if document is None:
555555
return None
556556

557-
model = self.parent.documents_cache.get_model(document, False)
557+
model = self.parent.documents_cache.get_model(document)
558558
nodes = get_nodes_at_position(model, data.range.start)
559559

560560
node = nodes[-1] if nodes else None
@@ -679,7 +679,7 @@ def code_action_add_argument(
679679
if not text:
680680
continue
681681

682-
model = self.parent.documents_cache.get_model(document, False)
682+
model = self.parent.documents_cache.get_model(document)
683683
nodes = get_nodes_at_position(model, range.start)
684684

685685
if not any(n for n in nodes if isinstance(n, Keyword)):
@@ -713,7 +713,7 @@ def resolve_code_action_add_argument(self, code_action: CodeAction, data: CodeAc
713713
if not text:
714714
return None
715715

716-
model = self.parent.documents_cache.get_model(document, False)
716+
model = self.parent.documents_cache.get_model(document)
717717
nodes = get_nodes_at_position(model, data.range.start)
718718

719719
keyword = next((n for n in nodes if isinstance(n, Keyword)), None)

packages/language_server/src/robotcode/language_server/robotframework/parts/code_action_refactor.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def code_action_surround(
267267
if range.start == range.end:
268268
return None
269269

270-
model = self.parent.documents_cache.get_model(document, False)
270+
model = self.parent.documents_cache.get_model(document)
271271
start_nodes = get_nodes_at_position(model, range.start)
272272

273273
enabled = False
@@ -427,7 +427,7 @@ def code_action_assign_result_to_variable(
427427
(context.only and CodeActionKind.REFACTOR_EXTRACT in context.only)
428428
or context.trigger_kind in [CodeActionTriggerKind.INVOKED, CodeActionTriggerKind.AUTOMATIC]
429429
):
430-
model = self.parent.documents_cache.get_model(document, False)
430+
model = self.parent.documents_cache.get_model(document)
431431
node = get_node_at_position(model, range.start)
432432

433433
if not isinstance(node, KeywordCall) or node.assign:
@@ -480,7 +480,7 @@ def resolve_code_action_assign_result_to_variable(
480480
if document is None:
481481
return None
482482

483-
model = self.parent.documents_cache.get_model(document, False)
483+
model = self.parent.documents_cache.get_model(document)
484484
nodes = get_nodes_at_position(model, range.start)
485485
if not nodes:
486486
return None
@@ -544,7 +544,7 @@ def code_action_extract_keyword(
544544
if range.start == range.end:
545545
return None
546546

547-
model = self.parent.documents_cache.get_model(document, False)
547+
model = self.parent.documents_cache.get_model(document)
548548
start_nodes = get_nodes_at_position(model, range.start)
549549

550550
enabled = False
@@ -595,7 +595,7 @@ def resolve_code_action_extract_keyword(
595595
lines = document.get_lines()
596596
spaces = "".join(itertools.takewhile(str.isspace, lines[data.range.start.line]))
597597

598-
model = self.parent.documents_cache.get_model(document, False)
598+
model = self.parent.documents_cache.get_model(document)
599599
namespace = self.parent.documents_cache.get_namespace(document)
600600

601601
orig_keyword_name = "New Keyword"

packages/language_server/src/robotcode/language_server/robotframework/parts/completion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def collect(
168168
context: Optional[CompletionContext],
169169
) -> Union[List[CompletionItem], CompletionList, None]:
170170
namespace = self.parent.documents_cache.get_initialized_namespace(document)
171-
model = self.parent.documents_cache.get_model(document, False)
171+
model = self.parent.documents_cache.get_model(document)
172172

173173
config = self.get_config(document)
174174
self.doc_cache = {}
@@ -190,7 +190,7 @@ def resolve(self, sender: Any, completion_item: CompletionItem) -> CompletionIte
190190
document = self.parent.documents.get(document_uri)
191191
if document is not None:
192192
namespace = self.parent.documents_cache.get_initialized_namespace(document)
193-
model = self.parent.documents_cache.get_model(document, False)
193+
model = self.parent.documents_cache.get_model(document)
194194
if namespace is not None:
195195
config = self.get_config(document)
196196

packages/language_server/src/robotcode/language_server/robotframework/parts/debugging_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ async def _get_evaluatable_expression(
5656
return None
5757

5858
namespace = self.parent.documents_cache.get_namespace(document)
59-
model = self.parent.documents_cache.get_model(document, False)
59+
model = self.parent.documents_cache.get_model(document)
6060

6161
nodes = get_nodes_at_position(model, position)
6262
node = nodes[-1]

packages/language_server/src/robotcode/language_server/robotframework/parts/document_symbols.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
4242
def collect(
4343
self, sender: Any, document: TextDocument
4444
) -> Optional[Union[List[DocumentSymbol], List[SymbolInformation], None]]:
45-
return _Visitor.find_from(self.parent.documents_cache.get_model(document, False), self)
45+
return _Visitor.find_from(self.parent.documents_cache.get_model(document), self)
4646

4747

4848
class _Visitor(Visitor):

packages/language_server/src/robotcode/language_server/robotframework/parts/folding_range.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,4 @@ def __init__(self, parent: RobotLanguageServerProtocol) -> None:
151151
@language_id("robotframework")
152152
@_logger.call
153153
def collect(self, sender: Any, document: TextDocument) -> Optional[List[FoldingRange]]:
154-
return _Visitor.find_from(self.parent.documents_cache.get_model(document, False), self)
154+
return _Visitor.find_from(self.parent.documents_cache.get_model(document), self)

packages/language_server/src/robotcode/language_server/robotframework/parts/formatting.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def format_robocop(
9494
runner = RobocopFormatter(config_manager)
9595
runner.config = config
9696

97-
model = self.parent.documents_cache.get_model(document, False)
97+
model = self.parent.documents_cache.get_model(document)
9898
if self.parent.robocop_helper.robocop_version >= (8, 0):
9999
from robocop.source_file import SourceFile
100100

@@ -131,7 +131,7 @@ def format_internal(
131131
SeparatorNormalizer,
132132
)
133133

134-
model = cast(File, self.parent.documents_cache.get_model(document, False))
134+
model = cast(File, self.parent.documents_cache.get_model(document))
135135

136136
Cleaner().visit(model)
137137
NewlineNormalizer(self.line_separator, self.short_test_name_length).visit(model)

packages/language_server/src/robotcode/language_server/robotframework/parts/inlay_hint.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def collect(self, sender: Any, document: TextDocument, range: Range) -> Optional
7272
if config is None or (not config.parameter_names and not config.namespaces):
7373
return None
7474

75-
model = self.parent.documents_cache.get_model(document, False)
75+
model = self.parent.documents_cache.get_model(document)
7676
namespace = self.parent.documents_cache.get_namespace(document)
7777

7878
result: List[InlayHint] = []

packages/language_server/src/robotcode/language_server/robotframework/parts/inline_value.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def collect(
5151

5252
namespace = self.parent.documents_cache.get_namespace(document)
5353

54-
model = self.parent.documents_cache.get_model(document, False)
54+
model = self.parent.documents_cache.get_model(document)
5555

5656
real_range = Range(range.start, min(range.end, context.stopped_location.end))
5757

0 commit comments

Comments
 (0)