module Language.C.Data.Node (
NodeInfo(..), internalNode,mkNodeInfoOnlyPos,mkNodeInfo,
CNode(nodeInfo), fileOfNode,
posOfNode, nameOfNode,
eqByName,
) where
import Language.C.Data.Position
import Language.C.Data.Name (Name)
import Data.Generics
data NodeInfo = OnlyPos Position
| NodeInfo Position Name
deriving (Show,Read,Data,Typeable)
instance Eq NodeInfo where
(NodeInfo _ id1) == (NodeInfo _ id2) = id1 == id2
_ == _ =
error "Attributes: Attempt to compare `OnlyPos' attributes!"
instance Ord NodeInfo where
(NodeInfo _ id1) <= (NodeInfo _ id2) = id1 <= id2
_ <= _ =
error "Attributes: Attempt to compare `OnlyPos' attributes!"
instance Pos NodeInfo where
posOf (OnlyPos pos) = pos
posOf (NodeInfo pos _) = pos
class CNode a where
nodeInfo :: a -> NodeInfo
instance CNode NodeInfo where
nodeInfo = id
instance (CNode a, CNode b) => CNode (Either a b) where
nodeInfo = either nodeInfo nodeInfo
nameOfNode :: NodeInfo -> Maybe Name
nameOfNode (OnlyPos _) = Nothing
nameOfNode (NodeInfo _ name) = Just name
posOfNode :: NodeInfo -> Position
posOfNode ni = case ni of (OnlyPos pos ) -> pos; (NodeInfo pos _) -> pos
fileOfNode :: (CNode a) => a -> FilePath
fileOfNode = posFile . posOfNode . nodeInfo
eqByName :: CNode a => a -> a -> Bool
eqByName obj1 obj2 = (nodeInfo obj1) == (nodeInfo obj2)
internalNode :: NodeInfo
internalNode = OnlyPos nopos
mkNodeInfoOnlyPos :: Position -> NodeInfo
mkNodeInfoOnlyPos pos = OnlyPos pos
mkNodeInfo :: Position -> Name -> NodeInfo
mkNodeInfo pos name = NodeInfo pos name