git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Revised fix for code gen for data constructor pattern matches
commit60258959097e51a3374c7b1d84484138d7af3f6f authorGary Burgess <garyb@server.fake> dateThu 30 Jan 2014, 23:51 (13 years ago) parentd59db66
3 files changed+15−6
examples/passing/DataImport.purs+3−3 src/Language/PureScript/CodeGen/JS.hs+3−3 src/Language/PureScript/TypeChecker/Monad.hs+9
examples/passing/DataImport.purs+3−3
@@ -1,13 +1,13 @@
11module M1 where
22
3−data Test = Test String
3+data Test = MkTest String
44
55module Main where
66
77import M1
88
9−unTest (Test s) = s
9+unTest (MkTest s) = s
1010
1111main = do
12− let x = unTest (Test "Done")
12+ let x = unTest (MkTest "Done")
1313 Trace.trace x
src/Language/PureScript/CodeGen/JS.hs+3−3
@@ -41,7 +41,7 @@ import Language.PureScript.Options
4141import Language.PureScript.CodeGen.JS.AST as AST
4242import Language.PureScript.Types
4343import Language.PureScript.CodeGen.Optimize
44−import Language.PureScript.TypeChecker.Monad (canonicalizeType)
44+import Language.PureScript.TypeChecker.Monad (canonicalizeDataConstructor)
4545
4646-- |
4747-- 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) =
199199 then
200200 return done
201201 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]
203203binderToJs m e varName done (UnaryBinder ctor b) = do
204204 value <- fresh
205205 js <- binderToJs m e value done b
@@ -208,7 +208,7 @@ binderToJs m e varName done (UnaryBinder ctor b) = do
208208 then
209209 return [success]
210210 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))))
212212 success
213213 Nothing]
214214binderToJs 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)
210210canonicalizeType mn env (Qualified Nothing nm) = case (mn, nm) `M.lookup` types env of
211211 Just (_, DataAlias mn' pn') -> (mn', pn')
212212 _ -> (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)
213222
214223-- |
215224-- State required for type checking: