Skip to content

Commit aaa6439

Browse files
committed
perf(analyzer): speed up finding keywords and variables a little bit more
1 parent c662685 commit aaa6439

File tree

3 files changed

+28
-31
lines changed

3 files changed

+28
-31
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,10 @@ def __init__(self, name: str) -> None:
145145
self.normalized_name = str(normalize(self.base))
146146

147147
def __eq__(self, o: object) -> bool:
148-
if isinstance(o, VariableMatcher):
148+
if type(o) is VariableMatcher:
149149
return o.normalized_name == self.normalized_name
150150

151-
if isinstance(o, str):
151+
if type(o) is str:
152152
match = search_variable(o, "$@&%", ignore_errors=True)
153153
base = match.base
154154
if base is None:

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

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ def __init__(self, namespace: "Namespace", library_doc: LibraryDoc) -> None:
5858
] = {}
5959

6060
self._all_keywords: Optional[List[LibraryEntry]] = None
61-
self._resource_keywords: Optional[List[ResourceEntry]] = None
62-
self._library_keywords: Optional[List[LibraryEntry]] = None
61+
self._resource_imports: Optional[List[ResourceEntry]] = None
62+
self._library_imports: Optional[List[LibraryEntry]] = None
6363

6464
def reset_diagnostics(self) -> None:
6565
self.diagnostics = []
@@ -312,23 +312,23 @@ def _is_better_match(
312312
other: Tuple[Optional[LibraryEntry], KeywordDoc],
313313
) -> bool:
314314
return (
315-
other[1].matcher.embedded_arguments.match(candidate[1].name) is not None
315+
other[1].matcher.embedded_arguments is not None
316+
and candidate[1].matcher.embedded_arguments is not None
317+
and other[1].matcher.embedded_arguments.match(candidate[1].name) is not None
316318
and candidate[1].matcher.embedded_arguments.match(other[1].name) is None
317319
)
318320

319321
def _get_keyword_from_resource_files(self, name: str) -> Optional[KeywordDoc]:
320-
if self._resource_keywords is None:
321-
self._resource_keywords = list(chain(self.namespace._resources.values()))
322+
if self._resource_imports is None:
323+
self._resource_imports = list(chain(self.namespace._resources.values()))
322324

323325
if get_robot_version() >= (6, 0):
324-
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = []
325-
for v in self._resource_keywords:
326-
r = v.library_doc.keywords.get_all(name)
327-
if r:
328-
found.extend([(v, k) for k in r])
326+
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = [
327+
(v, k) for v in self._resource_imports for k in v.library_doc.keywords.iter_all(name)
328+
]
329329
else:
330330
found = []
331-
for k in self._resource_keywords:
331+
for k in self._resource_imports:
332332
s = k.library_doc.keywords.get(name, None)
333333
if s is not None:
334334
found.append((k, s))
@@ -373,19 +373,18 @@ def _get_keyword_based_on_search_order(
373373
return entries
374374

375375
def _get_keyword_from_libraries(self, name: str) -> Optional[KeywordDoc]:
376-
if self._library_keywords is None:
377-
self._library_keywords = list(chain(self.namespace._libraries.values()))
376+
if self._library_imports is None:
377+
self._library_imports = list(chain(self.namespace._libraries.values()))
378378

379379
if get_robot_version() >= (6, 0):
380-
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = []
381-
for v in self._library_keywords:
382-
r = v.library_doc.keywords.get_all(name)
383-
if r:
384-
found.extend([(v, k) for k in r])
380+
found: List[Tuple[Optional[LibraryEntry], KeywordDoc]] = [
381+
(v, k) for v in self._library_imports for k in v.library_doc.keywords.iter_all(name)
382+
]
383+
385384
else:
386385
found = []
387386

388-
for k in self._library_keywords:
387+
for k in self._library_imports:
389388
s = k.library_doc.keywords.get(name, None)
390389
if s is not None:
391390
found.append((k, s))

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -240,29 +240,27 @@ def __init__(
240240
self._is_namespace = is_namespace
241241
self._normalized_name: Optional[str] = None
242242

243+
self.embedded_arguments: Optional[EmbeddedArguments] = (
244+
_get_embedded_arguments(self.name) or None if self._can_have_embedded else None
245+
)
246+
self._match_cache: Dict[str, bool] = {}
247+
243248
@property
244249
def normalized_name(self) -> str:
245250
if self._normalized_name is None:
246251
self._normalized_name = str(normalize_namespace(self.name) if self._is_namespace else normalize(self.name))
247252

248253
return self._normalized_name
249254

250-
@functools.cached_property
251-
def embedded_arguments(self) -> Any:
252-
if self._can_have_embedded:
253-
return _get_embedded_arguments(self.name) or ()
254-
255-
return ()
256-
257255
if get_robot_version() >= (6, 0):
258256

259257
def __match_embedded(self, name: str) -> bool:
260-
return self.embedded_arguments.match(name) is not None
258+
return self.embedded_arguments is not None and self.embedded_arguments.match(name) is not None
261259

262260
else:
263261

264262
def __match_embedded(self, name: str) -> bool:
265-
return self.embedded_arguments.name.match(name) is not None
263+
return self.embedded_arguments is not None and self.embedded_arguments.name.match(name) is not None
266264

267265
def __eq__(self, o: object) -> bool:
268266
if type(o) is KeywordMatcher:
@@ -274,7 +272,7 @@ def __eq__(self, o: object) -> bool:
274272

275273
o = o.name
276274

277-
if not cached_isinstance(o, str):
275+
if type(o) is not str:
278276
return False
279277

280278
if self.embedded_arguments:

0 commit comments

Comments
 (0)