Skip to content

Commit c232cea

Browse files
committed
perf(analyzer): simplify generating of internal libdocs for resource files
1 parent 01c8d05 commit c232cea

File tree

7 files changed

+228
-228
lines changed

7 files changed

+228
-228
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ def generate_sem_sub_tokens(
491491
)
492492

493493
if builtin_library_doc is not None and kw in builtin_library_doc.keywords:
494-
if kw_doc is not None and kw_doc.libname == cls.BUILTIN_MATCHER and kw_doc.matcher == kw:
494+
if kw_doc is not None and kw_doc.libname == cls.BUILTIN_MATCHER and kw_doc.matcher.match_string(kw):
495495
if not sem_mod:
496496
sem_mod = set()
497497
sem_mod.add(RobotSemTokenModifiers.BUILTIN)

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import functools
12
from dataclasses import dataclass, field
23
from enum import Enum
34
from typing import (
@@ -142,7 +143,7 @@ def __init__(self, name: str) -> None:
142143

143144
self.base = match.base
144145

145-
self.normalized_name = str(normalize(self.base))
146+
self.normalized_name = normalize(self.base)
146147

147148
def __eq__(self, o: object) -> bool:
148149
if type(o) is VariableMatcher:
@@ -154,7 +155,7 @@ def __eq__(self, o: object) -> bool:
154155
if base is None:
155156
return False
156157

157-
normalized = str(normalize(base))
158+
normalized = normalize(base)
158159
return self.normalized_name == normalized
159160

160161
return False
@@ -194,10 +195,9 @@ class VariableDefinition(SourceEntity):
194195
value: Any = field(default=None, compare=False)
195196
value_is_native: bool = field(default=False, compare=False)
196197

197-
matcher: VariableMatcher = field(init=False, compare=False)
198-
199-
def __post_init__(self) -> None:
200-
self.matcher = VariableMatcher(self.name)
198+
@functools.cached_property
199+
def matcher(self) -> VariableMatcher:
200+
return VariableMatcher(self.name)
201201

202202
@single_call
203203
def __hash__(self) -> int:

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -573,12 +573,10 @@ def __init__(
573573
self._resource_document_changed_timer_interval = 1
574574
self._resource_document_changed_documents: Set[TextDocument] = set()
575575

576-
self._resource_libdoc_cache: "weakref.WeakKeyDictionary[ast.AST, Dict[Tuple[str, bool], LibraryDoc]]" = (
576+
self._resource_libdoc_cache: "weakref.WeakKeyDictionary[ast.AST, Dict[str, LibraryDoc]]" = (
577577
weakref.WeakKeyDictionary()
578578
)
579579

580-
self._process_pool_executor: Optional[ProcessPoolExecutor] = None
581-
582580
def __del__(self) -> None:
583581
try:
584582
if self._executor is not None:
@@ -1302,9 +1300,8 @@ def get_libdoc_from_model(
13021300
self,
13031301
model: ast.AST,
13041302
source: str,
1305-
append_model_errors: bool = True,
13061303
) -> LibraryDoc:
1307-
key = (source, append_model_errors)
1304+
key = source
13081305

13091306
entry = None
13101307
if model in self._resource_libdoc_cache:
@@ -1313,11 +1310,7 @@ def get_libdoc_from_model(
13131310
if entry and key in entry:
13141311
return entry[key]
13151312

1316-
result = get_model_doc(
1317-
model=model,
1318-
source=source,
1319-
append_model_errors=append_model_errors,
1320-
)
1313+
result = get_model_doc(model=model, source=source)
13211314
if entry is None:
13221315
entry = {}
13231316
self._resource_libdoc_cache[model] = entry

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

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ class CancelSearchError(Exception):
3939

4040

4141
class KeywordFinder:
42-
def __init__(self, namespace: "Namespace", library_doc: LibraryDoc) -> None:
43-
self.namespace = namespace
44-
self.self_library_doc = library_doc
42+
def __init__(self, namespace: "Namespace") -> None:
43+
self._namespace = namespace
4544

4645
self.diagnostics: List[DiagnosticsEntry] = []
4746
self.result_bdd_prefix: Optional[str] = None
@@ -57,9 +56,9 @@ def __init__(self, namespace: "Namespace", library_doc: LibraryDoc) -> None:
5756
],
5857
] = {}
5958

60-
self._all_keywords: Optional[List[LibraryEntry]] = None
61-
self._resource_imports: Optional[List[ResourceEntry]] = None
62-
self._library_imports: Optional[List[LibraryEntry]] = None
59+
@functools.cached_property
60+
def _library_doc(self) -> LibraryDoc:
61+
return self._namespace.get_library_doc()
6362

6463
def reset_diagnostics(self) -> None:
6564
self.diagnostics = []
@@ -162,7 +161,7 @@ def _find_keyword(
162161
def _get_keyword_from_self(self, name: str) -> Optional[KeywordDoc]:
163162
if get_robot_version() >= (6, 0):
164163
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = [
165-
(None, v) for v in self.self_library_doc.keywords.iter_all(name)
164+
(None, v) for v in self._library_doc.keywords.iter_all(name)
166165
]
167166
if len(found) > 1:
168167
found = self._select_best_matches(found)
@@ -183,7 +182,7 @@ def _get_keyword_from_self(self, name: str) -> Optional[KeywordDoc]:
183182
return None
184183

185184
try:
186-
return self.self_library_doc.keywords.get(name, None)
185+
return self._library_doc.keywords.get(name, None)
187186
except KeywordError as e:
188187
self.diagnostics.append(DiagnosticsEntry(str(e), DiagnosticSeverity.ERROR, Error.KEYWORD_ERROR))
189188
raise CancelSearchError from e
@@ -213,15 +212,16 @@ def _get_explicit_keyword(self, name: str) -> Optional[KeywordDoc]:
213212

214213
return found[0][1] if found else None
215214

216-
def find_keywords(self, owner_name: str, name: str) -> List[Tuple[LibraryEntry, KeywordDoc]]:
217-
if self._all_keywords is None:
218-
self._all_keywords = list(
219-
chain(
220-
self.namespace._libraries.values(),
221-
self.namespace._resources.values(),
222-
)
215+
@functools.cached_property
216+
def _all_keywords(self) -> List[LibraryEntry]:
217+
return list(
218+
chain(
219+
self._namespace._libraries.values(),
220+
self._namespace._resources.values(),
223221
)
222+
)
224223

224+
def find_keywords(self, owner_name: str, name: str) -> List[Tuple[LibraryEntry, KeywordDoc]]:
225225
if get_robot_version() >= (6, 0):
226226
result: List[Tuple[LibraryEntry, KeywordDoc]] = []
227227
for v in self._all_keywords:
@@ -271,11 +271,11 @@ def _get_implicit_keyword(self, name: str) -> Optional[KeywordDoc]:
271271
def _prioritize_same_file_or_public(
272272
self, entries: List[Tuple[Optional[LibraryEntry], KeywordDoc]]
273273
) -> List[Tuple[Optional[LibraryEntry], KeywordDoc]]:
274-
matches = [h for h in entries if h[1].source == self.namespace.source]
274+
matches = [h for h in entries if h[1].source == self._namespace.source]
275275
if matches:
276276
return matches
277277

278-
matches = [handler for handler in entries if not handler[1].is_private()]
278+
matches = [handler for handler in entries if not handler[1].is_private]
279279

280280
return matches or entries
281281

@@ -318,10 +318,11 @@ def _is_better_match(
318318
and candidate[1].matcher.embedded_arguments.match(other[1].name) is None
319319
)
320320

321-
def _get_keyword_from_resource_files(self, name: str) -> Optional[KeywordDoc]:
322-
if self._resource_imports is None:
323-
self._resource_imports = list(chain(self.namespace._resources.values()))
321+
@functools.cached_property
322+
def _resource_imports(self) -> List[ResourceEntry]:
323+
return list(chain(self._namespace._resources.values()))
324324

325+
def _get_keyword_from_resource_files(self, name: str) -> Optional[KeywordDoc]:
325326
if get_robot_version() >= (6, 0):
326327
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = [
327328
(v, k) for v in self._resource_imports for k in v.library_doc.keywords.iter_all(name)
@@ -365,17 +366,18 @@ def _get_keyword_from_resource_files(self, name: str) -> Optional[KeywordDoc]:
365366
def _get_keyword_based_on_search_order(
366367
self, entries: List[Tuple[Optional[LibraryEntry], KeywordDoc]]
367368
) -> List[Tuple[Optional[LibraryEntry], KeywordDoc]]:
368-
for libname in self.namespace.search_order:
369+
for libname in self._namespace.search_order:
369370
for e in entries:
370371
if e[0] is not None and eq_namespace(libname, e[0].alias or e[0].name):
371372
return [e]
372373

373374
return entries
374375

375-
def _get_keyword_from_libraries(self, name: str) -> Optional[KeywordDoc]:
376-
if self._library_imports is None:
377-
self._library_imports = list(chain(self.namespace._libraries.values()))
376+
@functools.cached_property
377+
def _library_imports(self) -> List[LibraryEntry]:
378+
return list(chain(self._namespace._libraries.values()))
378379

380+
def _get_keyword_from_libraries(self, name: str) -> Optional[KeywordDoc]:
379381
if get_robot_version() >= (6, 0):
380382
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = [
381383
(v, k) for v in self._library_imports for k in v.library_doc.keywords.iter_all(name)
@@ -462,8 +464,8 @@ def _create_custom_and_standard_keyword_conflict_warning_message(
462464
def bdd_prefix_regexp(self) -> "re.Pattern[str]":
463465
prefixes = (
464466
"|".join(
465-
self.namespace.languages.bdd_prefixes
466-
if self.namespace.languages is not None
467+
self._namespace.languages.bdd_prefixes
468+
if self._namespace.languages is not None
467469
else ["given", "when", "then", "and", "but"]
468470
)
469471
.replace(" ", r"\s")

0 commit comments

Comments
 (0)