@@ -466,6 +466,24 @@ async def create_testcase_settings_completion_items(self, range: Optional[Range]
466466 for setting in settings
467467 ]
468468
469+ async def create_bdd_prefix_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
470+ prefixes = {"Given" , "When" , "Then" , "And" , "But" }
471+
472+ if self .namespace .languages is not None :
473+ prefixes .update (self .namespace .languages .bdd_prefixes )
474+
475+ return [
476+ CompletionItem (
477+ label = prefix ,
478+ kind = CompletionItemKind .UNIT ,
479+ detail = "BDD Prefix" ,
480+ sort_text = f"080_{ prefix } " ,
481+ insert_text_format = InsertTextFormat .PLAINTEXT ,
482+ text_edit = TextEdit (range = range , new_text = f"{ prefix } " ) if range is not None else None ,
483+ )
484+ for prefix in prefixes
485+ ]
486+
469487 async def create_keyword_settings_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
470488 from robot .parsing .lexer .settings import KeywordSettings
471489
@@ -521,13 +539,30 @@ async def create_keyword_completion_items(
521539 add_reserverd : bool = True ,
522540 add_none : bool = False ,
523541 in_template : bool = False ,
542+ add_bdd_prefixes : bool = True ,
524543 ) -> List [CompletionItem ]:
525544 result : List [CompletionItem ] = []
526545 if self .document is None :
527546 return []
528547
529548 r : Optional [Range ] = None
530549
550+ has_bdd = False
551+ bdd_token = None
552+
553+ if token is not None :
554+ old_token = token
555+ bdd_token , token = self .split_bdd_prefix (self .namespace , token )
556+
557+ if token is not None and token .value == "" :
558+ token = None
559+
560+ if bdd_token is not None and position .character > range_from_token (bdd_token ).end .character :
561+ has_bdd = True
562+
563+ if not has_bdd and token is None :
564+ token = old_token
565+
531566 if token is not None :
532567 r = range_from_token (token )
533568
@@ -708,6 +743,11 @@ def enumerate_indexes(s: str, c: str) -> Iterator[int]:
708743 )
709744 )
710745
746+ if add_bdd_prefixes and not has_bdd :
747+ result += await self .create_bdd_prefix_completion_items (
748+ range_from_token (token ) if token is not None else None
749+ )
750+
711751 if add_reserverd :
712752 for k in get_reserved_keywords ():
713753 result .append (
@@ -934,8 +974,6 @@ async def _complete_TestCase_or_Keyword( # noqa: N802
934974 if len (statement_node .tokens ) > index :
935975 token = statement_node .tokens [index ]
936976
937- token = self .strip_bdd_prefix (self .namespace , token )
938-
939977 r = range_from_token (token )
940978 if position .is_in_range (r ):
941979 return await create_items (in_assign , in_template , r , token , position )
@@ -952,7 +990,7 @@ async def _complete_TestCase_or_Keyword( # noqa: N802
952990 in_assign ,
953991 in_template ,
954992 r ,
955- None if self . is_bdd_token ( self . namespace , token ) else token ,
993+ token ,
956994 position ,
957995 )
958996
@@ -1080,7 +1118,7 @@ async def _complete_SuiteSetup_or_SuiteTeardown_or_TestTemplate( # noqa: N802
10801118 r = range_from_token (token )
10811119 if position .is_in_range (r ):
10821120 return await self .create_keyword_completion_items (
1083- None if self . is_bdd_token ( self . namespace , token ) else token ,
1121+ token ,
10841122 position ,
10851123 add_reserverd = False ,
10861124 add_none = True ,
@@ -1096,7 +1134,7 @@ async def _complete_SuiteSetup_or_SuiteTeardown_or_TestTemplate( # noqa: N802
10961134 r .end .character += 1
10971135 if position .is_in_range (r ):
10981136 return await self .create_keyword_completion_items (
1099- None if self . is_bdd_token ( self . namespace , token ) else token ,
1137+ token ,
11001138 position ,
11011139 add_reserverd = False ,
11021140 add_none = True ,
@@ -1223,7 +1261,7 @@ async def complete_Setup_or_Teardown_or_Template( # noqa: N802
12231261 r .end .character += 1
12241262 if position .is_in_range (r ):
12251263 return await self .create_keyword_completion_items (
1226- None if self . is_bdd_token ( self . namespace , token ) else token ,
1264+ token ,
12271265 position ,
12281266 add_reserverd = False ,
12291267 add_none = True ,
0 commit comments