Skip to content

Commit 70ee9d0

Browse files
committed
fixes for multi part bdd prefixes
1 parent b0c7454 commit 70ee9d0

File tree

3 files changed

+76
-66
lines changed

3 files changed

+76
-66
lines changed

robotcode/language_server/robotframework/diagnostics/namespace.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,9 @@ class CancelSearchError(Exception):
16191619
pass
16201620

16211621

1622+
DEFAULT_BDD_PREFIXES = {"Given ", "When ", "Then ", "And ", "But "}
1623+
1624+
16221625
class KeywordFinder:
16231626
def __init__(self, namespace: Namespace) -> None:
16241627
super().__init__()
@@ -1860,14 +1863,15 @@ async def _get_bdd_style_keyword(self, name: str) -> Optional[KeywordDoc]:
18601863
return None
18611864

18621865
else:
1863-
parts = name.split(maxsplit=1)
1866+
parts = name.split()
18641867
if len(parts) < 2:
18651868
return None
1866-
prefix, keyword = parts
1867-
if prefix.title() in (
1868-
self.namespace.languages.bdd_prefixes
1869-
if self.namespace.languages is not None
1870-
else {"Given ", "When ", "Then ", "And ", "But "}
1871-
):
1872-
return await self._find_keyword(keyword)
1869+
for index in range(1, len(parts)):
1870+
prefix = " ".join(parts[:index]).title()
1871+
if prefix.title() in (
1872+
self.namespace.languages.bdd_prefixes
1873+
if self.namespace.languages is not None
1874+
else DEFAULT_BDD_PREFIXES
1875+
):
1876+
return await self._find_keyword(" ".join(parts[index:]))
18731877
return None

