From 778b317a302a9a28fd09df788c2090023286b45c Mon Sep 17 00:00:00 2001 From: Thakee Nathees Date: Sat, 1 Feb 2025 16:07:48 +0530 Subject: [PATCH] [Subnode-Remove-2] Removed from SetVal --- jac/jaclang/compiler/absyntree.py | 17 +++++----- jac/jaclang/compiler/parser.py | 8 ++--- .../compiler/passes/main/pyast_gen_pass.py | 2 +- .../compiler/passes/main/pyast_load_pass.py | 32 +++++++++---------- .../passes/tool/jac_formatter_pass.py | 20 ++++++++---- 5 files changed, 43 insertions(+), 36 deletions(-) diff --git a/jac/jaclang/compiler/absyntree.py b/jac/jaclang/compiler/absyntree.py index 85d91fa97..9b58fb04d 100644 --- a/jac/jaclang/compiler/absyntree.py +++ b/jac/jaclang/compiler/absyntree.py @@ -2972,7 +2972,7 @@ class SetVal(AtomExpr): def __init__( self, - values: Optional[SubNodeList[Expr]], + values: list[Expr], kid: Sequence[AstNode], ) -> None: """Initialize value node.""" @@ -2984,13 +2984,14 @@ def __init__( def normalize(self, deep: bool = False) -> bool: """Normalize ast node.""" res = True - if deep: - res = self.values.normalize(deep) if self.values else res - new_kid: list[AstNode] = [ - self.gen_token(Tok.LBRACE), - ] - if self.values: - new_kid.append(self.values) + for expr in self.values: + res = expr.normalize(deep) and res + new_kid: list[AstNode] = [] + new_kid.append(self.gen_token(Tok.LBRACE)) + for idx, expr in enumerate(self.values): + if idx != 0: + new_kid.append(self.gen_token(Tok.COMMA)) + new_kid.append(expr) new_kid.append(self.gen_token(Tok.RBRACE)) self.set_kids(nodes=new_kid) return res diff --git a/jac/jaclang/compiler/parser.py b/jac/jaclang/compiler/parser.py index cb9444416..23367fec3 100644 --- a/jac/jaclang/compiler/parser.py +++ b/jac/jaclang/compiler/parser.py @@ -5,7 +5,7 @@ import keyword import logging import os -from typing import Callable, TypeAlias +from typing import Callable, TypeAlias, cast import jaclang.compiler.absyntree as ast @@ -2714,15 +2714,15 @@ def set_val(self, kid: list[ast.AstNode]) -> ast.SetVal: if len(kid) == 2: return self.nu( ast.SetVal( - values=None, + values=[], kid=kid, ) ) elif isinstance(kid[1], ast.SubNodeList): return self.nu( ast.SetVal( - values=kid[1], - kid=kid, + values=cast(list[ast.Expr], kid[1].items), + kid=[kid[0], *kid[1].kid, kid[2]], ) ) else: diff --git a/jac/jaclang/compiler/passes/main/pyast_gen_pass.py b/jac/jaclang/compiler/passes/main/pyast_gen_pass.py index ed44faf18..43cc25167 100644 --- a/jac/jaclang/compiler/passes/main/pyast_gen_pass.py +++ b/jac/jaclang/compiler/passes/main/pyast_gen_pass.py @@ -2744,7 +2744,7 @@ def exit_set_val(self, node: ast.SetVal) -> None: node.gen.py_ast = [ self.sync( ast3.Set( - elts=node.values.gen.py_ast if node.values else [], + elts=[expr.gen.py_ast[0] for expr in node.values], ctx=node.py_ctx_func(), ) ) diff --git a/jac/jaclang/compiler/passes/main/pyast_load_pass.py b/jac/jaclang/compiler/passes/main/pyast_load_pass.py index cf6fe28d9..586062e4e 100644 --- a/jac/jaclang/compiler/passes/main/pyast_load_pass.py +++ b/jac/jaclang/compiler/passes/main/pyast_load_pass.py @@ -4,7 +4,7 @@ import ast as py_ast import os -from typing import Optional, Sequence, TypeAlias, TypeVar +from typing import Optional, Sequence, TypeAlias, TypeVar, cast # from icecream import ic @@ -1972,21 +1972,21 @@ def proc_set(self, node: py_ast.Set) -> ast.SetVal: class Set(expr): elts: list[expr] """ - if len(node.elts) != 0: - elts = [self.convert(i) for i in node.elts] - valid = [i for i in elts if isinstance(i, (ast.Expr))] - if len(valid) != len(elts): - raise self.ice("Length mismatch in set body") - valid_elts = ast.SubNodeList[ast.Expr]( - items=valid, delim=Tok.COMMA, kid=valid - ) - kid: list[ast.AstNode] = [*valid] - else: - valid_elts = None - l_brace = self.operator(Tok.LBRACE, "{") - r_brace = self.operator(Tok.RBRACE, "}") - kid = [l_brace, r_brace] - return ast.SetVal(values=valid_elts, kid=kid) + elts = [self.convert(elt) for elt in node.elts] + if not all(isinstance(elt, ast.Expr) for elt in elts): + raise self.ice("Length mismatch in set elements") + # self.operator() should be called self.token() imo. + kid: list[ast.AstNode] = [] + kid.append(self.operator(Tok.LBRACE, "{")) + for idx, expr in enumerate(elts): + if idx != 0: + kid.append(self.operator(Tok.COMMA, ",")) + kid.append(expr) + kid.append(self.operator(Tok.RBRACE, "}")) + return ast.SetVal( + values=cast(list[ast.Expr], elts), + kid=kid, + ) def proc_set_comp(self, node: py_ast.SetComp) -> ast.ListCompr: """Process python node. diff --git a/jac/jaclang/compiler/passes/tool/jac_formatter_pass.py b/jac/jaclang/compiler/passes/tool/jac_formatter_pass.py index 311d7e77f..26a144731 100644 --- a/jac/jaclang/compiler/passes/tool/jac_formatter_pass.py +++ b/jac/jaclang/compiler/passes/tool/jac_formatter_pass.py @@ -233,7 +233,7 @@ def exit_sub_node_list(self, node: ast.SubNodeList) -> None: if ( prev_token and prev_token.gen.jac.endswith("}") - and not isinstance(prev_token, (ast.DictVal, ast.SetVal)) + and not isinstance(prev_token, ast.DictVal) ): self.indent_level -= 1 self.emit_ln(node, "") @@ -1674,16 +1674,22 @@ def exit_list_val(self, node: ast.ListVal) -> None: else: self.emit(node, i.gen.jac) - def exit_set_val(self, node: ast.ListVal) -> None: + def exit_set_val(self, node: ast.SetVal) -> None: """Sub objects. values: list[ExprType], """ - if node.values is not None: - self.emit( - node, - f"{{{node.values.gen.jac}}}", - ) + values_codgen = ", ".join([expr.gen.jac for expr in node.values]) + if self.is_line_break_needed(values_codgen, 88): + self.emit(node, "{") + self.emit_ln(node, "") + self.indent_level += 1 + for expr in node.values: + self.emit(node, f"{expr.gen.jac},\n") + self.indent_level -= 1 + self.emit(node, "}") + else: + self.emit(node, f"{{{values_codgen}}}") def exit_dict_val(self, node: ast.DictVal) -> None: """Sub objects.