Merge pull request #1065 from Daniel-Diaz/master

mkYesodGeneral: Assume type arity 0 when type is not in scope at splicing time
This commit is contained in:
Greg Weber 2015-08-23 16:40:34 -07:00
commit 8da4effb03
2 changed files with 21 additions and 16 deletions

View File

@ -9,7 +9,7 @@ module Yesod.Core.Internal.TH where
import Prelude hiding (exp) import Prelude hiding (exp)
import Yesod.Core.Handler import Yesod.Core.Handler
import Language.Haskell.TH import Language.Haskell.TH hiding (cxt)
import Language.Haskell.TH.Syntax import Language.Haskell.TH.Syntax
import qualified Network.Wai as W import qualified Network.Wai as W
@ -76,17 +76,22 @@ mkYesodGeneral :: String -- ^ foundation type
-> Bool -- ^ is this a subsite -> Bool -- ^ is this a subsite
-> [ResourceTree String] -> [ResourceTree String]
-> Q([Dec],[Dec]) -> Q([Dec],[Dec])
mkYesodGeneral name args isSub resS = do mkYesodGeneral namestr args isSub resS = do
info <- reify $ mkName name mname <- lookupTypeName namestr
let arity = arity <- case mname of
case info of Just name -> do
TyConI dec -> info <- reify name
case dec of return $
DataD _ _ vs _ _ -> length vs case info of
NewtypeD _ _ vs _ _ -> length vs TyConI dec ->
_ -> 0 case dec of
_ -> 0 DataD _ _ vs _ _ -> length vs
(mtys,ptys) = partitionEithers args NewtypeD _ _ vs _ _ -> length vs
_ -> 0
_ -> 0
_ -> return 0
let name = mkName namestr
(mtys,_) = partitionEithers args
-- Generate as many variable names as the arity indicates -- Generate as many variable names as the arity indicates
vns <- replicateM (arity - length mtys) $ newName "t" vns <- replicateM (arity - length mtys) $ newName "t"
-- Base type (site type with variables) -- Base type (site type with variables)
@ -103,13 +108,13 @@ mkYesodGeneral name args isSub resS = do
#endif #endif
) ts ++ cs ) ) ts ++ cs )
) ([],vns,[]) args ) ([],vns,[]) args
site = foldl' AppT (ConT $ mkName name) argtypes site = foldl' AppT (ConT name) argtypes
res = map (fmap parseType) resS res = map (fmap parseType) resS
renderRouteDec <- mkRenderRouteInstance site res renderRouteDec <- mkRenderRouteInstance site res
routeAttrsDec <- mkRouteAttrsInstance site res routeAttrsDec <- mkRouteAttrsInstance site res
dispatchDec <- mkDispatchInstance site cxt res dispatchDec <- mkDispatchInstance site cxt res
parse <- mkParseRouteInstance site res parse <- mkParseRouteInstance site res
let rname = mkName $ "resources" ++ name let rname = mkName $ "resources" ++ namestr
eres <- lift resS eres <- lift resS
let resourcesDec = let resourcesDec =
[ SigD rname $ ListT `AppT` (ConT ''ResourceTree `AppT` ConT ''String) [ SigD rname $ ListT `AppT` (ConT ''ResourceTree `AppT` ConT ''String)

View File

@ -24,14 +24,14 @@ import Data.Streaming.Network (bindPortTCP)
import Network.HTTP.Types (status200) import Network.HTTP.Types (status200)
import Blaze.ByteString.Builder (fromByteString) import Blaze.ByteString.Builder (fromByteString)
data App = App
mkYesod "App" [parseRoutes| mkYesod "App" [parseRoutes|
/ HomeR GET / HomeR GET
/wai-stream WaiStreamR GET /wai-stream WaiStreamR GET
/wai-app-stream WaiAppStreamR GET /wai-app-stream WaiAppStreamR GET
|] |]
data App = App
instance Yesod App instance Yesod App
getHomeR :: Handler () getHomeR :: Handler ()