diff --git a/src/pash/compiler/ir.py b/src/pash/compiler/ir.py index 29e31dd41..4b0f15e29 100644 --- a/src/pash/compiler/ir.py +++ b/src/pash/compiler/ir.py @@ -22,8 +22,6 @@ CommandInvocationWithIOVars, ) -from shasta.ast_node import ast_node_to_untyped_deep -from shasta.json_to_ast import to_ast_node from annotations_utils.util_parsing import parse_arg_list_to_command_invocation from annotations_utils.util_cmd_invocations import ( @@ -543,9 +541,7 @@ def to_ast(self, drain_streams) -> "list[AstNode]": assignment = self.collect_pid_assignment() asts.append(assignment) - ## TODO: Ideally we would like to make them as typed nodes already - class_asts = [to_ast_node(ast_node_to_untyped_deep(ast)) for ast in asts] - return class_asts + return asts def collect_pid_assignment(self): ## Creates: diff --git a/src/pash/compiler/ir_defs/file_id.py b/src/pash/compiler/ir_defs/file_id.py index 9966e6771..20a7424b1 100644 --- a/src/pash/compiler/ir_defs/file_id.py +++ b/src/pash/compiler/ir_defs/file_id.py @@ -2,7 +2,11 @@ import os import uuid -from util import string_to_argument, make_kv +from util import string_to_argument +from shasta.ast_node import QArgChar + + + from ir_defs.resource import ( Resource, FileDescriptorResource, @@ -89,7 +93,8 @@ def to_ast(self, stdin_dash=False): suffix = self.get_fifo_suffix() string = os.path.join(config.PASH_TMP_PREFIX, suffix) ## Quote the argument - argument = [make_kv("Q", string_to_argument(string))] + argument = [QArgChar(arg=string_to_argument(string))] + elif isinstance(self.resource, FileDescriptorResource): if self.resource.is_stdin() and stdin_dash: argument = string_to_argument("-") diff --git a/src/pash/compiler/ir_defs/redirection.py b/src/pash/compiler/ir_defs/redirection.py index f3c6f7717..6e8822f3f 100644 --- a/src/pash/compiler/ir_defs/redirection.py +++ b/src/pash/compiler/ir_defs/redirection.py @@ -1,6 +1,6 @@ from shasta.ast_node import RedirectionNode, FileRedirNode from ir_defs.arg import Arg -from util import make_kv, UnparallelizableError +from util import UnparallelizableError class Redirection: def __init__(self, redirection: RedirectionNode): @@ -24,10 +24,7 @@ def __repr__(self): ) def to_ast(self): - redir = make_kv( - self.redir_type, - [self.redir_subtype, self.stream_id, self.file_arg.to_ast()], - ) + redir = FileRedirNode(self.redir_subtype, self.stream_id, self.file_arg.to_ast()) return redir def is_to_file(self): diff --git a/src/pash/compiler/ir_to_ast.py b/src/pash/compiler/ir_to_ast.py index e36143ebc..d92507ad8 100644 --- a/src/pash/compiler/ir_to_ast.py +++ b/src/pash/compiler/ir_to_ast.py @@ -12,7 +12,7 @@ make_subshell, redir_append_stderr_to_string_file, ) -from shasta.json_to_ast import to_ast_node + from parse import from_ast_objects_to_shell import config @@ -111,8 +111,7 @@ def make_ir_prologue(ephemeral_fids) -> "list[AstNode]": call_mkfifos = make_command([string_to_argument(MKFIFO_PASH_FIFOS_NAME)]) asts.append(call_mkfifos) - class_asts = [to_ast_node(ast) for ast in asts] - return class_asts + return asts def make_ir_epilogue(ephemeral_fids, clean_up_graph, log_file) -> "list[AstNode]": @@ -148,8 +147,7 @@ def make_ir_epilogue(ephemeral_fids, clean_up_graph, log_file) -> "list[AstNode] exit_ec_ast = make_exit_ec_ast() asts.append(exit_ec_ast) - class_asts = [to_ast_node(ast) for ast in asts] - return class_asts + return asts def make_exit_ec_ast(): diff --git a/src/pash/compiler/util.py b/src/pash/compiler/util.py index 38190a139..e9f57b803 100644 --- a/src/pash/compiler/util.py +++ b/src/pash/compiler/util.py @@ -11,7 +11,18 @@ import tempfile import config -from shasta.ast_node import CArgChar +from shasta.ast_node import ( + CArgChar, + VArgChar, + QArgChar, + CommandNode, + BackgroundNode, + SubshellNode, + SemiNode, + DefunNode, + AssignNode, + FileRedirNode, + ) # === List utilities === @@ -135,44 +146,42 @@ def string_to_argument(string): def char_to_arg_char(char): - return ["C", ord(char)] + return CArgChar(ord(char)) def standard_var_ast(string): - return make_kv("V", ["Normal", False, string, []]) + return VArgChar("Normal", False, string, []) def make_quoted_variable(string): - return make_kv("Q", [standard_var_ast(string)]) + return QArgChar(arg=[standard_var_ast(string)]) def quote_arg(arg): - return make_kv("Q", arg) + return QArgChar(arg=arg) def redir_append_stderr_to_string_file(string): - return make_kv("File", ["Append", 2, string_to_argument(string)]) - + return FileRedirNode("Append", ("fixed", 2), string_to_argument(string)) def redir_stdout_to_file(arg): - return make_kv("File", ["To", 1, arg]) + return FileRedirNode("To", ("fixed", 1), arg) def redir_file_to_stdin(arg): - return make_kv("File", ["From", 0, arg]) - + return FileRedirNode("From", ("fixed", 0), arg) def make_background(body, redirections=None): redirections = [] if redirections is None else redirections lineno = 0 - node = make_kv("Background", [lineno, body, redirections]) + node = BackgroundNode(lineno, body, redirections) return node def make_subshell(body, redirections=None): redirections = [] if redirections is None else redirections lineno = 0 - node = make_kv("Subshell", [lineno, body, redirections]) + node = SubshellNode(lineno, body, redirections) return node @@ -180,16 +189,15 @@ def make_command(arguments, redirections=None, assignments=None): redirections = [] if redirections is None else redirections assignments = [] if assignments is None else assignments lineno = 0 - node = make_kv("Command", [lineno, assignments, arguments, redirections]) + node = CommandNode(lineno, assignments, arguments, redirections) return node def make_assignment(var, value): lineno = 0 - assignment = (var, value) - assignments = [assignment] - node = make_kv("Command", [lineno, assignments, [], []]) - return node + assignment = AssignNode(var, value) + return CommandNode(lineno, [assignment],[],[]) + def make_semi_sequence(asts): @@ -203,11 +211,11 @@ def make_semi_sequence(asts): # Remove the last ast iter_asts = asts[:-1] for ast in iter_asts[::-1]: - acc = make_kv("Semi", [ast, acc]) + acc = SemiNode(ast, acc) return acc def make_defun(name, body): lineno = 0 - node = make_kv("Defun", [lineno, name, body]) + node = DefunNode(lineno, string_to_argument(name), body ) return node