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)