packages feed

HaRe-0.6: refactorer/SlicingUtils.hs

module SlicingUtils where

import AbstractIO
import Maybe
import List
import RefacUtils
import RefacRedunDec


checkCase (Exp(HsInfixApp e11 o e22 )) high wh
  | findEntity high e11 = do
                             (e, wh) <- checkCase e11 high wh
                             return (e, wh)
  | findEntity high e22 = do
                             (e, wh) <- checkCase e22 high wh
                             return (e,wh)

checkCase (Exp(HsParen e)) high wh 
                = do 
                     res <- checkCase e high wh
                     return res
checkCase (Exp(HsCase e alts)) high wh
                = do
                     newWhere <- checkAlts alts
                     return (high, (newWhere++wh))
                        where
                           checkAlts [] = do
                                             return []
                           checkAlts ((HsAlt _ _ _ ds):xs) 
                              = do
                                   decls <- removeRedunWhere ds high
                                   res <- checkAlts xs
                                   return (decls ++ res)

checkCase (exp@e) high wh  = do
                              decls <- removeRedunWhere wh e
                              return (exp, decls)


checkIfOrLet (Exp(HsParen e)) newExp tokList start end
                = do
                     res <- checkIfOrLet e newExp tokList start end
                     return (Exp(HsParen res))

checkIfOrLet (Exp(HsIf e1 e2 e3)) newExp tokList start end
                = do
                     let expRes = findExpInIf tokList
                                              start
                                              end
                                              e2
                     if expRes == defaultExp
                         then do
                                 let expRes' = findExpInIf tokList
                                                           start
                                                           end
                                                           e3
                                 if expRes' == defaultExp 
                                      then return (Exp(HsIf e1 e2 e3)) 
                                      else return (newExp)
                         else return (newExp)
checkIfOrLet (Exp(HsLet ds e)) newExp _ _ _ 
                = do
                     return (Exp(HsLet ds newExp))

checkIfOrLet (exp@_) newExp _ _ _ = do
                               return newExp
-- check whether the identifiers within the highlighted subexpression are 
-- used within the let statement - if they are then return the statement
checkLetAndLambda begin end tokList wh high exp
  = applyTU (full_tdTU (constTU [] `adhocTU` inLet)) exp
     where
           inLet (ex@(Exp(HsLet ds e))::HsExpP)
               = do 
                    let newExp = (Exp(HsLet ds high))
                    (decls, x) <- removeRedun wh newExp
                    res <- inLet e
                    if res == [defaultExp] then do
                                             return [x]
                                           else do
                                             let exp' = ammendDecs res x
                                             return [exp']
                                                where
                                                  ammendDecs ((Exp(HsLet ds e)):xs) ((Exp(HsLet decls e2))) 
                                                                 = (Exp(HsLet (decls++ds) e))
                                                  ammendDecs _ _ = defaultExp

           inLet (Exp(HsParen e)) = do res <- inLet e 
                                       return res
           inLet (Exp(HsInfixApp e1 _ e2)) = do
                                           res <- inLet e1
                                           if res == [defaultExp]
                                               then do
                                                  res' <- inLet e2
                                                  return res'
                                               else do
                                                  return res
           inLet (Exp(HsApp e1 e2)) = do
                                        res <- inLet e1
                                        if res == [defaultExp]
                                           then do
                                             res' <- inLet e2
                                             return res'
                                           else do
                                             return res
           inLet (Exp(HsCase e alts))
                = do 
                     return [(Exp(HsCase high alts))]

           inLet (exp@(Exp(HsDo _)))
               = do
                    if (locToExp begin end tokList exp) /= defaultExp
                       then do
                         error "Cannot perform a slicing on a monad"
                       else do return [exp] 

           inLet (exp@(Exp(HsListComp _))) = do
                                              if (locToExp begin end tokList exp) /= defaultExp
                                                then do
                                                  error "Cannot perform slicing with List Comprehension"
                                                else do return [defaultExp]

           inLet (_::HsExpP) = do
                                return [defaultExp]
                    

findExpInIf toks beginPos endPos t
  = fromMaybe (defaultExp)
              (applyTU (once_tdTU (failTU `adhocTU` inExp)) t)
        where
          inExp (exp@(_)::HsExpP)
           | locToExp beginPos endPos toks exp /= defaultExp
              = Just (exp)
          inExp _ = Nothing