Skip to content

Commit ef2c4cc

Browse files
committed
Bindings use namespace M
1 parent cc90531 commit ef2c4cc

File tree

21 files changed

+201
-160
lines changed

21 files changed

+201
-160
lines changed

flake.lock

+35-35
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Language/PureScript/Backend.hs

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ compileModules outputDir foreignDir appOrModule = do
4444
let needsRuntimeLazy = Tagged (any untag needsRuntimeLazys)
4545
chunk Lua.fromUberModule foreignDir needsRuntimeLazy appOrModule uberModule
4646
pure CompilationResult {lua = optimizeChunk chunk, ir = uberModule}
47+
4748
linkerMode AppOrModule Linker.LinkMode
4849
linkerMode = \case
4950
AsModule psModuleName Linker.LinkAsModule psModuleName

lib/Language/PureScript/Backend/Lua.hs

+50-30
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Language.PureScript.Backend.Lua
44
( fromUberModule
55
, fromIR
66
, fromName
7-
, fromQName
7+
-- , qualifyName
88
, qualifyName
99
, Error (..)
1010
) where
@@ -66,23 +66,28 @@ fromUberModule
6666
Linker.UberModule
6767
ExceptT (Variant e) IO Lua.Chunk
6868
fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0) do
69-
(chunk, usesObjectUpdate) (`runAccumT` NoObjectUpdate) do
69+
((bindings, returnStat), usesObjectUpdate) (`runAccumT` NoObjectUpdate) do
7070
foreignBindings
7171
forM (Linker.uberModuleForeigns uber) \(IR.QName modname name, irExp) do
7272
exp asExpression <$> fromIR foreigns Set.empty modname irExp
73-
pure $ Lua.assign (Lua.VarName (fromQName modname name)) exp
73+
pure $ mkBinding modname (fromName name) exp
74+
7475
bindings
7576
Linker.uberModuleBindings uber & foldMapM \case
7677
IR.Standalone (IR.QName modname name, irExp) do
7778
exp fromIR foreigns Set.empty modname irExp
7879
pure . DList.singleton $
79-
Lua.assignVar (fromQName modname name) (asExpression exp)
80+
mkBinding modname (fromName name) (asExpression exp)
8081
IR.RecursiveGroup recGroup do
8182
recBinds forM (toList recGroup) \(IR.QName modname name, irExp)
82-
(fromQName modname name,) . asExpression
83+
(modname,name,) . asExpression
8384
<$> fromIR foreigns Set.empty modname irExp
84-
let declarations = Lua.local0 . fst <$> DList.fromList recBinds
85-
assignments = DList.fromList (uncurry Lua.assignVar <$> recBinds)
85+
let declarations = DList.fromList do
86+
(modname, name, _exp) recBinds
87+
pure $ mkBinding modname (fromName name) Lua.Nil
88+
assignments = DList.fromList do
89+
(modname, name, exp) recBinds
90+
pure $ mkBinding modname (fromName name) exp
8691
pure $ declarations <> assignments
8792

8893
returnExp
@@ -100,25 +105,36 @@ fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0) do
100105
where
101106
name = IR.identToName ident
102107

103-
pure $
104-
DList.fromList foreignBindings
105-
<> DList.snoc bindings (Lua.Return (Lua.ann returnExp))
108+
pure
109+
( DList.fromList foreignBindings <> bindings
110+
, Lua.Return (Lua.ann returnExp)
111+
)
106112

