Skip to content

Commit 76fdcf5

Browse files
committed
astgen: generate Lua functions as anonymous
1 parent 2981e5e commit 76fdcf5

File tree

5 files changed

+42
-43
lines changed

5 files changed

+42
-43
lines changed

bsc/codegen/__init__.py

+29-21
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,7 @@ def gen_mod_decl(self, decl):
8181

8282
self.cur_block = LuaBlock()
8383
self.gen_decls(decl.decls)
84-
85-
module_fields = []
86-
for sym in decl.sym.scope.syms:
87-
if sym.access_modifier.is_public():
88-
module_fields.append(
89-
LuaTableField(LuaIdent(sym.name), LuaIdent(sym.name))
90-
)
91-
self.cur_block.add_stmt(
92-
LuaAssignment([LuaIdent(decl.name)], [LuaTable(module_fields)],
93-
False)
94-
)
84+
self.export_public_symbols(decl.sym)
9585

9686
mod_decls = self.cur_block
9787
self.cur_block = old_block
@@ -113,26 +103,30 @@ def gen_const_decl(self, decl):
113103
self.cur_block.add_stmt(lua_assign)
114104

115105
def gen_enum_decl(self, decl):
116-
fields = []
106+
self.cur_block.add_stmt(LuaAssignment([LuaIdent(decl.sym.name)], []))
107+
old_block = self.cur_block
108+
self.cur_block = LuaBlock()
117109
for i, f in enumerate(decl.fields):
118-
fields.append(LuaTableField(LuaIdent(f.name), LuaNumberLit(str(i))))
119-
self.cur_block.add_stmt(
120-
LuaAssignment([LuaIdent(decl.sym.name)], [LuaTable(fields)], False)
121-
)
110+
self.cur_block.add_stmt(
111+
LuaAssignment([LuaSelector(LuaIdent(decl.name), f.name)],
112+
[LuaNumberLit(str(i))], False)
113+
)
122114
self.switch_cur_sym(decl.sym)
123115
self.gen_decls(decl.decls)
116+
self.export_public_symbols(decl.sym)
124117
self.switch_cur_sym()
118+
old_block.add_stmt(self.cur_block)
119+
self.cur_block = old_block
125120

126121
def gen_fn_decl(self, decl):
127122
if not decl.has_body: return
128123
old_block = self.cur_block
129124
args = []
125+
if decl.is_method:
126+
args.append(LuaIdent("self"))
130127
for arg in decl.args:
131128
args.append(LuaIdent(arg.name))
132-
luafn = LuaFunction(
133-
decl.sym.cg_method_qualname(), args,
134-
is_static = decl.sym.is_static()
135-
)
129+
luafn = LuaFunction(args, is_static = decl.sym.is_static())
136130
for arg in decl.args:
137131
if arg.default_value != None:
138132
left = LuaIdent(arg.name)
@@ -148,7 +142,9 @@ def gen_fn_decl(self, decl):
148142
self.gen_stmts(decl.stmts)
149143
self.cur_fn = None
150144
self.cur_block = old_block
151-
self.cur_block.add_stmt(luafn)
145+
self.cur_block.add_stmt(
146+
LuaAssignment([LuaIdent(decl.sym.name)], [luafn])
147+
)
152148

153149
## == Statements ============================================
154150

@@ -269,3 +265,15 @@ def gen_expr(self, expr):
269265
ret_expr = self.gen_expr(expr.expr)
270266
self.cur_block.add_stmt(LuaReturn(ret_expr))
271267
return LuaSkip()
268+
269+
def export_public_symbols(self, decl_sym):
270+
exported_fields = []
271+
for sym in decl_sym.scope.syms:
272+
if sym.access_modifier.is_public():
273+
exported_fields.append(
274+
LuaTableField(LuaIdent(sym.name), LuaIdent(sym.name))
275+
)
276+
self.cur_block.add_stmt(
277+
LuaAssignment([LuaIdent(decl_sym.name)],
278+
[LuaTable(exported_fields)], False)
279+
)

bsc/codegen/lua_ast.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ def __init__(self, fields):
2424
self.fields = fields
2525

2626
class LuaFunction:
27-
def __init__(self, name, args, is_static = False):
28-
self.name = name
27+
def __init__(self, args, is_static = False):
2928
self.args = args
3029
self.is_static = is_static
3130
self.block = LuaBlock()

bsc/codegen/lua_render.py

+11-14
Original file line numberDiff line numberDiff line change
@@ -94,20 +94,6 @@ def render_stmt(self, stmt):
9494
else:
9595
self.render_expr(stmt) # support for using expressions as statements
9696

97-
def render_fn_stmt(self, stmt):
98-
if not stmt.is_static:
99-
self.write("local ")
100-
self.write(f"function {stmt.name}(")
101-
for i, arg in enumerate(stmt.args):
102-
self.write(arg.name)
103-
if i < len(stmt.args) - 1:
104-
self.write(", ")
105-
self.writeln(")")
106-
self.indent += 1
107-
self.render_stmts(stmt.block.stmts)
108-
self.indent -= 1
109-
self.writeln("end\n")
110-
11197
def render_assign_stmt(self, stmt):
11298
if stmt.is_local: self.write("local ")
11399
for i, left in enumerate(stmt.lefts):
@@ -127,6 +113,17 @@ def render_expr(self, expr):
127113
self.write("(")
128114
self.render_expr(expr.expr)
129115
self.write(")")
116+
elif isinstance(expr, LuaFunction):
117+
self.write(f"function(")
118+
for i, arg in enumerate(expr.args):
119+
self.write(arg.name)
120+
if i < len(expr.args) - 1:
121+
self.write(", ")
122+
self.writeln(")")
123+
self.indent += 1
124+
self.render_stmts(expr.block.stmts)
125+
self.indent -= 1
126+
self.writeln("end\n")
130127
elif isinstance(expr, LuaTable):
131128
if len(expr.fields) == 0:
132129
self.write("{}")

bsc/sym.py

-5
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,6 @@ def qualname(self, sep = "::"):
9696
return f"{self.parent.qualname(sep)}{sep}{self.name}"
9797
return self.name
9898

99-
def cg_method_qualname(self):
100-
if isinstance(self.parent, TypeSym):
101-
return f"{self.parent.name}.{self.name}"
102-
return self.name
103-
10499
def __eq__(self, other):
105100
return str(self) == str(other)
106101

tests/syntax.bs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub enum WorldLevel {
3737
underworld,
3838
undefined = 0xFF
3939

40-
fn from_string(s: string) Self {
40+
pub fn from_string(s: string) Self {
4141
unsafe {
4242
$lua("function x() end");
4343
}

0 commit comments

Comments
 (0)