module Common ( Ident(..), identName, identPos, ident, explainIdent, explainPos, QIdent , module UU.Scanner.Position , DepItem(..), Reason(..) ) where import UU.Scanner.Position import Data.Map(Map) import qualified Data.Map as Map -- -- Identifiers -- data Ident = Ident String Pos identName :: Ident -> String identName (Ident nm _) = nm identPos :: Ident -> Pos identPos (Ident _ pos) = pos ident :: String -> Ident ident nm = Ident nm noPos instance Show Ident where show (Ident nm _) = nm instance Eq Ident where (Ident nmA _) == (Ident nmB _) = nmA == nmB instance Ord Ident where compare (Ident nmA _) (Ident nmB _) = compare nmA nmB explainIdent :: Ident -> String explainIdent ident = show ident ++ " {" ++ explainPos (identPos ident) ++ "}" explainPos :: Pos -> String explainPos (Pos l c file) = file ++ ":" ++ show l ++ "," ++ show c -- -- Qualified Identifiers -- type QIdent = [Ident] -- -- DepItems -- data DepItem = DepMatch !Int -- occ id | DepAssert !Int -- occ id | DepDefault !Int -- code id | DepAttach !Int -- occ id | DepInvoke !QIdent -- name : qual childname | DepVisStart !QIdent -- name : basename | DepVisEnd !QIdent -- name : basename | DepClause !QIdent -- name : basename (or: loc.basename) deriving (Eq, Show) instance Ord DepItem where compare a b = let c (DepMatch n) (DepMatch m) = compare m n -- c (DepMatch n) (DepAssert m) = compare m n c (DepMatch _) _ = GT -- c (DepAssert n) (DepMatch m) = compare m n c (DepAssert n) (DepMatch m) = LT c (DepAssert n) (DepAssert m) = compare m n c (DepAssert _) _ = GT c (DepDefault _) (DepMatch _) = LT c (DepDefault _) (DepAssert _) = LT c (DepDefault n) (DepDefault m) = compare m n c (DepDefault _) _ = GT c (DepAttach _) (DepMatch _) = LT c (DepAttach _) (DepAssert _) = LT c (DepAttach _) (DepDefault _) = LT c (DepAttach n) (DepAttach m) = compare m n c (DepAttach _) _ = GT c (DepInvoke _) (DepMatch _) = LT c (DepInvoke _) (DepAssert _) = LT c (DepInvoke _) (DepDefault _) = LT c (DepInvoke _) (DepAttach _) = LT c (DepInvoke n) (DepInvoke m) = compareNames (reverse n) (reverse m) c (DepInvoke _) _ = GT c (DepVisStart _) (DepMatch _) = LT c (DepVisStart _) (DepAssert _) = LT c (DepVisStart _) (DepDefault _) = LT c (DepVisStart _) (DepAttach _) = LT c (DepVisStart _) (DepInvoke _) = LT c (DepVisStart n) (DepVisStart m) = compareNames (reverse n) (reverse m) c (DepVisStart _) _ = GT c (DepVisEnd n) (DepVisEnd m) = compareNames (reverse n) (reverse m) c (DepVisEnd _) _ = LT c (DepClause _) (DepMatch _) = LT c (DepClause _) (DepAssert _) = LT c (DepClause _) (DepDefault _) = LT c (DepClause _) (DepAttach _) = LT c (DepClause _) (DepInvoke _) = LT c (DepClause _) (DepVisStart _) = LT c (DepClause _) (DepVisEnd _) = GT c (DepClause n) (DepClause m) = compareNames (reverse n) (reverse m) in c b a compareNames :: QIdent -> QIdent -> Ordering compareNames [] [] = EQ compareNames [] _ = GT compareNames _ [] = LT compareNames (x:xs) (y:ys) = case compare x y of LT -> GT GT -> LT EQ -> compareNames xs ys -- Dependency reasons data Reason = ReasonScopeVisit !Ident | ReasonScopeClause !Ident | ReasonScopeEnd !Ident | ReasonAttrReq !Ident !Ident | ReasonInvokeReq !Ident | ReasonChildReq !Ident | ReasonAttach !Ident !Ident | ReasonDefault !Ident | ReasonDetach !Ident !Ident | ReasonSink | ReasonAlloc | ReasonError | ReasonOrder deriving (Eq,Ord,Show)