Skip to content

Commit c02d7ba

Browse files
committed
codegen: change the way inline modules are generated
1 parent a60623f commit c02d7ba

File tree

11 files changed

+139
-95
lines changed

11 files changed

+139
-95
lines changed

bsc/AST.py

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def __init__(
8080
self.stmts = stmts
8181
self.has_body = stmts != None
8282
self.is_main = is_main
83+
self.is_method = False
8384
self.sym = None
8485
self.pos = pos
8586

bsc/astgen.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ def extern_pkg(self, *nodes):
7979
return ExternPkg(pkg_name, alias_name, pos)
8080

8181
def mod_decl(self, *nodes):
82-
access_modifier = self.get_access_modifier(nodes)
83-
pos = self.mkpos(nodes[0] or nodes[1])
82+
access_modifier = self.get_access_modifier(nodes[0])
83+
pos = self.mkpos(nodes[1])
8484
name = nodes[2].name
8585
is_inline = len(nodes) > 3
8686
decls = []
@@ -92,6 +92,8 @@ def mod_decl(self, *nodes):
9292
access_modifier, name, Scope(self.mod_sym.scope, True), False,
9393
is_inline
9494
)
95+
if is_inline:
96+
mod_sym.pos = pos
9597
if not is_inline:
9698
self.source_file_deps.append(mod_sym)
9799
return ModDecl(access_modifier, name, is_inline, decls, pos, mod_sym)

bsc/codegen.py

+39-17
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def __init__(self, ctx):
1212
self.ctx = ctx
1313
self.modules = []
1414

15+
self.cur_file = None
1516
self.cur_module = None
1617
self.cur_decls = []
1718
self.cur_fn = None
@@ -24,9 +25,18 @@ def gen_files(self, source_files):
2425
render.render_modules()
2526

2627
def gen_file(self, file):
28+
self.cur_file = file
2729
self.cur_module = LuaModule(file.mod_sym.name)
2830
self.gen_decls(file.decls)
29-
self.cur_module.decls = self.cur_decls
31+
32+
module_fields = []
33+
for sym in file.mod_sym.scope.syms:
34+
if sym.access_modifier.is_public():
35+
module_fields.append(
36+
LuaTableField(LuaIdent(sym.name), LuaIdent(sym.name))
37+
)
38+
self.cur_decls.append(LuaReturn(LuaTable(module_fields)))
39+
self.cur_module.stmts = self.cur_decls
3040
self.modules.append(self.cur_module)
3141
self.cur_decls = []
3242

@@ -46,27 +56,35 @@ def gen_decl(self, decl):
4656

