@@ -39,9 +39,8 @@ class CancelSearchError(Exception):
3939
4040
4141class 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