robotcode/language_server/robotframework/parts/model_helper.py

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ...common.lsp_types import Position
2121
from ..diagnostics.entities import VariableDefinition, VariableNotFoundDefinition
2222
from ..diagnostics.library_doc import KeywordDoc
23-
from ..diagnostics.namespace import LibraryEntry, Namespace
23+
from ..diagnostics.namespace import DEFAULT_BDD_PREFIXES, LibraryEntry, Namespace
2424
from ..utils.ast_utils import (
2525
Token,
2626
is_not_variable_token,
@@ -498,32 +498,32 @@ def split_bdd_prefix(cls, namespace: Namespace, token: Token) -> Tuple[Optional[
498498

499499
bdd_token = None
500500

501-
parts = token.value.split(maxsplit=1)
502-
if len(parts) < 1:
501+
parts = token.value.split()
502+
if len(parts) < 2:
503503
return None, token
504504

505-
prefix = parts[0]
506-
if prefix.title() in (
507-
namespace.languages.bdd_prefixes
508-
if namespace.languages is not None
509-
else {"Given ", "When ", "Then ", "And ", "But "}
510-
):
511-
bdd_len = len(prefix)
512-
bdd_token = RobotToken(
513-
token.type,
514-
token.value[:bdd_len],
515-
token.lineno,
516-
token.col_offset,
517-
token.error,
518-
)
505+
for index in range(1, len(parts)):
506+
prefix = " ".join(parts[:index]).title()
507+
if prefix in (
508+
namespace.languages.bdd_prefixes if namespace.languages is not None else DEFAULT_BDD_PREFIXES
509+
):
510+
bdd_len = len(prefix)
511+
bdd_token = RobotToken(
512+
token.type,
513+
token.value[:bdd_len],
514+
token.lineno,
515+
token.col_offset,
516+
token.error,
517+
)
519518

520-
token = RobotToken(
521-
token.type,
522-
token.value[bdd_len + 1 :],
523-
token.lineno,
524-
token.col_offset + bdd_len + 1,
525-
token.error,
526-
)
519+
token = RobotToken(
520+
token.type,
521+
token.value[bdd_len + 1 :],
522+
token.lineno,
523+
token.col_offset + bdd_len + 1,
524+
token.error,
525+
)
526+
break
527527

528528
return bdd_token, token
529529

@@ -545,24 +545,24 @@ def strip_bdd_prefix(cls, namespace: Namespace, token: Token) -> Token:
545545
)
546546
return token
547547
else:
548-
parts = token.value.split(maxsplit=1)
548+
parts = token.value.split()
549549
if len(parts) < 2:
550550
return token
551551

552-
prefix = parts[0]
553-
if prefix.title() in (
554-
namespace.languages.bdd_prefixes
555-
if namespace.languages is not None
556-
else {"Given ", "When ", "Then ", "And ", "But "}
557-
):
558-
bdd_len = len(prefix)
559-
token = RobotToken(
560-
token.type,
561-
token.value[bdd_len + 1 :],
562-
token.lineno,
563-
token.col_offset + bdd_len + 1,
564-
token.error,
565-
)
552+
for index in range(1, len(parts)):
553+
prefix = " ".join(parts[:index]).title()
554+
if prefix in (
555+
namespace.languages.bdd_prefixes if namespace.languages is not None else DEFAULT_BDD_PREFIXES
556+
):
557+
bdd_len = len(prefix)
558+
token = RobotToken(
559+
token.type,
560+
token.value[bdd_len + 1 :],
561+
token.lineno,
562+
token.col_offset + bdd_len + 1,
563+
token.error,
564+
)
565+
break
566566

567567
return token
568568

@@ -572,18 +572,17 @@ def is_bdd_token(cls, namespace: Namespace, token: Token) -> bool:
572572
bdd_match = cls.BDD_TOKEN.match(token.value)
573573
return bool(bdd_match)
574574
else:
575-
parts = token.value.split(maxsplit=1)
576-
if len(parts) < 1:
575+
parts = token.value.split()
576+
if len(parts) < 2:
577577
return False
578578

579-
prefix = parts[0]
579+
for index in range(1, len(parts)):
580+
prefix = " ".join(parts[:index]).title()
580581

581-
if prefix.title() in (
582-
namespace.languages.bdd_prefixes
583-
if namespace.languages is not None
584-
else {"Given ", "When ", "Then ", "And ", "But "}
585-
):
586-
return True
582+
if prefix.title() in (
583+
namespace.languages.bdd_prefixes if namespace.languages is not None else DEFAULT_BDD_PREFIXES
584+
):
585+
return True
587586

588587
return False
589588

robotcode/language_server/robotframework/parts/semantic_tokens.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@
4141
KeywordMatcher,
4242
LibraryDoc,
4343
)
44-
from ..diagnostics.namespace import LibraryEntry, Namespace, ResourceEntry
44+
from ..diagnostics.namespace import (
45+
DEFAULT_BDD_PREFIXES,
46+
LibraryEntry,
47+
Namespace,
48+
ResourceEntry,
49+
)
4550
from ..utils import async_ast
4651
from ..utils.ast_utils import (
4752
HasTokens,
@@ -336,15 +341,17 @@ async def generate_sem_sub_tokens(
336341
if bdd_match:
337342
bdd_len = len(bdd_match.group(1))
338343
else:
339-
parts = token.value.split(maxsplit=1)
340-
if len(parts) == 2:
341-
prefix, _ = parts
342-
if prefix.title() in (
343-
namespace.languages.bdd_prefixes
344-
if namespace.languages is not None
345-
else {"Given ", "When ", "Then ", "And ", "But "}
346-
):
347-
bdd_len = len(prefix)
344+
parts = token.value.split()
345+
if len(parts) > 1:
346+
for index in range(1, len(parts)):
347+
prefix = " ".join(parts[:index]).title()
348+
if prefix.title() in (
349+
namespace.languages.bdd_prefixes
350+
if namespace.languages is not None
351+
else DEFAULT_BDD_PREFIXES
352+
):
353+
bdd_len = len(prefix)
354+
break
348355

349356
if bdd_len > 0:
350357
yield SemTokenInfo.from_token(

0 commit comments

Comments
 (0)