-- | @futhark check@
module Futhark.CLI.Check (main) where

import Control.Monad
import Control.Monad.IO.Class
import Futhark.Compiler
import Futhark.Util.Options
import Futhark.Util.Pretty (hPutDoc)
import Language.Futhark.Warnings
import System.IO

newtype CheckConfig = CheckConfig {CheckConfig -> Bool
checkWarn :: Bool}

newCheckConfig :: CheckConfig
newCheckConfig :: CheckConfig
newCheckConfig = Bool -> CheckConfig
CheckConfig Bool
True

options :: [FunOptDescr CheckConfig]
options :: [FunOptDescr CheckConfig]
options =
  [ forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option
      [Char]
"w"
      []
      (forall a. a -> ArgDescr a
NoArg forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ \CheckConfig
cfg -> CheckConfig
cfg {checkWarn :: Bool
checkWarn = Bool
False})
      [Char]
"Disable all warnings."
  ]

-- | Run @futhark check@.
main :: String -> [String] -> IO ()
main :: [Char] -> [[Char]] -> IO ()
main = forall cfg.
cfg
-> [FunOptDescr cfg]
-> [Char]
-> ([[Char]] -> cfg -> Maybe (IO ()))
-> [Char]
-> [[Char]]
-> IO ()
mainWithOptions CheckConfig
newCheckConfig [FunOptDescr CheckConfig]
options [Char]
"program" forall a b. (a -> b) -> a -> b
$ \[[Char]]
args CheckConfig
cfg ->
  case [[Char]]
args of
    [[Char]
file] -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ do
      (Warnings
warnings, Imports
_, VNameSource
_) <- forall (m :: * -> *).
MonadIO m =>
[Char] -> m (Warnings, Imports, VNameSource)
readProgramOrDie [Char]
file
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (CheckConfig -> Bool
checkWarn CheckConfig
cfg Bool -> Bool -> Bool
&& Warnings -> Bool
anyWarnings Warnings
warnings) forall a b. (a -> b) -> a -> b
$
        forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$
          Handle -> Doc AnsiStyle -> IO ()
hPutDoc Handle
stderr forall a b. (a -> b) -> a -> b
$
            Warnings -> Doc AnsiStyle
prettyWarnings Warnings
warnings
    [[Char]]
_ -> forall a. Maybe a
Nothing