descript-lang-0.2.0.0: src/Descript/BasicInj/Process/Refactor/RenameRecord.hs
{-# LANGUAGE TypeFamilies #-}
module Descript.BasicInj.Process.Refactor.RenameRecord
( renameRecord
, renameRecord'
) where
import Descript.BasicInj.Process.Refactor.GenRenameSymbol
import qualified Descript.BasicInj.Traverse.Term as T
import Descript.BasicInj.Traverse
import Descript.BasicInj.Data
import Descript.Misc
import Data.Functor.Identity
import Control.Monad.Trans.Writer.Strict
newtype RenameRecord = RenameRecord (GenRenameSymbol FSymbol)
instance Traversal RenameRecord where
type Eff RenameRecord = ResultT RefactorError (WriterT [RefactorWarning] Identity)
type TAnn RenameRecord = SrcAnn
tonTerm T.RecordHead (RenameRecord rsym) sym = renameSymbol rsym sym
tonTerm _ _ x = pure x
-- | Replaces every occurrence of the first record head with the second.
renameRecord :: String -> String -> RefactorFunc Source
renameRecord old new src = renameRecord' T.Source (mkFSymbol old) (mkFSymbol new) src
where mkFSymbol = FSymbol (sourceScope src) . Symbol ()
-- | Replaces every occurrence of the first record head with the second.
renameRecord' :: TTerm t -> FSymbol () -> FSymbol () -> RefactorFunc t
renameRecord' term old new = travTerm term $ RenameRecord $ GenRenameSymbol old new