HaRe-0.6: refactorer/RefacCacheMerge.hs
-----------------------------------------------------------------------------
-- |
-- Module : RefacCacheMerge
-- Copyright : (c) Christopher Brown 2006
--
-- Maintainer : cmb21@kent.ac.uk
-- Stability : provisional
-- Portability : portable
--
-- This module caches definitions into a file to be used
-- with RefacMerge
module RefacCacheMerge where
import System.IO.Unsafe
import RefacTypeSyn
import RefacLocUtils
import Data.Char
import GHC.Unicode
import AbstractIO
import Maybe
import List
import RefacUtils
import RefacRedunDec
import SlicingUtils
import LocalSettings
refacCacheMerge args
= do
let fileName = args!!0
begin = read (args!!1)::Int
end = read (args!!2)::Int
AbstractIO.putStrLn "refacCacheMerge"
(inscps, exps, mod, tokList) <- parseSourceFile fileName
case checkCursor fileName begin end mod of
Left errMsg -> do error errMsg
Right decl ->
do
AbstractIO.putStrLn ((declToName decl) ++ " added to cache.")
-- let x = unsafePerformIO (do
AbstractIO.appendFile mergeFilePath (">" ++ fileName ++ "<" ++ "%" ++ (show begin) ++ "%" ++ "&" ++ (show end) ++ "&")
AbstractIO.putStrLn "Completed" -- )
AbstractIO.putStrLn "RefacCacheMerge Completed."
-- check whether the cursor points to the beginning of the datatype declaration
-- taken from RefacADT.hs
{- checkCursor :: String -> Int -> Int -> HsModuleP -> Either String HsDeclP
checkCursor fileName row col mod
= case locToTypeDecl of
Nothing -> Left ("Invalid cursor position. Please place cursor at the beginning of the definition!")
Just decl -> Right decl
where
locToTypeDecl = find (definesPNT (locToPNT fileName (row, col) mod)) (hsModDecls mod)
definesPNT pnt d@(Dec (HsPatBind loc p e ds))
| declToPName2 d == pNTtoPN pnt = True
| otherwise = definesPNT pnt (hsDecls ds) -- findPNT pnt d
definesPNT pnt d@(Dec (HsFunBind loc ms))
| declToPName2 d == pNTtoPN pnt = True
| otherwise = definesPNT pnt (hsDecls ms)
-- = -- findPNT pnt d
definesPNT pnt _ = False -}
checkCursor :: String -> Int -> Int -> HsModuleP -> Either String HsDeclP
checkCursor fileName row col mod
= case locToPName of
Nothing -> Left ("Invalid cursor position. Please place cursor at the beginning of the definition!")
Just decl -> Right decl
where
locToPName
= case res of
Nothing -> find (definesPNT (locToPNT fileName (row, col) mod)) (hsDecls mod)
_ -> res
res = find (defines (locToPN fileName (row, col) mod)) (concat (map hsDecls (hsModDecls mod)))
definesPNT pnt d@(Dec (HsPatBind loc p e ds))
= findPNT pnt d
definesPNT pnt d@(Dec (HsFunBind loc ms))
= findPNT pnt d
definesPNT _ _ = False
{- locToPName = locToPN fileName (row, col) mod
definesPNT pnt d@(Dec (HsFunBind loc ms))
| isDeclaredIn -}