@@ -10,8 +10,8 @@ module Language.PureScript.Backend.Lua
1010import Control.Monad (ap )
1111import Control.Monad.Oops (CouldBe , Variant )
1212import Control.Monad.Oops qualified as Oops
13- import Data.DList (DList )
1413import Data.DList qualified as DList
14+ import Data.List qualified as List
1515import Data.Set qualified as Set
1616import Data.Tagged (Tagged (.. ), untag )
1717import Data.Text qualified as Text
@@ -28,6 +28,7 @@ import Language.PureScript.Backend.Lua.Types (ParamF (..))
2828import Language.PureScript.Backend.Lua.Types qualified as Lua
2929import Language.PureScript.Backend.Types (AppOrModule (.. ))
3030import Language.PureScript.Names (ModuleName , runModuleName )
31+ import Language.PureScript.Names qualified as PS
3132import Path (Abs , Dir , Path , toFilePath )
3233import Prelude hiding (exp , local )
3334
@@ -36,6 +37,7 @@ type LuaM e a = StateT Natural (ExceptT (Variant e) IO) a
3637data Error
3738 = UnexpectedRefBound ModuleName IR. Exp
3839 | LinkerErrorForeign Foreign. Error
40+ | AppEntryPointNotFound ModuleName PS. Ident
3941 deriving stock (Show )
4042
4143fromUberModule
@@ -52,18 +54,28 @@ fromUberModule foreigns needsRuntimeLazy appOrModule uber = (`evalStateT` 0) do
5254 IR. Standalone (IR. QName modname name, irExp) → do
5355 exp ← fromExp foreigns Set. empty modname irExp
5456 pure $ DList. singleton (Lua. local1 (fromQName modname name) exp )
55- IR. RecursiveGroup binds →
56- recBindStatements <$> forM binds \ (IR. QName modname name, irExp) →
57+ IR. RecursiveGroup recGroup → do
58+ recBinds ← forM (toList recGroup) \ (IR. QName modname name, irExp) →
5759 (fromQName modname name,) <$> fromExp foreigns Set. empty modname irExp
60+ let declarations = Lua. local0 . fst <$> DList. fromList recBinds
61+ assignments = DList. fromList do
62+ recBinds <&> \ (name, exp ) → Lua. assign (Lua. VarName name) exp
63+ pure $ declarations <> assignments
5864
5965 returnExp ←
6066 case appOrModule of
6167 AsModule modname →
6268 Lua. table <$> do
6369 forM (uberModuleExports uber) \ (fromName → name, expr) →
6470 Lua. tableRowNV name <$> fromExp foreigns mempty modname expr
65- AsApplication modname (IR. identToName → name) →
66- pure $ Lua. functionCall (Lua. varName (fromQName modname name)) []
71+ AsApplication modname ident → do
72+ case List. lookup name (uberModuleExports uber) of
73+ Just expr → do
74+ entry ← fromExp foreigns mempty modname expr
75+ pure $ Lua. functionCall entry []
76+ _ → Oops. throw $ AppEntryPointNotFound modname ident
77+ where
78+ name = IR. identToName ident
6779
6880 pure . mconcat $
6981 [ if usesPrimModule uber then [Fixture. prim] else empty
@@ -202,14 +214,6 @@ fromExp foreigns topLevelNames modname ir = case ir of
202214keyCtor ∷ Lua. Exp
203215keyCtor = Lua. String " $ctor"
204216
205- recBindStatements ∷ NonEmpty (Lua. Name , Lua. Exp ) → DList Lua. Statement
206- recBindStatements (toList → binds) = fmap Lua. local0 names <> assigns
207- where
208- names ∷ DList Lua. Name =
209- DList. fromList (fst <$> binds)
210- assigns ∷ DList Lua. Statement =
211- DList. fromList (binds <&> \ (name, exp ) → Lua. assign (Lua. VarName name) exp )
212-
213217fromIfThenElse ∷ Lua. Exp → Lua. Exp → Lua. Exp → Lua. Exp
214218fromIfThenElse cond thenExp elseExp = Lua. functionCall fun []
215219 where
0 commit comments