Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Subnode-Remove-2] Removed from SetVal #1547

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions jac/jaclang/compiler/absyntree.py
Original file line number Diff line number Diff line change
Expand Up @@ -2972,7 +2972,7 @@ class SetVal(AtomExpr):

def __init__(
self,
values: Optional[SubNodeList[Expr]],
values: list[Expr],
kid: Sequence[AstNode],
) -> None:
"""Initialize value node."""
Expand All @@ -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
Expand Down
8 changes: 4 additions & 4 deletions jac/jaclang/compiler/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion jac/jaclang/compiler/passes/main/pyast_gen_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
)
)
Expand Down
32 changes: 16 additions & 16 deletions jac/jaclang/compiler/passes/main/pyast_load_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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.
Expand Down
20 changes: 13 additions & 7 deletions jac/jaclang/compiler/passes/tool/jac_formatter_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -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, "")
Expand Down Expand Up @@ -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.
Expand Down