Skip to content

Commit

Permalink
special var ref removed and merged with name
Browse files Browse the repository at this point in the history
  • Loading branch information
ThakeeNathees committed Jan 30, 2025
1 parent 30c96df commit a0831cf
Show file tree
Hide file tree
Showing 14 changed files with 82 additions and 165 deletions.
60 changes: 10 additions & 50 deletions jac/jaclang/compiler/absyntree.py
Original file line number Diff line number Diff line change
Expand Up @@ -1416,8 +1416,6 @@ def is_genai_ability(self) -> bool:
def py_resolve_name(self) -> str:
"""Resolve name."""
if isinstance(self.name_ref, Name):
return self.name_ref.value
elif isinstance(self.name_ref, (SpecialVarRef, ArchRef)):
return self.name_ref.py_resolve_name()
else:
raise NotImplementedError
Expand Down Expand Up @@ -4146,11 +4144,20 @@ def __init__(
NameAtom.__init__(self)
AstSymbolNode.__init__(
self,
sym_name=value,
sym_name=self.py_resolve_name(),
name_spec=self,
sym_category=SymbolType.VAR,
)

def py_resolve_name(self) -> str:
"""Resolve name."""
return {
"root": Con.ROOT.value,
"here": Con.HERE.value,
"init": "__init__",
"postinit": "__post_init__",
}.get(self.value, self.value)

def unparse(self) -> str:
"""Unparse name."""
super().unparse()
Expand Down Expand Up @@ -4180,53 +4187,6 @@ def gen_stub_from_node(
return ret


class SpecialVarRef(Name):
"""HereRef node type for Jac Ast."""

def __init__(
self,
var: Name,
) -> None:
"""Initialize special var reference expression node."""
self.orig = var
Name.__init__(
self,
orig_src=var.orig_src,
name=var.name,
value=self.py_resolve_name(), # TODO: This shouldnt be necessary
line=var.line_no,
end_line=var.end_line,
col_start=var.c_start,
col_end=var.c_end,
pos_start=var.pos_start,
pos_end=var.pos_end,
)
NameAtom.__init__(self)
AstSymbolNode.__init__(
self,
sym_name=self.py_resolve_name(),
name_spec=self,
sym_category=SymbolType.VAR,
)

def py_resolve_name(self) -> str:
"""Resolve name."""
if self.orig.name == Tok.KW_SELF:
return "self"
elif self.orig.name == Tok.KW_SUPER:
return "super"
elif self.orig.name == Tok.KW_ROOT:
return Con.ROOT.value
elif self.orig.name == Tok.KW_HERE:
return Con.HERE.value
elif self.orig.name == Tok.KW_INIT:
return "__init__"
elif self.orig.name == Tok.KW_POST_INIT:
return "__post_init__"
else:
raise NotImplementedError("ICE: Special var reference not implemented")


class Literal(Token, AtomExpr):
"""Literal node type for Jac Ast."""

Expand Down
16 changes: 7 additions & 9 deletions jac/jaclang/compiler/jac.lark
Original file line number Diff line number Diff line change
Expand Up @@ -459,16 +459,14 @@ typed_filter_compare_list: expression (COLON filter_compare_list)?
filter_compare_item: named_ref cmp_op expression

// [Heading]: Names and references.
named_ref: special_ref
named_ref: NAME
| KWESC_NAME
| NAME

special_ref: KW_INIT
| KW_POST_INIT
| KW_ROOT
| KW_SUPER
| KW_SELF
| KW_HERE
| KW_INIT
| KW_POST_INIT
| KW_ROOT
| KW_SUPER
| KW_SELF
| KW_HERE

// [Heading]: Builtin types.
builtin_type: TYP_TYPE
Expand Down
46 changes: 18 additions & 28 deletions jac/jaclang/compiler/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,27 +593,17 @@ def sub_name(self, kid: list[ast.AstNode]) -> ast.SubTag[ast.Name]:
def named_ref(self, kid: list[ast.AstNode]) -> ast.NameAtom:
"""Grammar rule.
named_ref: special_ref
named_ref: NAME
| KWESC_NAME
| NAME
"""
if isinstance(kid[0], ast.NameAtom):
return self.nu(kid[0])
else:
raise self.ice()

def special_ref(self, kid: list[ast.AstNode]) -> ast.SpecialVarRef:
"""Grammar rule.
special_ref: KW_INIT
| KW_POST_INIT
| KW_ROOT
| KW_SUPER
| KW_SELF
| KW_HERE
| KW_INIT
| KW_POST_INIT
| KW_ROOT
| KW_SUPER
| KW_SELF
| KW_HERE
"""
if isinstance(kid[0], ast.Name):
return self.nu(ast.SpecialVarRef(var=kid[0]))
return self.nu(kid[0])
else:
raise self.ice()

Expand Down Expand Up @@ -3192,7 +3182,7 @@ def enum_ref(self, kid: list[ast.AstNode]) -> ast.ArchRef:
def ability_ref(self, kid: list[ast.AstNode]) -> ast.ArchRef:
"""Grammar rule.
ability_ref: ABILITY_OP (special_ref | name_ref)
ability_ref: ABILITY_OP name_ref
"""
if isinstance(kid[0], ast.Token) and isinstance(kid[1], ast.NameAtom):
return self.nu(
Expand Down Expand Up @@ -3962,9 +3952,9 @@ def kw_pattern_list(
def __default_token__(self, token: jl.Token) -> ast.Token:
"""Token handler."""
ret_type = ast.Token
if token.type in [Tok.NAME, Tok.KWESC_NAME]:
ret_type = ast.Name
if token.type in [
Tok.NAME,
Tok.KWESC_NAME,
Tok.KW_INIT,
Tok.KW_POST_INIT,
Tok.KW_ROOT,
Expand All @@ -3981,7 +3971,7 @@ def __default_token__(self, token: jl.Token) -> ast.Token:
ret_type = ast.Ellipsis
elif token.type == Tok.FLOAT:
ret_type = ast.Float
elif token.type in [Tok.INT, Tok.INT, Tok.HEX, Tok.BIN, Tok.OCT]:
elif token.type in [Tok.INT, Tok.HEX, Tok.BIN, Tok.OCT]:
ret_type = ast.Int
elif token.type in [
Tok.STRING,
Expand All @@ -4000,12 +3990,12 @@ def __default_token__(self, token: jl.Token) -> ast.Token:
orig_src=self.parse_ref.source,
name=token.type,
value=token.value[2:] if token.type == Tok.KWESC_NAME else token.value,
line=token.line if token.line is not None else 0,
end_line=token.end_line if token.end_line is not None else 0,
col_start=token.column if token.column is not None else 0,
col_end=token.end_column if token.end_column is not None else 0,
pos_start=token.start_pos if token.start_pos is not None else 0,
pos_end=token.end_pos if token.end_pos is not None else 0,
line=token.line or 0,
end_line=token.end_line or 0,
col_start=token.column or 0,
col_end=token.end_column or 0,
pos_start=token.start_pos or 0,
pos_end=token.end_pos or 0,
)
if isinstance(ret, ast.Name):
if token.type == Tok.KWESC_NAME:
Expand Down
2 changes: 1 addition & 1 deletion jac/jaclang/compiler/passes/main/def_impl_match_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ def exit_architype(self, node: ast.Architype) -> None:
if item.is_abstract:
continue
if (
isinstance(item.name_ref, ast.SpecialVarRef)
isinstance(item.name_ref, ast.Name)
and item.name_ref.name == "KW_POST_INIT"
):
postinit_method = item
Expand Down
7 changes: 0 additions & 7 deletions jac/jaclang/compiler/passes/main/def_use_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,6 @@ def enter_index_slice(self, node: ast.IndexSlice) -> None:
is_range: bool,
"""

def enter_special_var_ref(self, node: ast.SpecialVarRef) -> None:
"""Sub objects.
var: Token,
"""
node.sym_tab.use_lookup(node)

def enter_edge_op_ref(self, node: ast.EdgeOpRef) -> None:
"""Sub objects.
Expand Down
29 changes: 12 additions & 17 deletions jac/jaclang/compiler/passes/main/fuse_typeinfo_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,11 +294,18 @@ def enter_expr(self: FuseTypeInfoPass, node: ast.Expr) -> None:
)

@__handle_node
def enter_name(self, node: ast.NameAtom) -> None:
def enter_name(self, node: ast.Name) -> None:
"""Pass handler for name nodes."""
self.__collect_type_from_symbol(node)
if node.sym is None:
self.__check_builltin_symbol(node)
if node.py_resolve_name() == Constants.ROOT:
if node.gen.mypy_ast[-1] in self.node_type_hash:
node.name_spec.expr_type = (
self.__call_type_handler(self.node_type_hash[node.gen.mypy_ast[-1]])
or node.name_spec.expr_type
)
else:
self.__collect_type_from_symbol(node)
if node.sym is None:
self.__check_builltin_symbol(node)

@__handle_node
def enter_module_path(self, node: ast.ModulePath) -> None:
Expand Down Expand Up @@ -431,18 +438,6 @@ def enter_arch_ref(self, node: ast.ArchRef) -> None:
f"type(node.gen.mypy_ast[0])"
)

@__handle_node
def enter_special_var_ref(self, node: ast.SpecialVarRef) -> None:
"""Pass handler for SpecialVarRef nodes."""
if node.py_resolve_name() == Constants.ROOT:
if node.gen.mypy_ast[-1] in self.node_type_hash:
node.name_spec.expr_type = (
self.__call_type_handler(self.node_type_hash[node.gen.mypy_ast[-1]])
or node.name_spec.expr_type
)
else:
self.enter_name(node)

@__handle_node
def enter_edge_op_ref(self, node: ast.EdgeOpRef) -> None:
"""Pass handler for EdgeOpRef nodes."""
Expand Down Expand Up @@ -536,7 +531,7 @@ def exit_assignment(self, node: ast.Assignment) -> None:
for target in node.target.items:
if (
isinstance(target, ast.AtomTrailer)
and isinstance(target.target, ast.SpecialVarRef)
and isinstance(target.target, ast.Name)
and target.target.sym_name == "self"
):
self_obj = target.target
Expand Down
21 changes: 3 additions & 18 deletions jac/jaclang/compiler/passes/main/pyast_gen_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -1378,8 +1378,8 @@ def exit_arch_ref(self, node: ast.ArchRef) -> None:
"""
if node.arch_type.name == Tok.TYPE_OP:
if (
isinstance(node.arch_name, ast.SpecialVarRef)
and node.arch_name.orig.name == Tok.KW_ROOT
isinstance(node.arch_name, ast.Name)
and node.arch_name.name == Tok.KW_ROOT
):
node.gen.py_ast = [
self.sync(
Expand Down Expand Up @@ -3106,7 +3106,7 @@ def exit_index_slice(self, node: ast.IndexSlice) -> None:
else:
node.gen.py_ast = []

def exit_special_var_ref(self, node: ast.SpecialVarRef) -> None:
def exit_name(self, node: ast.Name) -> None:
"""Sub objects.
var: Token,
Expand Down Expand Up @@ -3708,21 +3708,6 @@ def exit_token(self, node: ast.Token) -> None:
elif node.name == Tok.KW_NIN:
node.gen.py_ast = [self.sync(ast3.NotIn())]

def exit_name(self, node: ast.Name) -> None:
"""Sub objects.
file_path: str,
name: str,
value: str,
col_start: int,
col_end: int,
pos_start: int,
pos_end: int,
"""
node.gen.py_ast = [
self.sync(ast3.Name(id=node.sym_name, ctx=node.py_ctx_func()))
]

def exit_float(self, node: ast.Float) -> None:
"""Sub objects.
Expand Down
7 changes: 2 additions & 5 deletions jac/jaclang/compiler/passes/main/pyast_load_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ class ClassDef(stmt):
and isinstance(body_stmt.name_ref, ast.Name)
and body_stmt.name_ref.value == "__init__"
):
tok = ast.Name(
body_stmt.name_ref = ast.Name(
orig_src=self.orig_src,
name=Tok.KW_INIT,
value="init",
Expand All @@ -304,7 +304,6 @@ class ClassDef(stmt):
pos_start=0,
pos_end=0,
)
body_stmt.name_ref = ast.SpecialVarRef(var=tok)
if (
isinstance(body_stmt, ast.Ability)
and body_stmt.signature
Expand Down Expand Up @@ -914,7 +913,7 @@ class Attribute(expr):
and isinstance(value.target, ast.Name)
and value.target.value == "super"
):
tok = ast.Name(
value = ast.Name(
orig_src=self.orig_src,
name=Tok.KW_SUPER,
value="super",
Expand All @@ -925,8 +924,6 @@ class Attribute(expr):
pos_start=0,
pos_end=0,
)
value = ast.SpecialVarRef(var=tok)
# exit()
attribute = ast.Name(
orig_src=self.orig_src,
name=Tok.NAME,
Expand Down
13 changes: 3 additions & 10 deletions jac/jaclang/compiler/passes/main/sym_tab_build_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ def exit_arch_def(self, node: ast.ArchDef) -> None:
def enter_ability(self, node: ast.Ability) -> None:
"""Sub objects.
name_ref: Name | SpecialVarRef | ArchRef,
name_ref: Name | ArchRef,
is_func: bool,
is_async: bool,
is_static: bool,
Expand All @@ -304,7 +304,7 @@ def enter_ability(self, node: ast.Ability) -> None:
def exit_ability(self, node: ast.Ability) -> None:
"""Sub objects.
name_ref: Name | SpecialVarRef | ArchRef,
name_ref: Name | ArchRef,
is_func: bool,
is_async: bool,
is_static: bool,
Expand Down Expand Up @@ -1006,18 +1006,11 @@ def enter_index_slice(self, node: ast.IndexSlice) -> None:
def enter_arch_ref(self, node: ast.ArchRef) -> None:
"""Sub objects.
name_ref: Name | SpecialVarRef,
name_ref: Name,
arch: Token,
"""
self.sync_node_to_scope(node)

def enter_special_var_ref(self, node: ast.SpecialVarRef) -> None:
"""Sub objects.
var: Token,
"""
self.sync_node_to_scope(node)

def enter_edge_ref_trailer(self, node: ast.EdgeRefTrailer) -> None:
"""Sub objects.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def test_data_spatial_type_info(self) -> None:
)
self.assertRegex(
out,
r"129:24 - 129:28.*SpecialVarRef - _Jac.get_root\(\) \- Type\: jaclang.runtimelib.architype.Root",
r"129:24 - 129:28.*Name - _Jac.get_root\(\) \- Type\: jaclang.runtimelib.architype.Root",
)
self.assertRegex(out, r"129:11 - 129:29.*FuncCall \- Type\: builtins\.str")
self.assertRegex(
Expand Down
Loading

0 comments on commit a0831cf

Please sign in to comment.