module Language.Fortran.Util.Position where
import Data.Data
import Data.Typeable
import Text.PrettyPrint.GenericPretty
import Text.PrettyPrint
import GHC.Generics
import Language.Fortran.Util.FirstParameter
import Language.Fortran.Util.SecondParameter
class Loc a where
getPos :: a -> Position
data Position = Position
{ posAbsoluteOffset :: !Int
, posColumn :: !Int
, posLine :: !Int
} deriving (Eq, Ord, Data, Typeable)
instance Show Position where
show (Position _ c l) = show l ++ ':' : show c
initPosition :: Position
initPosition = Position
{ posAbsoluteOffset = 0
, posColumn = 1
, posLine = 1
}
data SrcSpan = SrcSpan Position Position deriving (Eq, Ord, Typeable, Data, Generic)
instance Show SrcSpan where
show (SrcSpan s1 s2)= '(' : show s1 ++ ',' : show s2 ++ ")"
instance Out SrcSpan where
doc s = text $ show s
docPrec _ = doc
initSrcSpan :: SrcSpan
initSrcSpan = SrcSpan initPosition initPosition
instance Spanned SrcSpan where
getSpan s = s
setSpan _ _ = undefined
class Spanned a where
getSpan :: a -> SrcSpan
setSpan :: SrcSpan -> a -> a
default getSpan :: (SecondParameter a SrcSpan) => a -> SrcSpan
getSpan a = getSecondParameter a
default setSpan :: (SecondParameter a SrcSpan) => SrcSpan -> a -> a
setSpan e a = setSecondParameter e a