{-# LANGUAGE Safe #-}
module Parser.SourceFile (
parseInternalSource,
parsePublicSource,
parseTestSource,
) where
import Text.Parsec
import Text.Parsec.String
import Base.CompileError
import Parser.Common
import Parser.DefinedCategory
import Parser.IntegrationTest ()
import Parser.Pragma
import Parser.TypeCategory ()
import Types.DefinedCategory
import Types.IntegrationTest
import Types.Pragma
import Types.TypeCategory
parseInternalSource :: CompileErrorM m =>
(FilePath,String) -> m ([Pragma SourcePos],[AnyCategory SourcePos],[DefinedCategory SourcePos])
parseInternalSource (f,s) = unwrap parsed where
parsed = parse (between optionalSpace endOfDoc withPragmas) f s
unwrap (Left e) = compileErrorM (show e)
unwrap (Right t) = return t
withPragmas = do
pragmas <- parsePragmas internalSourcePragmas
optionalSpace
(cs,ds) <- parseAnySource
return (pragmas,cs,ds)
parsePublicSource :: CompileErrorM m => (FilePath,String) -> m ([Pragma SourcePos],[AnyCategory SourcePos])
parsePublicSource (f,s) = unwrap parsed where
parsed = parse (between optionalSpace endOfDoc withPragmas) f s
unwrap (Left e) = compileErrorM (show e)
unwrap (Right t) = return t
withPragmas = do
pragmas <- parsePragmas publicSourcePragmas
optionalSpace
cs <- sepBy sourceParser optionalSpace
return (pragmas,cs)
parseTestSource :: CompileErrorM m => (FilePath,String) -> m ([Pragma SourcePos],[IntegrationTest SourcePos])
parseTestSource (f,s) = unwrap parsed where
parsed = parse (between optionalSpace endOfDoc withPragmas) f s
unwrap (Left e) = compileErrorM (show e)
unwrap (Right t) = return t
withPragmas = do
pragmas <- parsePragmas testSourcePragmas
optionalSpace
ts <- sepBy sourceParser optionalSpace
return (pragmas,ts)
publicSourcePragmas :: [Parser (Pragma SourcePos)]
publicSourcePragmas = [pragmaModuleOnly,pragmaTestsOnly]
internalSourcePragmas :: [Parser (Pragma SourcePos)]
internalSourcePragmas = [pragmaTestsOnly]
testSourcePragmas :: [Parser (Pragma SourcePos)]
testSourcePragmas = []