107113
pure . mconcat $
108-
[ [Fixture.prim | usesPrimModule uber]
114+
[ [Lua.assign moduleVar (Lua.table []) | not (null bindings)]
115+
, [ mkBinding Fixture.primModule Fixture.undefined Lua.Nil
116+
| usesPrimModule uber
117+
]
109118
, [Fixture.runtimeLazy | untag needsRuntimeLazy && usesRuntimeLazy uber]
110119
, [Fixture.objectUpdate | UsesObjectUpdate [usesObjectUpdate]]
111-
, DList.toList chunk
120+
, toList (DList.snoc bindings returnStat)
112121
]
113122

123+
mkBinding ModuleName Lua.Name Lua.Exp Lua.Statement
124+
mkBinding modname name =
125+
Lua.assign $
126+
Lua.VarField
127+
(Lua.ann (Lua.var moduleVar))
128+
(qualifyName modname name)
129+
130+
moduleVar Lua.Var
131+
moduleVar = Lua.VarName [Lua.name|M|]
132+
114133
asExpression Either Lua.Chunk Lua.Exp Lua.Exp
115134
asExpression = \case
116135
Left chunk Lua.chunkToExpression chunk
117136
Right expr expr
118137

119-
fromQName ModuleName IR.Name Lua.Name
120-
fromQName modname name = qualifyName modname (fromName name)
121-
122138
fromName HasCallStack IR.Name Lua.Name
123139
fromName = Name.makeSafe . IR.nameToText
124140

@@ -203,13 +219,13 @@ fromIR foreigns topLevelNames modname ir = case ir of
203219
IR.Ref _ann qualifiedName index
204220
pure . Right $ case qualifiedName of
205221
IR.Local name
206-
| topLevelName fromQName modname name
222+
| topLevelName qualifyName modname (fromName name)
207223
, Set.member topLevelName topLevelNames
208-
Lua.varName topLevelName
224+
Lua.varField (Lua.var moduleVar) topLevelName
209225
IR.Local name
210226
Lua.varName (fromNameWithIndex name index)
211227
IR.Imported modname' name
212-
Lua.varName (fromQName modname' name)
228+
Lua.varField (Lua.var moduleVar) (qualifyName modname' (fromName name))
213229
IR.Let _ann bindings bodyExp do
214230
body go bodyExp
215231
recs
@@ -218,18 +234,22 @@ fromIR foreigns topLevelNames modname ir = case ir of
218234
DList.singleton . Lua.local1 (fromName name) <$> goExp expr
219235
IR.RecursiveGroup grp do
220236
let binds =
221-
toList grp <&> \(_ann, irName, _) do
222-
let name =
223-
if Set.member (fromQName modname irName) topLevelNames
224-
then fromQName modname irName
225-
else fromName irName
226-
Lua.Local name Nothing
227-
assignments forM (toList grp) \(_ann, irName, expr) do
228-
let name =
229-
if Set.member (fromQName modname irName) topLevelNames
230-
then fromQName modname irName
231-
else fromName irName
232-
Lua.assign (Lua.VarName name) <$> goExp expr
237+
toList grp <&> \(_ann, fromName name, _)
238+
Lua.Local
239+
( if Set.member (qualifyName modname name) topLevelNames
240+
then qualifyName modname name
241+
else name
242+
)
243+
Nothing
244+
assignments forM (toList grp) \(_ann, fromName name, expr)
245+
goExp expr
246+
<&> Lua.assign
247+
( Lua.VarName
248+
( if Set.member (qualifyName modname name) topLevelNames
249+
then qualifyName modname name
250+
else name
251+
)
252+
)
233253
pure $ DList.fromList binds <> DList.fromList assignments
234254
pure . Left . DList.toList $
235255
recs <> either DList.fromList (DList.singleton . Lua.return) body

lib/Language/PureScript/Backend/Lua/Fixture.hs

+10-3
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,22 @@ import Data.String.Interpolate (__i)
66
import Language.PureScript.Backend.Lua.Name (Name, name, unsafeName)
77
import Language.PureScript.Backend.Lua.Name qualified as Name
88
import Language.PureScript.Backend.Lua.Types hiding (var)
9+
import Language.PureScript.Backend.IR.Names (ModuleName(..))
910

1011
--------------------------------------------------------------------------------
1112
-- Hard-coded Lua pieces -------------------------------------------------------
1213

13-
prim Statement
14-
prim = assignVar (primName [name|undefined|]) Nil
14+
prim Name
15+
prim = [name|Prim|]
16+
17+
primModule :: ModuleName
18+
primModule = ModuleName "Prim"
19+
20+
undefined Name
21+
undefined = primName [name|undefined|]
1522

1623
primName Name Name
17-
primName = psluaName . Name.join2 [name|Prim|]
24+
primName = psluaName . Name.join2 prim
1825

1926
uniqueName MonadState Natural m Text m Name
2027
uniqueName prefix = do

lib/Language/PureScript/Backend/Types.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ data AppOrModule
99

1010
entryPointModule AppOrModule PS.ModuleName
1111
entryPointModule = \case
12-
AsApplication modul _ident modul
13-
AsModule modul modul
12+
AsApplication modname _ident modname
13+
AsModule modname modname

test/ps/output/Golden.Annotations.M1/golden.lua

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
PSLUA_Golden_Annotations_M1_foreign = (function()
1+
M = {}
2+
M.PSLUA_Golden_Annotations_M1_foreign = (function()
23
local step = 2
34
return {
45
dontInlineClosure = function(i)
@@ -11,6 +12,6 @@ PSLUA_Golden_Annotations_M1_foreign = (function()
1112
end)()
1213
return {
1314
inlineMe = function(v) if 1 == v then return 2 else return v end end,
14-
dontInlineClosure = PSLUA_Golden_Annotations_M1_foreign.dontInlineClosure,
15-
inlineMeLambda = PSLUA_Golden_Annotations_M1_foreign.inlineMeLambda
15+
dontInlineClosure = M.PSLUA_Golden_Annotations_M1_foreign.dontInlineClosure,
16+
inlineMeLambda = M.PSLUA_Golden_Annotations_M1_foreign.inlineMeLambda
1617
}

test/ps/output/Golden.Annotations.M2/golden.lua

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
PSLUA_Golden_Annotations_M1_foreign = (function()
1+
M = {}
2+
M.PSLUA_Golden_Annotations_M1_foreign = (function()
23
local step = 2
34
return {
45
dontInlineClosure = function(i)
@@ -27,5 +28,5 @@ return {
2728
end
2829
end
2930
end,
30-
inlineIntoMe2 = PSLUA_Golden_Annotations_M1_foreign.dontInlineClosure(PSLUA_Golden_Annotations_M1_foreign.inlineMeLambda(PSLUA_Golden_Annotations_M1_foreign.inlineMeLambda(17)))
31+
inlineIntoMe2 = M.PSLUA_Golden_Annotations_M1_foreign.dontInlineClosure(M.PSLUA_Golden_Annotations_M1_foreign.inlineMeLambda(M.PSLUA_Golden_Annotations_M1_foreign.inlineMeLambda(17)))
3132
}

test/ps/output/Golden.CaseStatements.Test/golden.lua

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
PSLUA_Golden_Values_Test_f = function(unused0) return true end
1+
M = {}
2+
M.PSLUA_Golden_Values_Test_f = function(unused0) return true end
23
return {
34
a = 1,
45
b = "b",
56
c = (function()
67
local v = function(unused1) return 0 end
7-
if PSLUA_Golden_Values_Test_f(2) then
8-
if PSLUA_Golden_Values_Test_f(1) then return 42 else return v(true) end
8+
if M.PSLUA_Golden_Values_Test_f(2) then
9+
if M.PSLUA_Golden_Values_Test_f(1) then return 42 else return v(true) end
910
else
1011
return v(true)
1112
end
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
PSLUA_Golden_Foreign_Lib_foreign = { dead = -100, alive = 100 }
1+
M = {}
2+
M.PSLUA_Golden_Foreign_Lib_foreign = { dead = -100, alive = 100 }
23
return {
3-
dead = PSLUA_Golden_Foreign_Lib_foreign.dead,
4-
alive = PSLUA_Golden_Foreign_Lib_foreign.alive
4+
dead = M.PSLUA_Golden_Foreign_Lib_foreign.dead,
5+
alive = M.PSLUA_Golden_Foreign_Lib_foreign.alive
56
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
PSLUA_Golden_Foreign_Test_foreign = (function()
1+
M = {}
2+
M.PSLUA_Golden_Foreign_Test_foreign = (function()
23
local fooBar = 42
34
return { foo = fooBar + 1, boo = fooBar + 2 }
45
end)()
56
return {
6-
foo = PSLUA_Golden_Foreign_Test_foreign.foo,
7-
baz = { [1] = PSLUA_Golden_Foreign_Test_foreign.boo, [2] = 100 }
7+
foo = M.PSLUA_Golden_Foreign_Test_foreign.foo,
8+
baz = { [1] = M.PSLUA_Golden_Foreign_Test_foreign.boo, [2] = 100 }
89
}

test/ps/output/Golden.HelloPrelude.Test/golden.ir

+1-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ UberModule
206206
)
207207
( ObjectProp ( Just Always )
208208
( ForeignImport Nothing
209-
( ModuleName "Data.Unit" ) ".spago/prelude/v7.1.0/src/Data/Unit.purs"
209+
( ModuleName "Data.Unit" ) ".spago/prelude/v7.1.1/src/Data/Unit.purs"
210210
[ ( Nothing, Name "unit" ) ]
211211
)
212212
( PropName "unit" )

0 commit comments

Comments
 (0)