module SourceText where
import qualified ModuleBase as Module
import qualified Text.ParserCombinators.Parsec.Pos as ParsecPos
import Text.ParserCombinators.Parsec ( CharParser, getPosition )
data Position = Position !Int !Int
deriving (Eq, Ord, Show)
initialPos :: Position
initialPos = Position 1 1
parsecPos :: ParsecPos.SourcePos -> Position
parsecPos pos =
Position (ParsecPos.sourceLine pos) (ParsecPos.sourceColumn pos)
makeParsecPos :: Module.Name -> Position -> ParsecPos.SourcePos
makeParsecPos (Module.Name modu) (Position line column) =
ParsecPos.newPos modu line column
data Range = Range { start, stop :: Position }
deriving (Eq, Ord, Show)
data ModuleRange = ModuleRange Module.Name (Maybe Module.Version) Range
deriving (Eq, Ord, Show)
emptyRange :: Range
emptyRange = Range initialPos initialPos
emptyModuleRange :: Module.Name -> ModuleRange
emptyModuleRange name = ModuleRange name Module.noVersion emptyRange
extractModuleName :: ModuleRange -> Module.Name
extractModuleName (ModuleRange n _ _) = n
extractModuleRange :: ModuleRange -> Range
extractModuleRange (ModuleRange _ _ rng) = rng
setRangeNoVersion :: Range -> ModuleRange
setRangeNoVersion = ModuleRange Module.noName Module.noVersion
setRangeSourceName :: Module.Name -> Module.Version -> Range -> ModuleRange
setRangeSourceName name vers = ModuleRange name (Just vers)
class ParserRange range where
consRange :: ParsecPos.SourcePos -> ParsecPos.SourcePos -> range
instance ParserRange Range where
consRange from to = Range (parsecPos from) (parsecPos to)
ranged :: (ParserRange range) => CharParser st a -> CharParser st (range, a)
ranged p = do
from <- getPosition
x <- p
to <- getPosition
return (consRange from to, x)