aboutsummaryrefslogtreecommitdiff
path: root/standalone/android/haskell-patches/yesod-routes_1.1.2_0001-remove-TH-and-export-module-used-by-TH-splices.patch
blob: 33bcff44779532a05340d42bacf45f9d4f62d5e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
From 06176b0f3dbbe559490f0971e0db205287793286 Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kitenet.net>
Date: Mon, 15 Apr 2013 21:01:12 -0400
Subject: [PATCH] remove TH and export module used by TH splices

---
 Yesod/Routes/Overlap.hs     |  74 ----------
 Yesod/Routes/Parse.hs       | 115 ---------------
 Yesod/Routes/TH.hs          |  12 --
 Yesod/Routes/TH/Dispatch.hs | 344 --------------------------------------------
 Yesod/Routes/TH/Types.hs    |  16 ---
 yesod-routes.cabal          |  21 ---
 6 files changed, 582 deletions(-)
 delete mode 100644 Yesod/Routes/Overlap.hs
 delete mode 100644 Yesod/Routes/Parse.hs
 delete mode 100644 Yesod/Routes/TH.hs
 delete mode 100644 Yesod/Routes/TH/Dispatch.hs

diff --git a/Yesod/Routes/Overlap.hs b/Yesod/Routes/Overlap.hs
deleted file mode 100644
index ae45a02..0000000
--- a/Yesod/Routes/Overlap.hs
+++ /dev/null
@@ -1,74 +0,0 @@
--- | Check for overlapping routes.
-module Yesod.Routes.Overlap
-    ( findOverlaps
-    , findOverlapNames
-    , Overlap (..)
-    ) where
-
-import Yesod.Routes.TH.Types
-import Data.List (intercalate)
-
-data Overlap t = Overlap
-    { overlapParents :: [String] -> [String] -- ^ parent resource trees
-    , overlap1 :: ResourceTree t
-    , overlap2 :: ResourceTree t
-    }
-
-findOverlaps :: ([String] -> [String]) -> [ResourceTree t] -> [Overlap t]
-findOverlaps _ [] = []
-findOverlaps front (x:xs) = concatMap (findOverlap front x) xs ++ findOverlaps front xs
-
-findOverlap :: ([String] -> [String]) -> ResourceTree t -> ResourceTree t -> [Overlap t]
-findOverlap front x y =
-    here rest
-  where
-    here
-        | overlaps (resourceTreePieces x) (resourceTreePieces y) (hasSuffix x) (hasSuffix y) = (Overlap front x y:)
-        | otherwise = id
-    rest =
-        case x of
-            ResourceParent name _ children -> findOverlaps (front . (name:)) children
-            ResourceLeaf{} -> []
-
-hasSuffix :: ResourceTree t -> Bool
-hasSuffix (ResourceLeaf r) =
-    case resourceDispatch r of
-        Subsite{} -> True
-        Methods Just{} _ -> True
-        Methods Nothing _ -> False
-hasSuffix ResourceParent{} = True
-
-overlaps :: [(CheckOverlap, Piece t)] -> [(CheckOverlap, Piece t)] -> Bool -> Bool -> Bool
-
--- No pieces on either side, will overlap regardless of suffix
-overlaps [] [] _ _ = True
-
--- No pieces on the left, will overlap if the left side has a suffix
-overlaps [] _ suffixX _ = suffixX
-
--- Ditto for the right
-overlaps _ [] _ suffixY = suffixY
-
--- As soon as we ignore a single piece (via CheckOverlap == False), we say that
--- the routes don't overlap at all. In other words, disabling overlap checking
--- on a single piece disables it on the whole route.
-overlaps ((False, _):_) _ _ _ = False
-overlaps _ ((False, _):_) _ _ = False
-
--- Compare the actual pieces
-overlaps ((True, pieceX):xs) ((True, pieceY):ys) suffixX suffixY =
-    piecesOverlap pieceX pieceY && overlaps xs ys suffixX suffixY
-
-piecesOverlap :: Piece t -> Piece t -> Bool
--- Statics only match if they equal. Dynamics match with anything
-piecesOverlap (Static x) (Static y) = x == y
-piecesOverlap _ _ = True
-
-findOverlapNames :: [ResourceTree t] -> [(String, String)]
-findOverlapNames =
-    map go . findOverlaps id
-  where
-    go (Overlap front x y) =
-        (go' $ resourceTreeName x, go' $ resourceTreeName y)
-      where
-        go' = intercalate "/" . front . return
diff --git a/Yesod/Routes/Parse.hs b/Yesod/Routes/Parse.hs
deleted file mode 100644
index fc16eef..0000000
--- a/Yesod/Routes/Parse.hs
+++ /dev/null
@@ -1,115 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# OPTIONS_GHC -fno-warn-missing-fields #-} -- QuasiQuoter
-module Yesod.Routes.Parse
-    ( parseRoutes
-    , parseRoutesFile
-    , parseRoutesNoCheck
-    , parseRoutesFileNoCheck
-    , parseType
-    ) where
-
-import Language.Haskell.TH.Syntax
-import Data.Char (isUpper)
-import Language.Haskell.TH.Quote
-import qualified System.IO as SIO
-import Yesod.Routes.TH
-import Yesod.Routes.Overlap (findOverlapNames)
-
--- | A quasi-quoter to parse a string into a list of 'Resource's. Checks for
--- overlapping routes, failing if present; use 'parseRoutesNoCheck' to skip the
--- checking. See documentation site for details on syntax.
-parseRoutes :: QuasiQuoter
-parseRoutes = QuasiQuoter { quoteExp = x }
-  where
-    x s = do
-        let res = resourcesFromString s
-        case findOverlapNames res of
-            [] -> lift res
-            z -> error $ "Overlapping routes: " ++ unlines (map show z)
-
-parseRoutesFile :: FilePath -> Q Exp
-parseRoutesFile = parseRoutesFileWith parseRoutes
-
-parseRoutesFileNoCheck :: FilePath -> Q Exp
-parseRoutesFileNoCheck = parseRoutesFileWith parseRoutesNoCheck
-
-parseRoutesFileWith :: QuasiQuoter -> FilePath -> Q Exp
-parseRoutesFileWith qq fp = do
-    s <- qRunIO $ readUtf8File fp
-    quoteExp qq s
-
-readUtf8File :: FilePath -> IO String
-readUtf8File fp = do
-    h <- SIO.openFile fp SIO.ReadMode
-    SIO.hSetEncoding h SIO.utf8_bom
-    SIO.hGetContents h
-
--- | Same as 'parseRoutes', but performs no overlap checking.
-parseRoutesNoCheck :: QuasiQuoter
-parseRoutesNoCheck = QuasiQuoter
-    { quoteExp = lift . resourcesFromString
-    }
-
--- | Convert a multi-line string to a set of resources. See documentation for
--- the format of this string. This is a partial function which calls 'error' on
--- invalid input.
-resourcesFromString :: String -> [ResourceTree String]
-resourcesFromString =
-    fst . parse 0 . lines
-  where
-    parse _ [] = ([], [])
-    parse indent (thisLine:otherLines)
-        | length spaces < indent = ([], thisLine : otherLines)
-        | otherwise = (this others, remainder)
-      where
-        spaces = takeWhile (== ' ') thisLine
-        (others, remainder) = parse indent otherLines'
-        (this, otherLines') =
-            case takeWhile (/= "--") $ words thisLine of
-                [pattern, constr] | last constr == ':' ->
-                    let (children, otherLines'') = parse (length spaces + 1) otherLines
-                        (pieces, Nothing) = piecesFromString $ drop1Slash pattern
-                     in ((ResourceParent (init constr) pieces children :), otherLines'')
-                (pattern:constr:rest) ->
-                    let (pieces, mmulti) = piecesFromString $ drop1Slash pattern
-                        disp = dispatchFromString rest mmulti
-                     in ((ResourceLeaf (Resource constr pieces disp):), otherLines)
-                [] -> (id, otherLines)
-                _ -> error $ "Invalid resource line: " ++ thisLine
-
-dispatchFromString :: [String] -> Maybe String -> Dispatch String
-dispatchFromString rest mmulti
-    | null rest = Methods mmulti []
-    | all (all isUpper) rest = Methods mmulti rest
-dispatchFromString [subTyp, subFun] Nothing =
-    Subsite subTyp subFun
-dispatchFromString [_, _] Just{} =
-    error "Subsites cannot have a multipiece"
-dispatchFromString rest _ = error $ "Invalid list of methods: " ++ show rest
-
-drop1Slash :: String -> String
-drop1Slash ('/':x) = x
-drop1Slash x = x
-
-piecesFromString :: String -> ([(CheckOverlap, Piece String)], Maybe String)
-piecesFromString "" = ([], Nothing)
-piecesFromString x =
-    case (this, rest) of
-        (Left typ, ([], Nothing)) -> ([], Just typ)
-        (Left _, _) -> error "Multipiece must be last piece"
-        (Right piece, (pieces, mtyp)) -> (piece:pieces, mtyp)
-  where
-    (y, z) = break (== '/') x
-    this = pieceFromString y
-    rest = piecesFromString $ drop 1 z
-
-parseType :: String -> Type
-parseType = ConT . mkName -- FIXME handle more complicated stuff
-
-pieceFromString :: String -> Either String (CheckOverlap, Piece String)
-pieceFromString ('#':'!':x) = Right $ (False, Dynamic x)
-pieceFromString ('#':x) = Right $ (True, Dynamic x)
-pieceFromString ('*':x) = Left x
-pieceFromString ('!':x) = Right $ (False, Static x)
-pieceFromString x = Right $ (True, Static x)
diff --git a/Yesod/Routes/TH.hs b/Yesod/Routes/TH.hs
deleted file mode 100644
index 41045b3..0000000
--- a/Yesod/Routes/TH.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-module Yesod.Routes.TH
-    ( module Yesod.Routes.TH.Types
-      -- * Functions
-    , module Yesod.Routes.TH.RenderRoute
-      -- ** Dispatch
-    , module Yesod.Routes.TH.Dispatch
-    ) where
-
-import Yesod.Routes.TH.Types
-import Yesod.Routes.TH.RenderRoute
-import Yesod.Routes.TH.Dispatch
diff --git a/Yesod/Routes/TH/Dispatch.hs b/Yesod/Routes/TH/Dispatch.hs
deleted file mode 100644
index a52f69a..0000000
--- a/Yesod/Routes/TH/Dispatch.hs
+++ /dev/null
@@ -1,344 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-module Yesod.Routes.TH.Dispatch
-    ( -- ** Dispatch
-      mkDispatchClause
-    ) where
-
-import Prelude hiding (exp)
-import Yesod.Routes.TH.Types
-import Language.Haskell.TH.Syntax
-import Data.Maybe (catMaybes)
-import Control.Monad (forM, replicateM)
-import Data.Text (pack)
-import qualified Yesod.Routes.Dispatch as D
-import qualified Data.Map as Map
-import Data.Char (toLower)
-import Web.PathPieces (PathPiece (..), PathMultiPiece (..))
-import Control.Applicative ((<$>))
-import Data.List (foldl')
-
-data FlatResource a = FlatResource [(String, [(CheckOverlap, Piece a)])] String [(CheckOverlap, Piece a)] (Dispatch a)
-
-flatten :: [ResourceTree a] -> [FlatResource a]
-flatten =
-    concatMap (go id)
-  where
-    go front (ResourceLeaf (Resource a b c)) = [FlatResource (front []) a b c]
-    go front (ResourceParent name pieces children) =
-        concatMap (go (front . ((name, pieces):))) children
-
--- |
---
--- This function will generate a single clause that will address all
--- your routing needs. It takes four arguments. The fourth (a list of
--- 'Resource's) is self-explanatory. We\'ll discuss the first
--- three. But first, let\'s cover the terminology.
---
--- Dispatching involves a master type and a sub type. When you dispatch to the
--- top level type, master and sub are the same. Each time to dispatch to
--- another subsite, the sub changes. This requires two changes:
---
--- * Getting the new sub value. This is handled via 'subsiteFunc'.
---
--- * Figure out a way to convert sub routes to the original master route. To
--- address this, we keep a toMaster function, and each time we dispatch to a
--- new subsite, we compose it with the constructor for that subsite.
---
--- Dispatching acts on two different components: the request method and a list
--- of path pieces. If we cannot match the path pieces, we need to return a 404
--- response. If the path pieces match, but the method is not supported, we need
--- to return a 405 response.
---
--- The final result of dispatch is going to be an application type. A simple
--- example would be the WAI Application type. However, our handler functions
--- will need more input: the master/subsite, the toMaster function, and the
--- type-safe route. Therefore, we need to have another type, the handler type,
--- and a function that turns a handler into an application, i.e.
---
--- > runHandler :: handler sub master -> master -> sub -> Route sub -> (Route sub -> Route master) -> app
---
--- This is the first argument to our function. Note that this will almost
--- certainly need to be a method of a typeclass, since it will want to behave
--- differently based on the subsite.
---
--- Note that the 404 response passed in is an application, while the 405
--- response is a handler, since the former can\'t be passed the type-safe
--- route.
---
--- In the case of a subsite, we don\'t directly deal with a handler function.
--- Instead, we redispatch to the subsite, passing on the updated sub value and
--- toMaster function, as well as any remaining, unparsed path pieces. This
--- function looks like:
---
--- > dispatcher :: master -> sub -> (Route sub -> Route master) -> app -> handler sub master -> Text -> [Text] -> app
---
--- Where the parameters mean master, sub, toMaster, 404 response, 405 response,
--- request method and path pieces. This is the second argument of our function.
---
--- Finally, we need a way to decide which of the possible formats
--- should the handler send the data out. Think of each URL holding an
--- abstract object which has multiple representation (JSON, plain HTML
--- etc). Each client might have a preference on which format it wants
--- the abstract object in. For example, a javascript making a request
--- (on behalf of a browser) might prefer a JSON object over a plain
--- HTML file where as a user browsing with javascript disabled would
--- want the page in HTML. The third argument is a function that
--- converts the abstract object to the desired representation
--- depending on the preferences sent by the client.
---
--- The typical values for the first three arguments are,
--- @'yesodRunner'@ for the first, @'yesodDispatch'@ for the second and
--- @fmap 'chooseRep'@.
-
-mkDispatchClause :: Q Exp -- ^ runHandler function
-                 -> Q Exp -- ^ dispatcher function
-                 -> Q Exp -- ^ fixHandler function
-                 -> [ResourceTree a]
-                 -> Q Clause
-mkDispatchClause runHandler dispatcher fixHandler ress' = do
-    -- Allocate the names to be used. Start off with the names passed to the
-    -- function itself (with a 0 suffix).
-    --
-    -- We don't reuse names so as to avoid shadowing names (triggers warnings
-    -- with -Wall). Additionally, we want to ensure that none of the code
-    -- passed to toDispatch uses variables from the closure to prevent the
-    -- dispatch data structure from being rebuilt on each run.
-    master0 <- newName "master0"
-    sub0 <- newName "sub0"
-    toMaster0 <- newName "toMaster0"
-    app4040 <- newName "app4040"
-    handler4050 <- newName "handler4050"
-    method0 <- newName "method0"
-    pieces0 <- newName "pieces0"
-
-    -- Name of the dispatch function
-    dispatch <- newName "dispatch"
-
-    -- Dispatch function applied to the pieces
-    let dispatched = VarE dispatch `AppE` VarE pieces0
-
-    -- The 'D.Route's used in the dispatch function
-    routes <- mapM (buildRoute runHandler dispatcher fixHandler) ress
-
-    -- The dispatch function itself
-    toDispatch <- [|D.toDispatch|]
-    let dispatchFun = FunD dispatch [Clause [] (NormalB $ toDispatch `AppE` ListE routes) []]
-
-    -- The input to the clause.
-    let pats = map VarP [master0, sub0, toMaster0, app4040, handler4050, method0, pieces0]
-
-    -- For each resource that dispatches based on methods, build up a map for handling the dispatching.
-    methodMaps <- catMaybes <$> mapM (buildMethodMap fixHandler) ress
-
-    u <- [|case $(return dispatched) of
-            Just f -> f $(return $ VarE master0)
-                        $(return $ VarE sub0)
-                        $(return $ VarE toMaster0)
-                        $(return $ VarE app4040)
-                        $(return $ VarE handler4050)
-                        $(return $ VarE method0)
-            Nothing -> $(return $ VarE app4040)
-          |]
-    return $ Clause pats (NormalB u) $ dispatchFun : methodMaps
-  where
-    ress = flatten ress'
-
--- | Determine the name of the method map for a given resource name.
-methodMapName :: String -> Name
-methodMapName s = mkName $ "methods" ++ s
-
-buildMethodMap :: Q Exp -- ^ fixHandler
-               -> FlatResource a
-               -> Q (Maybe Dec)
-buildMethodMap _ (FlatResource _ _ _ (Methods _ [])) = return Nothing -- single handle function
-buildMethodMap fixHandler (FlatResource parents name pieces' (Methods mmulti methods)) = do
-    fromList <- [|Map.fromList|]
-    methods' <- mapM go methods
-    let exp = fromList `AppE` ListE methods'
-    let fun = FunD (methodMapName name) [Clause [] (NormalB exp) []]
-    return $ Just fun
-  where
-    pieces = concat $ map snd parents ++ [pieces']
-    go method = do
-        fh <- fixHandler
-        let func = VarE $ mkName $ map toLower method ++ name
-        pack' <- [|pack|]
-        let isDynamic Dynamic{} = True
-            isDynamic _ = False
-        let argCount = length (filter (isDynamic . snd) pieces) + maybe 0 (const 1) mmulti
-        xs <- replicateM argCount $ newName "arg"
-        let rhs = LamE (map VarP xs) $ fh `AppE` (foldl' AppE func $ map VarE xs)
-        return $ TupE [pack' `AppE` LitE (StringL method), rhs]
-buildMethodMap _ (FlatResource _ _ _ Subsite{}) = return Nothing
-
--- | Build a single 'D.Route' expression.
-buildRoute :: Q Exp -> Q Exp -> Q Exp -> FlatResource a -> Q Exp
-buildRoute runHandler dispatcher fixHandler (FlatResource parents name resPieces resDisp) = do
-    -- First two arguments to D.Route
-    routePieces <- ListE <$> mapM (convertPiece . snd) allPieces
-    isMulti <-
-        case resDisp of
-            Methods Nothing _ -> [|False|]
-            _ -> [|True|]
-
-    [|D.Route $(return routePieces) $(return isMulti) $(routeArg3 runHandler dispatcher fixHandler parents name (map snd allPieces) resDisp)|]
-  where
-    allPieces = concat $ map snd parents ++ [resPieces]
-
-routeArg3 :: Q Exp -- ^ runHandler
-          -> Q Exp -- ^ dispatcher
-          -> Q Exp -- ^ fixHandler
-          -> [(String, [(CheckOverlap, Piece a)])]
-          -> String -- ^ name of resource
-          -> [Piece a]
-          -> Dispatch a
-          -> Q Exp
-routeArg3 runHandler dispatcher fixHandler parents name resPieces resDisp = do
-    pieces <- newName "pieces"
-
-    -- Allocate input piece variables (xs) and variables that have been
-    -- converted via fromPathPiece (ys)
-    xs <- forM resPieces $ \piece ->
-        case piece of
-            Static _ -> return Nothing
-            Dynamic _ -> Just <$> newName "x"
-
-    -- Note: the zipping with Ints is just a workaround for (apparently) a bug
-    -- in GHC where the identifiers are considered to be overlapping. Using
-    -- newName should avoid the problem, but it doesn't.
-    ys <- forM (zip (catMaybes xs) [1..]) $ \(x, i) -> do
-        y <- newName $ "y" ++ show (i :: Int)
-        return (x, y)
-
-    -- In case we have multi pieces at the end
-    xrest <- newName "xrest"
-    yrest <- newName "yrest"
-
-    -- Determine the pattern for matching the pieces
-    pat <-
-        case resDisp of
-            Methods Nothing _ -> return $ ListP $ map (maybe WildP VarP) xs
-            _ -> do
-                let cons = mkName ":"
-                return $ foldr (\a b -> ConP cons [maybe WildP VarP a, b]) (VarP xrest) xs
-
-    -- Convert the xs
-    fromPathPiece' <- [|fromPathPiece|]
-    xstmts <- forM ys $ \(x, y) -> return $ BindS (VarP y) (fromPathPiece' `AppE` VarE x)
-
-    -- Convert the xrest if appropriate
-    (reststmts, yrest') <-
-        case resDisp of
-            Methods (Just _) _ -> do
-                fromPathMultiPiece' <- [|fromPathMultiPiece|]
-                return ([BindS (VarP yrest) (fromPathMultiPiece' `AppE` VarE xrest)], [yrest])
-            _ -> return ([], [])
-
-    -- The final expression that actually uses the values we've computed
-    caller <- buildCaller runHandler dispatcher fixHandler xrest parents name resDisp $ map snd ys ++ yrest'
-
-    -- Put together all the statements
-    just <- [|Just|]
-    let stmts = concat
-            [ xstmts
-            , reststmts
-            , [NoBindS $ just `AppE` caller]
-            ]
-
-    errorMsg <- [|error "Invariant violated"|]
-    let matches =
-            [ Match pat (NormalB $ DoE stmts) []
-            , Match WildP (NormalB errorMsg) []
-            ]
-
-    return $ LamE [VarP pieces] $ CaseE (VarE pieces) matches
-
--- | The final expression in the individual Route definitions.
-buildCaller :: Q Exp -- ^ runHandler
-            -> Q Exp -- ^ dispatcher
-            -> Q Exp -- ^ fixHandler
-            -> Name -- ^ xrest
-            -> [(String, [(CheckOverlap, Piece a)])]
-            -> String -- ^ name of resource
-            -> Dispatch a
-            -> [Name] -- ^ ys
-            -> Q Exp
-buildCaller runHandler dispatcher fixHandler xrest parents name resDisp ys = do
-    master <- newName "master"
-    sub <- newName "sub"
-    toMaster <- newName "toMaster"
-    app404 <- newName "_app404"
-    handler405 <- newName "_handler405"
-    method <- newName "_method"
-
-    let pat = map VarP [master, sub, toMaster, app404, handler405, method]
-
-    -- Create the route
-    let route = routeFromDynamics parents name ys
-
-    exp <-
-        case resDisp of
-            Methods _ ms -> do
-                handler <- newName "handler"
-
-                -- Run the whole thing
-                runner <- [|$(runHandler)
-                                $(return $ VarE handler)
-                                $(return $ VarE master)
-                                $(return $ VarE sub)
-                                (Just $(return route))
-                                $(return $ VarE toMaster)|]
-
-                let myLet handlerExp =
-                        LetE [FunD handler [Clause [] (NormalB handlerExp) []]] runner
-
-                if null ms
-                    then do
-                        -- Just a single handler
-                        fh <- fixHandler
-                        let he = fh `AppE` foldl' (\a b -> a `AppE` VarE b) (VarE $ mkName $ "handle" ++ name) ys
-                        return $ myLet he
-                    else do
-                        -- Individual methods
-                        mf <- [|Map.lookup $(return $ VarE method) $(return $ VarE $ methodMapName name)|]
-                        f <- newName "f"
-                        let apply = foldl' (\a b -> a `AppE` VarE b) (VarE f) ys
-                        let body405 =
-                                VarE handler405
-                                `AppE` route
-                        return $ CaseE mf
-                            [ Match (ConP 'Just [VarP f]) (NormalB $ myLet apply) []
-                            , Match (ConP 'Nothing []) (NormalB body405) []
-                            ]
-
-            Subsite _ getSub -> do
-                let sub2 = foldl' (\a b -> a `AppE` VarE b) (VarE (mkName getSub) `AppE` VarE sub) ys
-                [|$(dispatcher)
-                    $(return $ VarE master)
-                    $(return sub2)
-                    ($(return $ VarE toMaster) . $(return route))
-                    $(return $ VarE app404)
-                    ($(return $ VarE handler405) . $(return route))
-                    $(return $ VarE method)
-                    $(return $ VarE xrest)
-                 |]
-
-    return $ LamE pat exp
-
--- | Convert a 'Piece' to a 'D.Piece'
-convertPiece :: Piece a -> Q Exp
-convertPiece (Static s) = [|D.Static (pack $(lift s))|]
-convertPiece (Dynamic _) = [|D.Dynamic|]
-
-routeFromDynamics :: [(String, [(CheckOverlap, Piece a)])] -- ^ parents
-                  -> String -- ^ constructor name
-                  -> [Name]
-                  -> Exp
-routeFromDynamics [] name ys = foldl' (\a b -> a `AppE` VarE b) (ConE $ mkName name) ys
-routeFromDynamics ((parent, pieces):rest) name ys =
-    foldl' (\a b -> a `AppE` b) (ConE $ mkName parent) here
-  where
-    (here', ys') = splitAt (length $ filter (isDynamic . snd) pieces) ys
-    isDynamic Dynamic{} = True
-    isDynamic _ = False
-    here = map VarE here' ++ [routeFromDynamics rest name ys']
diff --git a/Yesod/Routes/TH/Types.hs b/Yesod/Routes/TH/Types.hs
index 52cd446..18208d3 100644
--- a/Yesod/Routes/TH/Types.hs
+++ b/Yesod/Routes/TH/Types.hs
@@ -29,10 +29,6 @@ instance Functor ResourceTree where
     fmap f (ResourceLeaf r) = ResourceLeaf (fmap f r)
     fmap f (ResourceParent a b c) = ResourceParent a (map (second $ fmap f) b) $ map (fmap f) c
 
-instance Lift t => Lift (ResourceTree t) where
-    lift (ResourceLeaf r) = [|ResourceLeaf $(lift r)|]
-    lift (ResourceParent a b c) = [|ResourceParent $(lift a) $(lift b) $(lift c)|]
-
 data Resource typ = Resource
     { resourceName :: String
     , resourcePieces :: [(CheckOverlap, Piece typ)]
@@ -45,9 +41,6 @@ type CheckOverlap = Bool
 instance Functor Resource where
     fmap f (Resource a b c) = Resource a (map (second $ fmap f) b) (fmap f c)
 
-instance Lift t => Lift (Resource t) where
-    lift (Resource a b c) = [|Resource $(lift a) $(lift b) $(lift c)|]
-
 data Piece typ = Static String | Dynamic typ
     deriving Show
 
@@ -55,10 +48,6 @@ instance Functor Piece where
     fmap _ (Static s) = (Static s)
     fmap f (Dynamic t) = Dynamic (f t)
 
-instance Lift t => Lift (Piece t) where
-    lift (Static s) = [|Static $(lift s)|]
-    lift (Dynamic t) = [|Dynamic $(lift t)|]
-
 data Dispatch typ =
     Methods
         { methodsMulti :: Maybe typ -- ^ type of the multi piece at the end
@@ -74,11 +63,6 @@ instance Functor Dispatch where
     fmap f (Methods a b) = Methods (fmap f a) b
     fmap f (Subsite a b) = Subsite (f a) b
 
-instance Lift t => Lift (Dispatch t) where
-    lift (Methods Nothing b) = [|Methods Nothing $(lift b)|]
-    lift (Methods (Just t) b) = [|Methods (Just $(lift t)) $(lift b)|]
-    lift (Subsite t b) = [|Subsite $(lift t) $(lift b)|]
-
 resourceMulti :: Resource typ -> Maybe typ
 resourceMulti Resource { resourceDispatch = Methods (Just t) _ } = Just t
 resourceMulti _ = Nothing
diff --git a/yesod-routes.cabal b/yesod-routes.cabal
index eb367b3..dc6a12c 100644
--- a/yesod-routes.cabal
+++ b/yesod-routes.cabal
@@ -23,31 +23,10 @@ library
                    , path-pieces               >= 0.1      && < 0.2
 
     exposed-modules: Yesod.Routes.Dispatch
-                     Yesod.Routes.TH
                      Yesod.Routes.Class
-                     Yesod.Routes.Parse
-                     Yesod.Routes.Overlap
-    other-modules:   Yesod.Routes.TH.Dispatch
-                     Yesod.Routes.TH.RenderRoute
                      Yesod.Routes.TH.Types
     ghc-options:     -Wall
 
-test-suite runtests
-    type: exitcode-stdio-1.0
-    main-is: main.hs
-    hs-source-dirs: test
-    other-modules: Hierarchy
-
-    build-depends: base                      >= 4.3      && < 5
-                 , yesod-routes
-                 , text                      >= 0.5      && < 0.12
-                 , HUnit                     >= 1.2      && < 1.3
-                 , hspec                     >= 1.3
-                 , containers
-                 , template-haskell
-                 , path-pieces
-    ghc-options:     -Wall
-
 source-repository head
   type:     git
   location: https://github.com/yesodweb/yesod
-- 
1.8.2.rc3