packages feed

descript-lang-0.2.0.0: src/Descript/BasicInj/Process/Refactor/RenameSymbol.hs

{-# LANGUAGE TypeFamilies #-}

module Descript.BasicInj.Process.Refactor.RenameSymbol
  ( renameSymbolAt
  ) where

import Descript.BasicInj.Process.Refactor.RenameModuleElem
import Descript.BasicInj.Process.Refactor.RenameRecord
import Descript.BasicInj.Process.Refactor.RenameProp
import Descript.BasicInj.Process.Inspect
import qualified Descript.BasicInj.Traverse.Term as T
import Descript.BasicInj.Traverse
import Descript.BasicInj.Data
import Descript.Misc

-- | Replaces every occurrence of the symbol at the given location.
-- Fails if there's no symbol at the location.
renameSymbolAt :: Loc -> String -> RefactorFunc Source
renameSymbolAt oldLoc new = renameSymbolAt' T.Source oldLoc $ Symbol () new

-- | Replaces every occurrence of the symbol at the given location.
-- Fails if there's no symbol at the location.
renameSymbolAt' :: TTerm t -> Loc -> Symbol () -> RefactorFunc t
renameSymbolAt' term oldLoc new src
  = case symbolAt' term oldLoc src of
         Nothing -> mkFailureT RefactorNoSymbolAtLoc
         Just oldEnv -> renameSymbolInEnv' term oldEnv_ new src
           where oldEnv_ = remAnns oldEnv

-- | Replaces every occurrence of the first symbol in the same
-- environment with the second.
renameSymbolInEnv' :: TTerm t -> SymbolEnv () -> Symbol () -> RefactorFunc t
renameSymbolInEnv' term (EnvModulePathElem prevs old) new
  = renameModuleElem' term prevs old new
renameSymbolInEnv' term (EnvRecordHead oldf) new
  = renameRecord' term oldf newf
  where newf = FSymbol (fsymbolScope oldf) new
renameSymbolInEnv' term (EnvPropertyKey head' old) new
  = renameProp' term head' old new