packages feed

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 -}