4757
def gen_mod_decl(self, decl):
4858
if decl.is_inline:
59+
self.cur_decls.append(LuaAssignment([LuaIdent(decl.name)], []))
4960
old_decls = self.cur_decls
61+
5062
self.cur_decls = []
5163
self.gen_decls(decl.decls)
52-
old_decls.append(
53-
LuaModule(decl.sym.codegen_qualname(), self.cur_decls, True)
64+
65+
module_fields = []
66+
for sym in decl.sym.scope.syms:
67+
if sym.access_modifier.is_public():
68+
module_fields.append(
69+
LuaTableField(LuaIdent(sym.name), LuaIdent(sym.name))
70+
)
71+
self.cur_decls.append(
72+
LuaAssignment([LuaIdent(decl.name)], [LuaTable(module_fields)],
73+
False)
5474
)
75+
76+
mod_decls = self.cur_decls
5577
self.cur_decls = old_decls
78+
self.cur_decls.append(LuaBlock(mod_decls))
5679
else:
5780
self.cur_decls.append(
58-
LuaModule(
59-
decl.sym.codegen_qualname(), [], False,
60-
lua_filename = decl.name
61-
)
81+
LuaModule(decl.sym.name, [], False, lua_filename = decl.name)
6282
)
6383

6484
def gen_const_decl(self, decl):
65-
is_local = decl.is_local
66-
name = decl.name if is_local else decl.sym.codegen_qualname()
67-
lua_assign = LuaAssignment([LuaIdent(name)], [self.gen_expr(decl.expr)],
68-
is_local)
69-
if is_local:
85+
name = decl.name if decl.is_local else decl.sym.name
86+
lua_assign = LuaAssignment([LuaIdent(name)], [self.gen_expr(decl.expr)])
87+
if decl.is_local:
7088
self.cur_block.add_stmt(lua_assign)
7189
else:
7290
self.cur_decls.append(lua_assign)
@@ -76,8 +94,7 @@ def gen_enum_decl(self, decl):
7694
for i, f in enumerate(decl.fields):
7795
fields.append(LuaTableField(LuaIdent(f.name), LuaNumberLit(str(i))))
7896
self.cur_decls.append(
79-
LuaAssignment([LuaIdent(decl.sym.codegen_qualname())],
80-
[LuaTable(fields)], False)
97+
LuaAssignment([LuaIdent(decl.sym).name], [LuaTable(fields)], False)
8198
)
8299
self.gen_decls(decl.decls)
83100

@@ -86,7 +103,10 @@ def gen_fn_decl(self, decl):
86103
args = []
87104
for arg in decl.args:
88105
args.append(LuaIdent(arg.name))
89-
luafn = LuaFunction(decl.sym.codegen_qualname(), args)
106+
luafn = LuaFunction(
107+
decl.sym.codegen_qualname(), args,
108+
is_associated = decl.sym.is_associated()
109+
)
90110
for arg in decl.args:
91111
if arg.default_value != None:
92112
left = LuaIdent(arg.name)
@@ -182,9 +202,11 @@ def gen_expr(self, expr):
182202
return LuaBooleanLit(leftb or rightb)
183203
return LuaBinaryExpr(left, expr.op.to_lua_op(), right)
184204
elif isinstance(expr, Ident):
185-
if isinstance(expr.sym, Object):
205+
if isinstance(
206+
expr.sym, Object
207+
) and expr.sym.level != ObjectLevel.static:
186208
return LuaIdent(expr.name)
187-
if expr.sym != None: return LuaIdent(expr.sym.codegen_name())
209+
if expr.sym != None: return LuaIdent(expr.sym.name)
188210
return LuaIdent(expr.name)
189211
elif isinstance(expr, BlockExpr):
190212
old_block = self.cur_block

bsc/lua_ast/__init__.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
# LICENSE file.
44

55
class LuaModule:
6-
def __init__(self, name, decls = [], is_inline = False, lua_filename = ""):
6+
def __init__(self, name, stmts = [], is_inline = False, lua_filename = ""):
77
self.name = name
8-
self.decls = decls
8+
self.stmts = stmts.copy()
99
self.is_inline = is_inline
1010
self.lua_filename = lua_filename
1111

@@ -19,9 +19,10 @@ def __init__(self, fields):
1919
self.fields = fields
2020

2121
class LuaFunction:
22-
def __init__(self, name, args):
22+
def __init__(self, name, args, is_associated = False):
2323
self.name = name
2424
self.args = args
25+
self.is_associated = is_associated
2526
self.block = LuaBlock()
2627

2728
# Statements
@@ -47,8 +48,8 @@ def __init__(self, cond, is_else, stmts):
4748
self.stmts = stmts
4849

4950
class LuaBlock:
50-
def __init__(self):
51-
self.stmts = []
51+
def __init__(self, stmts = []):
52+
self.stmts = stmts.copy()
5253

5354
def add_stmt(self, stmt):
5455
self.stmts.append(stmt)

bsc/lua_ast/render.py

+48-57
Original file line numberDiff line numberDiff line change
@@ -34,71 +34,26 @@ def render_module(self, module):
3434
"-- WARNING: DO NOT MODIFY MANUALLY! YOUR CHANGES WILL BE OVERWRITTEN --\n"
3535
)
3636

37-
self.writeln(f"local {module.name} = {{}} -- package\n")
38-
self.render_decls(module.decls)
39-
self.writeln(f"return {module.name}\n")
37+
self.render_stmts(module.stmts)
4038

4139
with open(f"{BSC_OUT_DIR}/{module.name}.lua", "w") as f:
4240
f.write(str(self.lua_file))
4341
self.lua_file.clear()
4442

