@@ -4,7 +4,6 @@ module Language.PureScript.Backend.Lua
4
4
( fromUberModule
5
5
, fromIR
6
6
, fromName
7
- -- , qualifyName
8
7
, qualifyName
9
8
, Error (.. )
10
9
) where
@@ -23,7 +22,7 @@ import Data.Traversable (for)
23
22
import Language.PureScript.Backend.IR qualified as IR
24
23
import Language.PureScript.Backend.IR.Linker (UberModule (.. ))
25
24
import Language.PureScript.Backend.IR.Linker qualified as Linker
26
- import Language.PureScript.Backend.IR.Query (usesPrimModule , usesRuntimeLazy )
25
+ import Language.PureScript.Backend.IR.Query (usesRuntimeLazy )
27
26
import Language.PureScript.Backend.Lua.Fixture qualified as Fixture
28
27
import Language.PureScript.Backend.Lua.Key qualified as Key
29
28
import Language.PureScript.Backend.Lua.Linker.Foreign qualified as Foreign
@@ -32,7 +31,7 @@ import Language.PureScript.Backend.Lua.Name qualified as Name
32
31
import Language.PureScript.Backend.Lua.Types (ParamF (.. ))
33
32
import Language.PureScript.Backend.Lua.Types qualified as Lua
34
33
import Language.PureScript.Backend.Types (AppOrModule (.. ))
35
- import Language.PureScript.Names (ModuleName , runModuleName )
34
+ import Language.PureScript.Names (ModuleName ( .. ) , runModuleName )
36
35
import Language.PureScript.Names qualified as PS
37
36
import Path (Abs , Dir , Path )
38
37
import Prelude hiding (exp , local )
@@ -82,13 +81,9 @@ fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0) do
82
81
recBinds ← forM (toList recGroup) \ (IR. QName modname name, irExp) →
83
82
(modname,name,) . asExpression
84
83
<$> fromIR foreigns Set. empty modname irExp
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
91
- pure $ declarations <> assignments
84
+ pure $ DList. fromList do
85
+ (modname, name, exp ) ← recBinds
86
+ pure $ mkBinding modname (fromName name) exp
92
87
93
88
returnExp ←
94
89
case appOrModule of
@@ -111,25 +106,19 @@ fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0) do
111
106
)
112
107
113
108
pure . mconcat $
114
- [ [Lua. assign moduleVar (Lua. table [] ) | not (null bindings)]
115
- , [ mkBinding Fixture. primModule Fixture. undefined Lua. Nil
116
- | usesPrimModule uber
117
- ]
118
- , [Fixture. runtimeLazy | untag needsRuntimeLazy && usesRuntimeLazy uber]
109
+ [ [Fixture. runtimeLazy | untag needsRuntimeLazy && usesRuntimeLazy uber]
119
110
, [Fixture. objectUpdate | UsesObjectUpdate ← [usesObjectUpdate]]
111
+ , [Lua. local1 Fixture. moduleName (Lua. table [] ) | not (null bindings)]
120
112
, toList (DList. snoc bindings returnStat)
121
113
]
122
114
123
115
mkBinding ∷ ModuleName → Lua. Name → Lua. Exp → Lua. Statement
124
116
mkBinding modname name =
125
117
Lua. assign $
126
118
Lua. VarField
127
- (Lua. ann (Lua. var moduleVar ))
119
+ (Lua. ann (Lua. varName Fixture. moduleName ))
128
120
(qualifyName modname name)
129
121
130
- moduleVar ∷ Lua. Var
131
- moduleVar = Lua. VarName [Lua. name |M|]
132
-
133
122
asExpression ∷ Either Lua. Chunk Lua. Exp → Lua. Exp
134
123
asExpression = \ case
135
124
Left chunk → Lua. chunkToExpression chunk
@@ -206,26 +195,29 @@ fromIR foreigns topLevelNames modname ir = case ir of
206
195
Lua. functionCall (Lua. varName Fixture. objectUpdateName) [obj, vals]
207
196
IR. Abs _ann param expr → do
208
197
e ← goExp expr
209
- luaParam ←
210
- Lua. ParamNamed
211
- <$> case param of
212
- IR. ParamUnused _ann → uniqueName " unused"
213
- IR. ParamNamed _ann name → pure (fromName name)
214
- pure . Right $ Lua. functionDef [luaParam] [Lua. return e]
215
- IR. App _ann expr param → do
198
+ let luaParams = case param of
199
+ IR. ParamUnused _ann → []
200
+ IR. ParamNamed _ann name → [ParamNamed (fromName name)]
201
+ pure . Right $ Lua. functionDef luaParams [Lua. return e]
202
+ IR. App _ann expr arg → do
216
203
e ← goExp expr
217
- a ← goExp param
218
- pure . Right $ Lua. functionCall e [a]
204
+ Right . Lua. functionCall e <$> case arg of
205
+ -- PS sometimes inserts syntetic unused argument "Prim.undefined"
206
+ IR. Ref _ann (IR. Imported (IR. ModuleName " Prim" ) (IR. Name " undefined" )) _ →
207
+ pure []
208
+ _ → goExp arg <&> \ a → [a]
219
209
IR. Ref _ann qualifiedName index →
220
210
pure . Right $ case qualifiedName of
221
211
IR. Local name
222
212
| topLevelName ← qualifyName modname (fromName name)
223
213
, Set. member topLevelName topLevelNames →
224
- Lua. varField (Lua. var moduleVar ) topLevelName
214
+ Lua. varField (Lua. varName Fixture. moduleName ) topLevelName
225
215
IR. Local name →
226
216
Lua. varName (fromNameWithIndex name index)
227
217
IR. Imported modname' name →
228
- Lua. varField (Lua. var moduleVar) (qualifyName modname' (fromName name))
218
+ Lua. varField
219
+ (Lua. varName Fixture. moduleName)
220
+ (qualifyName modname' (fromName name))
229
221
IR. Let _ann bindings bodyExp → do
230
222
body ← go bodyExp
231
223
recs ←
@@ -294,11 +286,5 @@ keyCtor = Lua.String "$ctor"
294
286
--------------------------------------------------------------------------------
295
287
-- Helpers ---------------------------------------------------------------------
296
288
297
- uniqueName ∷ MonadState Natural m ⇒ Text → m Lua. Name
298
- uniqueName prefix = do
299
- index ← get
300
- modify' (+ 1 )
301
- pure $ Lua. unsafeName (prefix <> show index)
302
-
303
289
qualifyName ∷ ModuleName → Lua. Name → Lua. Name
304
- qualifyName modname = Fixture. psluaName . Name. join2 (fromModuleName modname)
290
+ qualifyName modname = Name. join2 (fromModuleName modname)
0 commit comments