diff options
| author | Charles Brunet <charles.brunet@optelgroup.com> | 2023-09-28 09:08:18 -0400 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2024-04-08 10:43:57 -0700 |
| commit | bd4fd9073081bcc9f4505b9604c5cb1e8cdc300f (patch) | |
| tree | c1857d01bcd8164e1ffd5473de592fef9bd9df1c /mesonbuild/mparser.py | |
| parent | 728fcdaab312020fe3ebea40e942f23ee620ed6c (diff) | |
| download | meson-bd4fd9073081bcc9f4505b9604c5cb1e8cdc300f.tar.gz | |
parser: revert to single StringNode type
this will allow transforming string types in the formater
Diffstat (limited to 'mesonbuild/mparser.py')
| -rw-r--r-- | mesonbuild/mparser.py | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py index c1bceb294..0e26b9ed9 100644 --- a/mesonbuild/mparser.py +++ b/mesonbuild/mparser.py @@ -298,31 +298,25 @@ class NumberNode(ElementaryNode[int]): self.value = int(token.value, base=0) self.bytespan = token.bytespan -class BaseStringNode(ElementaryNode[str]): - pass - @dataclass(unsafe_hash=True) -class StringNode(BaseStringNode): +class StringNode(ElementaryNode[str]): raw_value: str = field(hash=False) + is_multiline: bool + is_fstring: bool def __init__(self, token: Token[str], escape: bool = True): super().__init__(token) - self.value = ESCAPE_SEQUENCE_SINGLE_RE.sub(decode_match, token.value) if escape else token.value - self.raw_value = token.value -class FormatStringNode(StringNode): - pass - -@dataclass(unsafe_hash=True) -class MultilineStringNode(BaseStringNode): + self.is_multiline = 'multiline' in token.tid + self.is_fstring = 'fstring' in token.tid + self.raw_value = token.value - def __init__(self, token: Token[str]): - super().__init__(token) - self.value = token.value + if escape and not self.is_multiline: + self.value = self.escape() -class MultilineFormatStringNode(MultilineStringNode): - pass + def escape(self) -> str: + return ESCAPE_SEQUENCE_SINGLE_RE.sub(decode_match, self.raw_value) class ContinueNode(ElementaryNode): pass @@ -930,14 +924,8 @@ class Parser: return self.create_node(IdNode, t) if self.accept('number'): return self.create_node(NumberNode, t) - if self.accept('string'): + if self.accept_any(('string', 'fstring', 'multiline_string', 'multiline_fstring')): return self.create_node(StringNode, t) - if self.accept('fstring'): - return self.create_node(FormatStringNode, t) - if self.accept('multiline_string'): - return self.create_node(MultilineStringNode, t) - if self.accept('multiline_fstring'): - return self.create_node(MultilineFormatStringNode, t) return EmptyNode(self.current.lineno, self.current.colno, self.current.filename) def key_values(self) -> ArgumentNode: |
