From 9dbc5db30fd121750a33e248fff1bba30524f42d Mon Sep 17 00:00:00 2001 From: tserg <8017125+tserg@users.noreply.github.com> Date: Fri, 29 Dec 2023 12:21:55 +0800 Subject: [PATCH] refactor is_literal_value --- vyper/ast/nodes.py | 30 +++++++++++++++--------------- vyper/semantics/analysis/utils.py | 5 +---- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/vyper/ast/nodes.py b/vyper/ast/nodes.py index 12341aa076..5712cb8f2b 100644 --- a/vyper/ast/nodes.py +++ b/vyper/ast/nodes.py @@ -378,9 +378,9 @@ def description(self): @property def is_literal_value(self): """ - Property method to check if the node is a literal value. + Check if the node is a literal value. """ - return check_literal(self) + return False @property def has_folded_value(self): @@ -397,7 +397,7 @@ def get_folded_value(self) -> "VyperNode": Raises UnfoldableNode if not. """ - if check_literal(self): + if self.is_literal_value: return self if "folded_value" not in self._metadata: @@ -786,6 +786,10 @@ class Constant(ExprNode): def __init__(self, parent: Optional["VyperNode"] = None, **kwargs: dict): super().__init__(parent, **kwargs) + @property + def is_literal_value(self): + return True + class Num(Constant): # inherited class for all numeric constant node types @@ -918,23 +922,15 @@ def s(self): return self.value -def check_literal(node: VyperNode) -> bool: - """ - Check if the given node is a literal value. - """ - if isinstance(node, Constant): - return True - elif isinstance(node, (Tuple, List)): - return all(check_literal(item) for item in node.elements) - - return False - - class List(ExprNode): __slots__ = ("elements",) _is_prefoldable = True _translated_fields = {"elts": "elements"} + @property + def is_literal_value(self): + return all(e.is_literal_value for e in self.elements) + def fold(self) -> Optional[ExprNode]: elements = [e.get_folded_value() for e in self.elements] return type(self).from_node(self, elements=elements) @@ -945,6 +941,10 @@ class Tuple(ExprNode): _is_prefoldable = True _translated_fields = {"elts": "elements"} + @property + def is_literal_value(self): + return all(e.is_literal_value for e in self.elements) + def validate(self): if not self.elements: raise InvalidLiteral("Cannot have an empty tuple", self) diff --git a/vyper/semantics/analysis/utils.py b/vyper/semantics/analysis/utils.py index f20e6fa903..8ff2bf63bc 100644 --- a/vyper/semantics/analysis/utils.py +++ b/vyper/semantics/analysis/utils.py @@ -627,10 +627,7 @@ def check_modifiability(node: vy_ast.VyperNode, modifiability: Modifiability) -> """ Check if the given node is not more modifiable than the given modifiability. """ - if node.is_literal_value: - return True - - if node.has_folded_value: + if node.is_literal_value or node.has_folded_value: return True if isinstance(node, (vy_ast.BinOp, vy_ast.Compare)):