language-c-0.3.0: src/Language/C/Data/Node.hs
{-# LANGUAGE DeriveDataTypeable #-}
-----------------------------------------------------------------------------
-- |
-- Module : Language.C.Syntax.Attributes
-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty
-- (c) 2008 Benedikt Huber (stripped radically)
-- License : BSD-style
-- Maintainer : benedikt.huber@gmail.com
-- Stability : experimental
-- Portability : ghc
--
-- source position and unqiue name
-----------------------------------------------------------------------------
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
-- | Parsed entity attribute
data NodeInfo = OnlyPos Position -- only pos (for internal stuff only)
| NodeInfo Position Name -- pos and unique name
deriving (Show,Read,Data,Typeable)
-- name equality of attributes, used to define (name) equality of objects
instance Eq NodeInfo where
(NodeInfo _ id1) == (NodeInfo _ id2) = id1 == id2
_ == _ =
error "Attributes: Attempt to compare `OnlyPos' attributes!"
-- attribute ordering
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
-- | a class for convenient access to the attributes of an attributed object
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
-- | equality by name
eqByName :: CNode a => a -> a -> Bool
eqByName obj1 obj2 = (nodeInfo obj1) == (nodeInfo obj2)
-- attribute identifier creation
-- -----------------------------
internalNode :: NodeInfo
internalNode = OnlyPos nopos
-- | Given only a source position, create a new attribute identifier
mkNodeInfoOnlyPos :: Position -> NodeInfo
mkNodeInfoOnlyPos pos = OnlyPos pos
-- | Given a source position and a unique name, create a new attribute
-- identifier
mkNodeInfo :: Position -> Name -> NodeInfo
mkNodeInfo pos name = NodeInfo pos name