45-
def render_decls(self, decls):
46-
for decl in decls:
47-
self.render_decl(decl)
48-
49-
def render_decl(self, decl):
50-
if isinstance(decl, LuaModule):
51-
self.render_mod(decl)
52-
elif isinstance(decl, LuaTable):
53-
self.render_table(decl)
54-
elif isinstance(decl, LuaAssignment):
55-
self.render_assign_decl(decl)
56-
elif isinstance(decl, LuaFunction):
57-
self.render_fn_decl(decl)
58-
59-
def render_mod(self, decl):
60-
if decl.is_inline:
61-
self.writeln(f"{decl.name} = {{}} -- inline module\n")
62-
self.render_decls(decl.decls)
63-
self.writeln(f"-- end module `{decl.name}`\n")
64-
else:
65-
self.writeln(
66-
f"{decl.name} = require(\"{BSC_OUT_DIR}.{decl.lua_filename}\") -- load module file\n"
67-
)
68-
69-
def render_fn_decl(self, decl):
70-
self.write(f"function {decl.name}(")
71-
for i, arg in enumerate(decl.args):
72-
self.write(arg.name)
73-
if i < len(decl.args) - 1:
74-
self.write(", ")
75-
self.writeln(")")
76-
self.indent += 1
77-
self.render_stmts(decl.block.stmts)
78-
self.indent -= 1
79-
self.writeln("end\n")
80-
81-
def render_assign_decl(self, decl):
82-
if decl.is_local:
83-
self.write("local ")
84-
for i, left in enumerate(decl.lefts):
85-
self.render_ident(left)
86-
if i < len(decl.lefts) - 1:
87-
self.write(", ")
88-
if len(decl.rights) > 0:
89-
self.write(" = ")
90-
for i, right in enumerate(decl.rights):
91-
self.render_expr(right)
92-
if i < len(decl.rights) - 1:
93-
self.write(", ")
94-
self.writeln()
95-
9643
def render_stmts(self, stmts):
9744
for stmt in stmts:
9845
self.render_stmt(stmt)
9946

10047
def render_stmt(self, stmt):
101-
if isinstance(stmt, LuaWhile):
48+
if isinstance(stmt, LuaModule):
49+
self.render_mod(stmt)
50+
elif isinstance(stmt, LuaFunction):
51+
self.render_fn_stmt(stmt)
52+
elif isinstance(stmt, LuaTable):
53+
self.render_table(stmt)
54+
elif isinstance(stmt, LuaAssignment):
55+
self.render_assign_stmt(stmt)
56+
elif isinstance(stmt, LuaWhile):
10257
self.write("while ")
10358
self.render_expr(stmt.cond)
10459
self.writeln(" do")
@@ -130,22 +85,58 @@ def render_stmt(self, stmt):
13085
self.indent += 1
13186
self.render_stmts(stmt.stmts)
13287
self.indent -= 1
133-
self.writeln("end")
88+
self.writeln("end\n")
13489
elif isinstance(stmt, LuaAssignment):
135-
self.render_assign_decl(stmt)
90+
self.render_assign_stmt(stmt)
13691
elif isinstance(stmt, LuaReturn):
13792
self.write("return")
13893
if stmt.expr != None:
13994
self.write(" ")
14095
self.render_expr(stmt.expr)
14196
self.writeln()
14297

98+
def render_mod(self, stmt):
99+
self.writeln(
100+
f"local {stmt.name} = require(\"{BSC_OUT_DIR}.{stmt.lua_filename}\") -- load module file\n"
101+
)
102+
103+
def render_fn_stmt(self, stmt):
104+
if not stmt.is_associated:
105+
self.write("local ")
106+
self.write(f"function {stmt.name}(")
107+
for i, arg in enumerate(stmt.args):
108+
self.write(arg.name)
109+
if i < len(stmt.args) - 1:
110+
self.write(", ")
111+
self.writeln(")")
112+
self.indent += 1
113+
self.render_stmts(stmt.block.stmts)
114+
self.indent -= 1
115+
self.writeln("end\n")
116+
117+
def render_assign_stmt(self, stmt):
118+
if stmt.is_local: self.write("local ")
119+
for i, left in enumerate(stmt.lefts):
120+
self.render_ident(left)
121+
if i < len(stmt.lefts) - 1:
122+
self.write(", ")
123+
if len(stmt.rights) > 0:
124+
self.write(" = ")
125+
for i, right in enumerate(stmt.rights):
126+
self.render_expr(right)
127+
if i < len(stmt.rights) - 1:
128+
self.write(", ")
129+
self.writeln()
130+
143131
def render_expr(self, expr):
144132
if isinstance(expr, LuaParenExpr):
145133
self.write("(")
146134
self.render_expr(expr.expr)
147135
self.write(")")
148136
elif isinstance(expr, LuaTable):
137+
if len(expr.fields) == 0:
138+
self.writeln("{}")
139+
return
149140
self.writeln("{")
150141
self.indent += 1
151142
for i, field in enumerate(expr.fields):

0 commit comments

Comments
 (0)