Skip to content

Commit

Permalink
refactor is_literal_value
Browse files Browse the repository at this point in the history
  • Loading branch information
tserg committed Dec 29, 2023
1 parent 3cf993b commit 9dbc5db
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 19 deletions.
30 changes: 15 additions & 15 deletions vyper/ast/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
5 changes: 1 addition & 4 deletions vyper/semantics/analysis/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)):
Expand Down

0 comments on commit 9dbc5db

Please sign in to comment.