module Parser.SourceFile (
CodeVisibility(..),
PragmaSource(..),
WithVisibility(..),
hasCodeVisibility,
isModuleOnly,
isTestsOnly,
mapCodeVisibility,
parseInternalSource,
parsePublicSource,
parseTestSource,
pragmaModuleOnly,
pragmaTestsOnly,
updateCodeVisibility,
) where
import qualified Data.Set as Set
import Base.CompilerError
import Parser.Common
import Parser.DefinedCategory ()
import Parser.IntegrationTest ()
import Parser.Pragma
import Parser.TextParser
import Parser.TypeCategory ()
import Types.DefinedCategory
import Types.IntegrationTest
import Types.TypeCategory
parseInternalSource :: ErrorContextM m =>
(FilePath,String) -> m ([PragmaSource SourceContext],[AnyCategory SourceContext],[DefinedCategory SourceContext])
parseInternalSource :: forall (m :: * -> *).
ErrorContextM m =>
(FilePath, FilePath)
-> m ([PragmaSource SourceContext], [AnyCategory SourceContext],
[DefinedCategory SourceContext])
parseInternalSource (FilePath
f,FilePath
s) = forall (m :: * -> *) a.
ErrorContextM m =>
TextParser a -> FilePath -> FilePath -> m a
runTextParser (forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between TextParser ()
optionalSpace TextParser ()
endOfDoc ParsecT
CompilerMessage
FilePath
Identity
([PragmaSource SourceContext], [AnyCategory SourceContext],
[DefinedCategory SourceContext])
withPragmas) FilePath
f FilePath
s where
withPragmas :: ParsecT
CompilerMessage
FilePath
Identity
([PragmaSource SourceContext], [AnyCategory SourceContext],
[DefinedCategory SourceContext])
withPragmas = do
[PragmaSource SourceContext]
pragmas <- forall a. [TextParser a] -> TextParser [a]
parsePragmas [TextParser (PragmaSource SourceContext)]
internalSourcePragmas
TextParser ()
optionalSpace
([AnyCategory SourceContext]
cs,[DefinedCategory SourceContext]
ds) <- forall a b. TextParser a -> TextParser b -> TextParser ([a], [b])
parseAny2 forall a. ParseFromSource a => TextParser a
sourceParser forall a. ParseFromSource a => TextParser a
sourceParser
forall (m :: * -> *) a. Monad m => a -> m a
return ([PragmaSource SourceContext]
pragmas,[AnyCategory SourceContext]
cs,[DefinedCategory SourceContext]
ds)
parsePublicSource :: ErrorContextM m => (FilePath,String) -> m ([PragmaSource SourceContext],[AnyCategory SourceContext])
parsePublicSource :: forall (m :: * -> *).
ErrorContextM m =>
(FilePath, FilePath)
-> m ([PragmaSource SourceContext], [AnyCategory SourceContext])
parsePublicSource (FilePath
f,FilePath
s) = forall (m :: * -> *) a.
ErrorContextM m =>
TextParser a -> FilePath -> FilePath -> m a
runTextParser (forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between TextParser ()
optionalSpace TextParser ()
endOfDoc ParsecT
CompilerMessage
FilePath
Identity
([PragmaSource SourceContext], [AnyCategory SourceContext])
withPragmas) FilePath
f FilePath
s where
withPragmas :: ParsecT
CompilerMessage
FilePath
Identity
([PragmaSource SourceContext], [AnyCategory SourceContext])
withPragmas = do
[PragmaSource SourceContext]
pragmas <- forall a. [TextParser a] -> TextParser [a]
parsePragmas [TextParser (PragmaSource SourceContext)]
publicSourcePragmas
TextParser ()
optionalSpace
[AnyCategory SourceContext]
cs <- forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
sepBy forall a. ParseFromSource a => TextParser a
sourceParser TextParser ()
optionalSpace
forall (m :: * -> *) a. Monad m => a -> m a
return ([PragmaSource SourceContext]
pragmas,[AnyCategory SourceContext]
cs)
parseTestSource :: ErrorContextM m => (FilePath,String) -> m ([PragmaSource SourceContext],[IntegrationTest SourceContext])
parseTestSource :: forall (m :: * -> *).
ErrorContextM m =>
(FilePath, FilePath)
-> m ([PragmaSource SourceContext],
[IntegrationTest SourceContext])
parseTestSource (FilePath
f,FilePath
s) = forall (m :: * -> *) a.
ErrorContextM m =>
TextParser a -> FilePath -> FilePath -> m a
runTextParser (forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between TextParser ()
optionalSpace TextParser ()
endOfDoc ParsecT
CompilerMessage
FilePath
Identity
([PragmaSource SourceContext], [IntegrationTest SourceContext])
withPragmas) FilePath
f FilePath
s where
withPragmas :: ParsecT
CompilerMessage
FilePath
Identity
([PragmaSource SourceContext], [IntegrationTest SourceContext])
withPragmas = do
[PragmaSource SourceContext]
pragmas <- forall a. [TextParser a] -> TextParser [a]
parsePragmas [TextParser (PragmaSource SourceContext)]
testSourcePragmas
TextParser ()
optionalSpace
[IntegrationTest SourceContext]
ts <- forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
sepBy forall a. ParseFromSource a => TextParser a
sourceParser TextParser ()
optionalSpace
forall (m :: * -> *) a. Monad m => a -> m a
return ([PragmaSource SourceContext]
pragmas,[IntegrationTest SourceContext]
ts)
publicSourcePragmas :: [TextParser (PragmaSource SourceContext)]
publicSourcePragmas :: [TextParser (PragmaSource SourceContext)]
publicSourcePragmas = [TextParser (PragmaSource SourceContext)
pragmaModuleOnly,TextParser (PragmaSource SourceContext)
pragmaTestsOnly]
internalSourcePragmas :: [TextParser (PragmaSource SourceContext)]
internalSourcePragmas :: [TextParser (PragmaSource SourceContext)]
internalSourcePragmas = [TextParser (PragmaSource SourceContext)
pragmaTestsOnly]
testSourcePragmas :: [TextParser (PragmaSource SourceContext)]
testSourcePragmas :: [TextParser (PragmaSource SourceContext)]
testSourcePragmas = []
pragmaModuleOnly :: TextParser (PragmaSource SourceContext)
pragmaModuleOnly :: TextParser (PragmaSource SourceContext)
pragmaModuleOnly = forall a.
FilePath
-> Either (SourceContext -> a) (SourceContext -> TextParser a)
-> TextParser a
autoPragma FilePath
"ModuleOnly" forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall {c}. c -> PragmaSource c
parseAt where
parseAt :: c -> PragmaSource c
parseAt c
c = forall c. [c] -> CodeVisibility -> PragmaSource c
PragmaVisibility [c
c] CodeVisibility
ModuleOnly
pragmaTestsOnly :: TextParser (PragmaSource SourceContext)
pragmaTestsOnly :: TextParser (PragmaSource SourceContext)
pragmaTestsOnly = forall a.
FilePath
-> Either (SourceContext -> a) (SourceContext -> TextParser a)
-> TextParser a
autoPragma FilePath
"TestsOnly" forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall {c}. c -> PragmaSource c
parseAt where
parseAt :: c -> PragmaSource c
parseAt c
c = forall c. [c] -> CodeVisibility -> PragmaSource c
PragmaVisibility [c
c] CodeVisibility
TestsOnly
data CodeVisibility = ModuleOnly | TestsOnly | FromDependency deriving (CodeVisibility -> CodeVisibility -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CodeVisibility -> CodeVisibility -> Bool
$c/= :: CodeVisibility -> CodeVisibility -> Bool
== :: CodeVisibility -> CodeVisibility -> Bool
$c== :: CodeVisibility -> CodeVisibility -> Bool
Eq,Eq CodeVisibility
CodeVisibility -> CodeVisibility -> Bool
CodeVisibility -> CodeVisibility -> Ordering
CodeVisibility -> CodeVisibility -> CodeVisibility
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CodeVisibility -> CodeVisibility -> CodeVisibility
$cmin :: CodeVisibility -> CodeVisibility -> CodeVisibility
max :: CodeVisibility -> CodeVisibility -> CodeVisibility
$cmax :: CodeVisibility -> CodeVisibility -> CodeVisibility
>= :: CodeVisibility -> CodeVisibility -> Bool
$c>= :: CodeVisibility -> CodeVisibility -> Bool
> :: CodeVisibility -> CodeVisibility -> Bool
$c> :: CodeVisibility -> CodeVisibility -> Bool
<= :: CodeVisibility -> CodeVisibility -> Bool
$c<= :: CodeVisibility -> CodeVisibility -> Bool
< :: CodeVisibility -> CodeVisibility -> Bool
$c< :: CodeVisibility -> CodeVisibility -> Bool
compare :: CodeVisibility -> CodeVisibility -> Ordering
$ccompare :: CodeVisibility -> CodeVisibility -> Ordering
Ord,Int -> CodeVisibility -> ShowS
[CodeVisibility] -> ShowS
CodeVisibility -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [CodeVisibility] -> ShowS
$cshowList :: [CodeVisibility] -> ShowS
show :: CodeVisibility -> FilePath
$cshow :: CodeVisibility -> FilePath
showsPrec :: Int -> CodeVisibility -> ShowS
$cshowsPrec :: Int -> CodeVisibility -> ShowS
Show)
data WithVisibility a =
WithVisibility {
forall a. WithVisibility a -> Set CodeVisibility
wvVisibility :: Set.Set CodeVisibility,
forall a. WithVisibility a -> a
wvData :: a
}
deriving (Int -> WithVisibility a -> ShowS
forall a. Show a => Int -> WithVisibility a -> ShowS
forall a. Show a => [WithVisibility a] -> ShowS
forall a. Show a => WithVisibility a -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [WithVisibility a] -> ShowS
$cshowList :: forall a. Show a => [WithVisibility a] -> ShowS
show :: WithVisibility a -> FilePath
$cshow :: forall a. Show a => WithVisibility a -> FilePath
showsPrec :: Int -> WithVisibility a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> WithVisibility a -> ShowS
Show)
hasCodeVisibility :: CodeVisibility -> WithVisibility a -> Bool
hasCodeVisibility :: forall a. CodeVisibility -> WithVisibility a -> Bool
hasCodeVisibility CodeVisibility
v = forall a. Ord a => a -> Set a -> Bool
Set.member CodeVisibility
v forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. WithVisibility a -> Set CodeVisibility
wvVisibility
mapCodeVisibility :: (a -> b) -> WithVisibility a -> WithVisibility b
mapCodeVisibility :: forall a b. (a -> b) -> WithVisibility a -> WithVisibility b
mapCodeVisibility a -> b
f (WithVisibility Set CodeVisibility
v a
x) = forall a. Set CodeVisibility -> a -> WithVisibility a
WithVisibility Set CodeVisibility
v (a -> b
f a
x)
updateCodeVisibility :: (Set.Set CodeVisibility -> Set.Set CodeVisibility) ->
WithVisibility a -> WithVisibility a
updateCodeVisibility :: forall a.
(Set CodeVisibility -> Set CodeVisibility)
-> WithVisibility a -> WithVisibility a
updateCodeVisibility Set CodeVisibility -> Set CodeVisibility
f (WithVisibility Set CodeVisibility
v a
x) = forall a. Set CodeVisibility -> a -> WithVisibility a
WithVisibility (Set CodeVisibility -> Set CodeVisibility
f Set CodeVisibility
v) a
x
data PragmaSource c =
PragmaVisibility {
forall c. PragmaSource c -> [c]
pvContext :: [c],
forall c. PragmaSource c -> CodeVisibility
pvScopes :: CodeVisibility
}
deriving (Int -> PragmaSource c -> ShowS
forall c. Show c => Int -> PragmaSource c -> ShowS
forall c. Show c => [PragmaSource c] -> ShowS
forall c. Show c => PragmaSource c -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [PragmaSource c] -> ShowS
$cshowList :: forall c. Show c => [PragmaSource c] -> ShowS
show :: PragmaSource c -> FilePath
$cshow :: forall c. Show c => PragmaSource c -> FilePath
showsPrec :: Int -> PragmaSource c -> ShowS
$cshowsPrec :: forall c. Show c => Int -> PragmaSource c -> ShowS
Show)
isModuleOnly :: PragmaSource c -> Bool
isModuleOnly :: forall c. PragmaSource c -> Bool
isModuleOnly (PragmaVisibility [c]
_ CodeVisibility
ModuleOnly) = Bool
True
isModuleOnly PragmaSource c
_ = Bool
False
isTestsOnly :: PragmaSource c -> Bool
isTestsOnly :: forall c. PragmaSource c -> Bool
isTestsOnly (PragmaVisibility [c]
_ CodeVisibility
TestsOnly) = Bool
True
isTestsOnly PragmaSource c
_ = Bool
False