/Retrie/Rewrites/Types.hs

https://github.com/facebookincubator/retrie · Haskell · 65 lines · 48 code · 5 blank · 12 comment · 1 complexity · b15b2684777fd4cc6b6917ef346536cc MD5 · raw file

  1. -- Copyright (c) Facebook, Inc. and its affiliates.
  2. --
  3. -- This source code is licensed under the MIT license found in the
  4. -- LICENSE file in the root directory of this source tree.
  5. --
  6. {-# LANGUAGE CPP #-}
  7. {-# LANGUAGE RankNTypes #-}
  8. {-# LANGUAGE TupleSections #-}
  9. {-# LANGUAGE TypeFamilies #-}
  10. module Retrie.Rewrites.Types where
  11. import Control.Monad
  12. import Data.Maybe
  13. import Retrie.ExactPrint
  14. import Retrie.Expr
  15. import Retrie.GHC
  16. import Retrie.Quantifiers
  17. import Retrie.Types
  18. typeSynonymsToRewrites
  19. :: [(FastString, Direction)]
  20. -> AnnotatedModule
  21. -> IO (UniqFM [Rewrite (LHsType GhcPs)])
  22. typeSynonymsToRewrites specs am = fmap astA $ transformA am $ \ m -> do
  23. let
  24. fsMap = uniqBag specs
  25. tySyns =
  26. [ (rdr, (dir, (nm, hsq_explicit vars, rhs)))
  27. -- only hsq_explicit is available pre-renaming
  28. #if __GLASGOW_HASKELL__ < 806
  29. | L _ (TyClD (SynDecl nm vars _ rhs _)) <- hsmodDecls $ unLoc m
  30. #else
  31. | L _ (TyClD _ (SynDecl _ nm vars _ rhs)) <- hsmodDecls $ unLoc m
  32. #endif
  33. , let rdr = rdrFS (unLoc nm)
  34. , dir <- fromMaybe [] (lookupUFM fsMap rdr)
  35. ]
  36. fmap uniqBag $
  37. forM tySyns $ \(rdr, args) -> (rdr,) <$> uncurry mkTypeRewrite args
  38. ------------------------------------------------------------------------
  39. -- | Compile a list of RULES into a list of rewrites.
  40. mkTypeRewrite
  41. :: Direction
  42. -> (Located RdrName, [LHsTyVarBndr GhcPs], LHsType GhcPs)
  43. -> TransformT IO (Rewrite (LHsType GhcPs))
  44. mkTypeRewrite d (lhsName, vars, rhs) = do
  45. setEntryDPT lhsName $ DP (0,0)
  46. tc <- mkTyVar lhsName
  47. let
  48. lvs = tyBindersToLocatedRdrNames vars
  49. args <- forM lvs $ \ lv -> do
  50. tv <- mkTyVar lv
  51. setEntryDPT tv (DP (0,1))
  52. return tv
  53. lhsApps <- mkHsAppsTy (tc:args)
  54. let
  55. (pat, tmp) = case d of
  56. LeftToRight -> (lhsApps, rhs)
  57. RightToLeft -> (rhs, lhsApps)
  58. p <- pruneA pat
  59. t <- pruneA tmp
  60. return $ mkRewrite (mkQs $ map unLoc lvs) p t