@@ -4,7 +4,7 @@ module Language.PureScript.Backend.Lua
4
4
( fromUberModule
5
5
, fromIR
6
6
, fromName
7
- , fromQName
7
+ -- , qualifyName
8
8
, qualifyName
9
9
, Error (.. )
10
10
) where
@@ -66,23 +66,28 @@ fromUberModule
66
66
→ Linker. UberModule
67
67
→ ExceptT (Variant e ) IO Lua. Chunk
68
68
fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0 ) do
69
- (chunk , usesObjectUpdate) ← (`runAccumT` NoObjectUpdate ) do
69
+ ((bindings, returnStat) , usesObjectUpdate) ← (`runAccumT` NoObjectUpdate ) do
70
70
foreignBindings ←
71
71
forM (Linker. uberModuleForeigns uber) \ (IR. QName modname name, irExp) → do
72
72
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
+
74
75
bindings ←
75
76
Linker. uberModuleBindings uber & foldMapM \ case
76
77
IR. Standalone (IR. QName modname name, irExp) → do
77
78
exp ← fromIR foreigns Set. empty modname irExp
78
79
pure . DList. singleton $
79
- Lua. assignVar (fromQName modname name) (asExpression exp )
80
+ mkBinding modname (fromName name) (asExpression exp )
80
81
IR. RecursiveGroup recGroup → do
81
82
recBinds ← forM (toList recGroup) \ (IR. QName modname name, irExp) →
82
- (fromQName modname name,) . asExpression
83
+ (modname, name,) . asExpression
83
84
<$> 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
86
91
pure $ declarations <> assignments
87
92
88
93
returnExp ←
@@ -100,25 +105,36 @@ fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0) do
100
105
where
101
106
name = IR. identToName ident
102
107
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
+ )
106
112
107
113
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
+ ]
109
118
, [Fixture. runtimeLazy | untag needsRuntimeLazy && usesRuntimeLazy uber]
110
119
, [Fixture. objectUpdate | UsesObjectUpdate ← [usesObjectUpdate]]
111
- , DList. toList chunk
120
+ , toList ( DList. snoc bindings returnStat)
112
121
]
113
122
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
+
114
133
asExpression ∷ Either Lua. Chunk Lua. Exp → Lua. Exp
115
134
asExpression = \ case
116
135
Left chunk → Lua. chunkToExpression chunk
117
136
Right expr → expr
118
137
119
- fromQName ∷ ModuleName → IR. Name → Lua. Name
120
- fromQName modname name = qualifyName modname (fromName name)
121
-
122
138
fromName ∷ HasCallStack ⇒ IR. Name → Lua. Name
123
139
fromName = Name. makeSafe . IR. nameToText
124
140
@@ -203,13 +219,13 @@ fromIR foreigns topLevelNames modname ir = case ir of
203
219
IR. Ref _ann qualifiedName index →
204
220
pure . Right $ case qualifiedName of
205
221
IR. Local name
206
- | topLevelName ← fromQName modname name
222
+ | topLevelName ← qualifyName modname (fromName name)
207
223
, Set. member topLevelName topLevelNames →
208
- Lua. varName topLevelName
224
+ Lua. varField ( Lua. var moduleVar) topLevelName
209
225
IR. Local name →
210
226
Lua. varName (fromNameWithIndex name index)
211
227
IR. Imported modname' name →
212
- Lua. varName (fromQName modname' name)
228
+ Lua. varField ( Lua. var moduleVar) (qualifyName modname' (fromName name) )
213
229
IR. Let _ann bindings bodyExp → do
214
230
body ← go bodyExp
215
231
recs ←
@@ -218,18 +234,22 @@ fromIR foreigns topLevelNames modname ir = case ir of
218
234
DList. singleton . Lua. local1 (fromName name) <$> goExp expr
219
235
IR. RecursiveGroup grp → do
220
236
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
+ )
233
253
pure $ DList. fromList binds <> DList. fromList assignments
234
254
pure . Left . DList. toList $
235
255
recs <> either DList. fromList (DList. singleton . Lua. return ) body
0 commit comments