aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mparser.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/mparser.py')
-rw-r--r--mesonbuild/mparser.py34
1 files changed, 11 insertions, 23 deletions
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index c1bceb2..0e26b9e 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: