/Retrie/Rewrites/Types.hs
https://github.com/facebookincubator/retrie · Haskell · 65 lines · 48 code · 5 blank · 12 comment · 1 complexity · b15b2684777fd4cc6b6917ef346536cc MD5 · raw file
- -- Copyright (c) Facebook, Inc. and its affiliates.
- --
- -- This source code is licensed under the MIT license found in the
- -- LICENSE file in the root directory of this source tree.
- --
- {-# LANGUAGE CPP #-}
- {-# LANGUAGE RankNTypes #-}
- {-# LANGUAGE TupleSections #-}
- {-# LANGUAGE TypeFamilies #-}
- module Retrie.Rewrites.Types where
- import Control.Monad
- import Data.Maybe
- import Retrie.ExactPrint
- import Retrie.Expr
- import Retrie.GHC
- import Retrie.Quantifiers
- import Retrie.Types
- typeSynonymsToRewrites
- :: [(FastString, Direction)]
- -> AnnotatedModule
- -> IO (UniqFM [Rewrite (LHsType GhcPs)])
- typeSynonymsToRewrites specs am = fmap astA $ transformA am $ \ m -> do
- let
- fsMap = uniqBag specs
- tySyns =
- [ (rdr, (dir, (nm, hsq_explicit vars, rhs)))
- -- only hsq_explicit is available pre-renaming
- #if __GLASGOW_HASKELL__ < 806
- | L _ (TyClD (SynDecl nm vars _ rhs _)) <- hsmodDecls $ unLoc m
- #else
- | L _ (TyClD _ (SynDecl _ nm vars _ rhs)) <- hsmodDecls $ unLoc m
- #endif
- , let rdr = rdrFS (unLoc nm)
- , dir <- fromMaybe [] (lookupUFM fsMap rdr)
- ]
- fmap uniqBag $
- forM tySyns $ \(rdr, args) -> (rdr,) <$> uncurry mkTypeRewrite args
- ------------------------------------------------------------------------
- -- | Compile a list of RULES into a list of rewrites.
- mkTypeRewrite
- :: Direction
- -> (Located RdrName, [LHsTyVarBndr GhcPs], LHsType GhcPs)
- -> TransformT IO (Rewrite (LHsType GhcPs))
- mkTypeRewrite d (lhsName, vars, rhs) = do
- setEntryDPT lhsName $ DP (0,0)
- tc <- mkTyVar lhsName
- let
- lvs = tyBindersToLocatedRdrNames vars
- args <- forM lvs $ \ lv -> do
- tv <- mkTyVar lv
- setEntryDPT tv (DP (0,1))
- return tv
- lhsApps <- mkHsAppsTy (tc:args)
- let
- (pat, tmp) = case d of
- LeftToRight -> (lhsApps, rhs)
- RightToLeft -> (rhs, lhsApps)
- p <- pruneA pat
- t <- pruneA tmp
- return $ mkRewrite (mkQs $ map unLoc lvs) p t