git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Revised fix for code gen for data constructor pattern matches
6025895Gary Burgess
examples/passing/DataImport.purs+3−3
@@ -1,13 +1,13 @@
1module M1 where
1module M1 where
2
2
3−data Test = Test String
3+data Test = MkTest String
4
4
5module Main where
5module Main where
6
6
7import M1
7import M1
8
8
9−unTest (Test s) = s
9+unTest (MkTest s) = s
10
10
11main = do
11main = do
12− let x = unTest (Test "Done")
12+ let x = unTest (MkTest "Done")
13 Trace.trace x
13 Trace.trace x
src/Language/PureScript/CodeGen/JS.hs+3−3
@@ -41,7 +41,7 @@ import Language.PureScript.Options
41import Language.PureScript.CodeGen.JS.AST as AST
41import Language.PureScript.CodeGen.JS.AST as AST
42import Language.PureScript.Types
42import Language.PureScript.Types
43import Language.PureScript.CodeGen.Optimize
43import Language.PureScript.CodeGen.Optimize
44−import Language.PureScript.TypeChecker.Monad (canonicalizeType)
44+import Language.PureScript.TypeChecker.Monad (canonicalizeDataConstructor)
45
45
46-- |
46-- |
47-- Generate code in the simplified Javascript intermediate representation for all declarations in a module
47-- Generate code in the simplified Javascript intermediate representation for all declarations in a module
@@ -199,7 +199,7 @@ binderToJs m e varName done (NullaryBinder ctor) =
199 then
199 then
200 return done
200 return done
201 else
201 else
202− return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeType m e ctor)))) (JSBlock done) Nothing]
202+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor)))) (JSBlock done) Nothing]
203binderToJs m e varName done (UnaryBinder ctor b) = do
203binderToJs m e varName done (UnaryBinder ctor b) = do
204 value <- fresh
204 value <- fresh
205 js <- binderToJs m e value done b
205 js <- binderToJs m e value done b
@@ -208,7 +208,7 @@ binderToJs m e varName done (UnaryBinder ctor b) = do
208 then
208 then
209 return [success]
209 return [success]
210 else
210 else
211− return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeType m e ctor))))
211+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor))))
212 success
212 success
213 Nothing]
213 Nothing]
214binderToJs m e varName done (ObjectBinder bs) = go done bs
214binderToJs m e varName done (ObjectBinder bs) = go done bs
src/Language/PureScript/TypeChecker/Monad.hs+9
@@ -210,6 +210,15 @@ canonicalizeType _ _ (Qualified (Just mn) nm) = (mn, nm)
210canonicalizeType mn env (Qualified Nothing nm) = case (mn, nm) `M.lookup` types env of
210canonicalizeType mn env (Qualified Nothing nm) = case (mn, nm) `M.lookup` types env of
211 Just (_, DataAlias mn' pn') -> (mn', pn')
211 Just (_, DataAlias mn' pn') -> (mn', pn')
212 _ -> (mn, nm)
212 _ -> (mn, nm)
213+
214+-- |
215+-- Canonicalize a data constructor by resolving any aliases introduced by module imports
216+--
217+canonicalizeDataConstructor :: ModuleName -> Environment -> Qualified ProperName -> (ModuleName, Ident)
218+canonicalizeDataConstructor _ _ (Qualified (Just mn) i) = (mn, Ident $ show i)
219+canonicalizeDataConstructor mn env (Qualified Nothing i) = case (mn, i) `M.lookup` dataConstructors env of
220+ Just (_, Alias mn' i') -> (mn', i')
221+ _ -> (mn, Ident $ show i)
213
222
214-- |
223-- |
215-- State required for type checking:
224-- State required for type checking: