Plain source file: base/AST/HsExpUtil.hs (2006-06-13)

HsExpUtil is imported by: BaseSyntaxUtil, HsExp, HsExpPretty, BetaReduce.

Auxiliary E structure functions.

module HsExpUtil where

import HsExpStruct
import HsIdent
import SrcLoc(SrcLoc)
--import HsAssoc
import HsExpMaps(mapEI, accEI)
import HasBaseStruct(basestruct)
import MUtils(( # ))

-- Auxiliary type used during parsing&printing, not part of the abstract syntax:
data HsStmtAtom e p ds
    = HsGeneratorAtom SrcLoc p e
    | HsQualifierAtom e
    | HsLetStmtAtom ds
    | HsLastAtom e
      deriving (Eq, Show) 

atoms2Stmt [HsQualifierAtom e]        = return (HsLast e)
atoms2Stmt (HsGeneratorAtom s p e : ss) = HsGenerator s p e # atoms2Stmt ss
atoms2Stmt (HsLetStmtAtom ds : ss)    = HsLetStmt ds # atoms2Stmt ss
atoms2Stmt (HsQualifierAtom e : ss)   = HsQualifier e # atoms2Stmt ss
atoms2Stmt _ = fail "last statement in a 'do' expression must be an expression"

getStmtList (HsGenerator l p e s) = HsGeneratorAtom l p e : getStmtList s
getStmtList (HsQualifier e s)   = HsQualifierAtom e : getStmtList s
getStmtList (HsLetStmt ds s)    = HsLetStmtAtom ds : getStmtList s
getStmtList (HsLast e)          = [HsLastAtom e]

isEVar e = isHsIdVar =<< exposeE e

isHsIdVar e =
  case e of
    HsId (HsVar n) -> Just n
    _ -> Nothing

-- Expose the E structure of an expression (ignoring parentheses).
exposeE e =
  case basestruct e of
    Just (HsParen e') -> exposeE e'
    Just e' -> Just e'
    _ -> Nothing

isPatternE iscon isvar pef pe =
  case pe of 
    HsId (HsVar n)              -> True
    HsTuple es                  -> all pef es
    HsWildCard                  -> True
    HsApp e1 e2 | iscon e1      -> pef e2
		| isvar e1      -> False
		| otherwise     -> pef e1 && pef e2
    HsList es                   -> all pef es
    HsInfixApp e1 (HsCon op) e2 -> pef e1 && pef e2
    HsParen e                   -> pef e   
    HsAsPat n e                 -> pef e
    HsRecConstr con fields      -> True
    _                           -> False

isFundefLhsE pef fdf pe p =
  case pe of  
    HsParen e                -> fdf e p
    HsId (HsVar n)           -> p
    HsApp l r                -> pef r && fdf l True
    HsInfixApp l (HsVar n) r -> pef l && pef r
    _                        -> False

Finds all of the free variables in an E structure.

freeVarsE fve e = 
  case e of 
    HsId (HsVar n) -> [n]
    _              -> accEI (const id) (++) (++) (++) (++) (++)
                           (mapEI id fve (const []) (const [])
			             (const []) (const [])

{- Obsolete...
reassociateE isinfix make undo rae rap rads env (HsInfixApp a op1 b) =
    let f  = getHSName op1
        a' = rae env a
        if isinfix a' then
	    let (op2, c, d) = undo a'
                g           = getHSName op2
                if (getPrec env f) > (getPrec env g) || 
		   ((getPrec env f == getPrec env g) && 
                     (getAssoc env f == HsAssocRight && 
                      getAssoc env g == HsAssocRight))
		    HsInfixApp c op2 (rae env (make d op1 b))
		    HsInfixApp a' op1 (rae env b)
            HsInfixApp a' op1 b
reassociateE isinfix make undo rae rap rads env e =
    mapEI id (rae env) (rap env) (rads env) id id e

removeParensE make rp e = 
  case e of 
    HsParen e' -> rp e'
    _          -> make $ mapEI id rp id id id id e


(HTML for this module was generated on 2006-08-12. About the conversion tool.)