Retrie/Rewrites/Rules.hs (47 lines of code) (raw):
-- 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 RecordWildCards #-}
module Retrie.Rewrites.Rules (rulesToRewrites) where
import Data.Generics
import Data.Maybe
import Retrie.ExactPrint
import Retrie.GHC
import Retrie.Quantifiers
import Retrie.Types
import Retrie.Util
import Retrie.Monad
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Class
rulesToRewrites
:: [(FastString, Direction)]
-> AnnotatedModule
#if __GLASGOW_HASKELL__ < 900
-> IO (UniqFM [Rewrite (LHsExpr GhcPs)])
#else
-> IO (UniqFM RuleName [Rewrite (LHsExpr GhcPs)])
#endif
rulesToRewrites specs am = fmap astA $ transformA am $ \ m -> do
let
fsMap = uniqBag specs
uniqBag <$> sequence
[ mkRuleRewrite dir info
| info@RuleInfo{..} <- everything (++) (mkQ [] ruleInfo) m
, dir <- fromMaybe [] (lookupUFM fsMap riName)
]
------------------------------------------------------------------------
mkRuleRewrite
:: Direction
-> RuleInfo
-> TransformT IO (RuleName, Rewrite (LHsExpr GhcPs))
mkRuleRewrite RightToLeft (RuleInfo name qs lhs rhs) =
mkRuleRewrite LeftToRight (RuleInfo name qs rhs lhs)
mkRuleRewrite _ RuleInfo{..} = do
p <- pruneA (setEntryDP riLHS (SameLine 1))
t <- pruneA (setEntryDP riRHS (SameLine 1))
-- lift $ debugPrint Loud "mkRuleRewrite" [showAstA p, showAstA t]
return (riName, mkRewrite (mkQs riQuantifiers) p t)