@@ -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
6868fromUberModule 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+
114133asExpression ∷ Either Lua. Chunk Lua. Exp → Lua. Exp
115134asExpression = \ 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-
122138fromName ∷ HasCallStack ⇒ IR. Name → Lua. Name
123139fromName = 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
0 commit comments