@@ -39,9 +39,8 @@ class CancelSearchError(Exception):
39
39
40
40
41
41
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
45
44
46
45
self .diagnostics : List [DiagnosticsEntry ] = []
47
46
self .result_bdd_prefix : Optional [str ] = None
@@ -57,9 +56,9 @@ def __init__(self, namespace: "Namespace", library_doc: LibraryDoc) -> None:
57
56
],
58
57
] = {}
59
58
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 ()
63
62
64
63
def reset_diagnostics (self ) -> None :
65
64
self .diagnostics = []
@@ -162,7 +161,7 @@ def _find_keyword(
162
161
def _get_keyword_from_self (self , name : str ) -> Optional [KeywordDoc ]:
163
162
if get_robot_version () >= (6 , 0 ):
164
163
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 )
166
165
]
167
166
if len (found ) > 1 :
168
167
found = self ._select_best_matches (found )
@@ -183,7 +182,7 @@ def _get_keyword_from_self(self, name: str) -> Optional[KeywordDoc]:
183
182
return None
184
183
185
184
try :
186
- return self .self_library_doc .keywords .get (name , None )
185
+ return self ._library_doc .keywords .get (name , None )
187
186
except KeywordError as e :
188
187
self .diagnostics .append (DiagnosticsEntry (str (e ), DiagnosticSeverity .ERROR , Error .KEYWORD_ERROR ))
189
188
raise CancelSearchError from e
@@ -213,15 +212,16 @@ def _get_explicit_keyword(self, name: str) -> Optional[KeywordDoc]:
213
212
214
213
return found [0 ][1 ] if found else None
215
214
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 (),
223
221
)
222
+ )
224
223
224
+ def find_keywords (self , owner_name : str , name : str ) -> List [Tuple [LibraryEntry , KeywordDoc ]]:
225
225
if get_robot_version () >= (6 , 0 ):
226
226
result : List [Tuple [LibraryEntry , KeywordDoc ]] = []
227
227
for v in self ._all_keywords :
@@ -271,11 +271,11 @@ def _get_implicit_keyword(self, name: str) -> Optional[KeywordDoc]:
271
271
def _prioritize_same_file_or_public (
272
272
self , entries : List [Tuple [Optional [LibraryEntry ], KeywordDoc ]]
273
273
) -> 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 ]
275
275
if matches :
276
276
return matches
277
277
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 ]
279
279
280
280
return matches or entries
281
281
@@ -318,10 +318,11 @@ def _is_better_match(
318
318
and candidate [1 ].matcher .embedded_arguments .match (other [1 ].name ) is None
319
319
)
320
320
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 ()))
324
324
325
+ def _get_keyword_from_resource_files (self , name : str ) -> Optional [KeywordDoc ]:
325
326
if get_robot_version () >= (6 , 0 ):
326
327
found : List [Tuple [Optional [LibraryEntry ], KeywordDoc ]] = [
327
328
(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]:
365
366
def _get_keyword_based_on_search_order (
366
367
self , entries : List [Tuple [Optional [LibraryEntry ], KeywordDoc ]]
367
368
) -> List [Tuple [Optional [LibraryEntry ], KeywordDoc ]]:
368
- for libname in self .namespace .search_order :
369
+ for libname in self ._namespace .search_order :
369
370
for e in entries :
370
371
if e [0 ] is not None and eq_namespace (libname , e [0 ].alias or e [0 ].name ):
371
372
return [e ]
372
373
373
374
return entries
374
375
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 ()))
378
379
380
+ def _get_keyword_from_libraries (self , name : str ) -> Optional [KeywordDoc ]:
379
381
if get_robot_version () >= (6 , 0 ):
380
382
found : List [Tuple [Optional [LibraryEntry ], KeywordDoc ]] = [
381
383
(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(
462
464
def bdd_prefix_regexp (self ) -> "re.Pattern[str]" :
463
465
prefixes = (
464
466
"|" .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
467
469
else ["given" , "when" , "then" , "and" , "but" ]
468
470
)
469
471
.replace (" " , r"\s" )
0 commit comments