@@ -293,25 +293,40 @@ async def references_KeywordCall( # noqa: N802
293
293
return None
294
294
295
295
kw_node = cast (KeywordCall , node )
296
- keyword = await self .get_keyworddoc_and_token_from_position (
296
+ result = await self .get_keyworddoc_and_token_from_position (
297
297
kw_node .keyword ,
298
298
cast (Token , kw_node .get_token (RobotToken .KEYWORD )),
299
299
[cast (Token , t ) for t in kw_node .get_tokens (RobotToken .ARGUMENT )],
300
300
namespace ,
301
301
position ,
302
302
)
303
303
304
- if keyword is not None and keyword [0 ] is not None :
305
- source = keyword [0 ].source
306
- if source is not None :
307
- return [
308
- * (
309
- [Location (uri = str (Uri .from_path (source )), range = keyword [0 ].range )]
310
- if context .include_declaration
311
- else []
312
- ),
313
- * await self .find_keyword_references (document , keyword [0 ]),
314
- ]
304
+ if result is not None :
305
+ keyword_doc , keyword_token = result
306
+
307
+ lib_entry , kw_namespace = await self .get_namespace_info_from_keyword (namespace , keyword_token )
308
+
309
+ kw_range = range_from_token (keyword_token )
310
+
311
+ if lib_entry and kw_namespace :
312
+ r = range_from_token (keyword_token )
313
+ r .end .character = r .start .character + len (kw_namespace )
314
+ kw_range .start .character = r .end .character + 1
315
+ if position in r :
316
+ # TODO: find references for Library Namespace
317
+ return None
318
+
319
+ if keyword_doc is not None :
320
+ source = keyword_doc .source
321
+ if source is not None :
322
+ return [
323
+ * (
324
+ [Location (uri = str (Uri .from_path (source )), range = kw_range )]
325
+ if context .include_declaration
326
+ else []
327
+ ),
328
+ * await self .find_keyword_references (document , keyword_doc ),
329
+ ]
315
330
316
331
return None
317
332
@@ -326,25 +341,39 @@ async def references_Fixture( # noqa: N802
326
341
return None
327
342
328
343
fixture_node = cast (Fixture , node )
329
- keyword = await self .get_keyworddoc_and_token_from_position (
344
+ result = await self .get_keyworddoc_and_token_from_position (
330
345
fixture_node .name ,
331
346
cast (Token , fixture_node .get_token (RobotToken .NAME )),
332
347
[cast (Token , t ) for t in fixture_node .get_tokens (RobotToken .ARGUMENT )],
333
348
namespace ,
334
349
position ,
335
350
)
336
351
337
- if keyword is not None and keyword [0 ] is not None :
338
- source = keyword [0 ].source
339
- if source is not None :
340
- return [
341
- * (
342
- [Location (uri = str (Uri .from_path (source )), range = keyword [0 ].range )]
343
- if context .include_declaration
344
- else []
345
- ),
346
- * await self .find_keyword_references (document , keyword [0 ]),
347
- ]
352
+ if result is not None :
353
+ keyword_doc , keyword_token = result
354
+ lib_entry , kw_namespace = await self .get_namespace_info_from_keyword (namespace , keyword_token )
355
+
356
+ kw_range = range_from_token (keyword_token )
357
+
358
+ if lib_entry and kw_namespace :
359
+ r = range_from_token (keyword_token )
360
+ r .end .character = r .start .character + len (kw_namespace )
361
+ kw_range .start .character = r .end .character + 1
362
+ if position in r :
363
+ # TODO: find references for Library Namespace
364
+ return None
365
+
366
+ if keyword_doc is not None and not keyword_doc .is_error_handler :
367
+ source = keyword_doc .source
368
+ if source is not None :
369
+ return [
370
+ * (
371
+ [Location (uri = str (Uri .from_path (source )), range = kw_range )]
372
+ if context .include_declaration
373
+ else []
374
+ ),
375
+ * await self .find_keyword_references (document , keyword_doc ),
376
+ ]
348
377
349
378
return None
350
379
@@ -357,30 +386,44 @@ async def _references_Template_or_TestTemplate( # noqa: N802
357
386
node = cast (Union [Template , TestTemplate ], node )
358
387
if node .value :
359
388
360
- name_token = cast (RobotToken , node .get_token (RobotToken .NAME , RobotToken .ARGUMENT ))
361
- if name_token is None :
389
+ keyword_token = cast (RobotToken , node .get_token (RobotToken .NAME , RobotToken .ARGUMENT ))
390
+ if keyword_token is None :
362
391
return None
363
392
364
- if position .is_in_range (range_from_token (name_token )):
393
+ if position .is_in_range (range_from_token (keyword_token )):
365
394
namespace = await self .parent .documents_cache .get_namespace (document )
366
395
if namespace is None :
367
396
return None
368
397
369
- keyword = await namespace .find_keyword (node .value )
370
- if keyword is not None and keyword .source is not None :
371
- return [
372
- * (
373
- [
374
- Location (
375
- uri = str (Uri .from_path (keyword .source )),
376
- range = keyword .range ,
377
- )
378
- ]
379
- if context .include_declaration
380
- else []
381
- ),
382
- * await self .find_keyword_references (document , keyword ),
383
- ]
398
+ keyword_doc = await namespace .find_keyword (node .value )
399
+
400
+ if keyword_doc is not None :
401
+
402
+ lib_entry , kw_namespace = await self .get_namespace_info_from_keyword (namespace , keyword_token )
403
+
404
+ kw_range = range_from_token (keyword_token )
405
+
406
+ if lib_entry and kw_namespace :
407
+ r = range_from_token (keyword_token )
408
+ r .end .character = r .start .character + len (kw_namespace )
409
+ kw_range .start .character = r .end .character + 1
410
+ if position in r :
411
+ # TODO: find references for Library Namespace
412
+ return None
413
+ if keyword_doc and keyword_doc .source :
414
+ return [
415
+ * (
416
+ [
417
+ Location (
418
+ uri = str (Uri .from_path (keyword_doc .source )),
419
+ range = kw_range ,
420
+ )
421
+ ]
422
+ if context .include_declaration
423
+ else []
424
+ ),
425
+ * await self .find_keyword_references (document , keyword_doc ),
426
+ ]
384
427
385
428
return None
386
429
@@ -471,15 +514,23 @@ async def get_keyword_references_from_tokens(
471
514
kw_matcher = KeywordMatcher (kw_doc .name )
472
515
kw_name = unescape (kw_token .value ) if unescape_kw_token else kw_token .value
473
516
517
+ libraries_matchers = await namespace .get_libraries_matchers ()
518
+ resources_matchers = await namespace .get_resources_matchers ()
519
+
474
520
for lib , name in iter_over_keyword_names_and_owners (kw_name ):
475
521
if lib is not None :
476
522
lib_matcher = KeywordMatcher (lib )
477
- if (
478
- lib_matcher not in (await namespace .get_libraries_matchers ()).keys ()
479
- and lib_matcher not in (await namespace .get_resources_matchers ()).keys ()
480
- ):
523
+ if lib_matcher not in libraries_matchers and lib_matcher not in resources_matchers :
481
524
continue
482
525
526
+ lib_entry , kw_namespace = await self .get_namespace_info_from_keyword (namespace , kw_token )
527
+ kw_range = range_from_token (kw_token )
528
+
529
+ if lib_entry and kw_namespace :
530
+ r = range_from_token (kw_token )
531
+ r .end .character = r .start .character + len (kw_namespace )
532
+ kw_range .start .character = r .end .character + 1
533
+
483
534
if name is not None :
484
535
name_matcher = KeywordMatcher (name )
485
536
if kw_matcher == name_matcher :
@@ -488,7 +539,7 @@ async def get_keyword_references_from_tokens(
488
539
if kw is not None and kw == kw_doc :
489
540
yield Location (
490
541
str (Uri .from_path (namespace .source ).normalized ()),
491
- range = range_from_token_or_node ( node , kw_token ) ,
542
+ range = kw_range ,
492
543
)
493
544
494
545
if name_matcher in ALL_RUN_KEYWORDS_MATCHERS and arguments :
0 commit comments