packages feed

hhp-1.0.3: lib/Hhp/Check.hs

module Hhp.Check (
    checkSyntax,
    check,
    expandTemplate,
    expand,
) where

import GHC (DynFlags (..), Ghc)
import GHC.Driver.Session (DumpFlag (Opt_D_dump_splices), dopt_set)

import Hhp.GHCApi
import Hhp.Logger
import Hhp.Types

----------------------------------------------------------------

-- | Checking syntax of a target file using GHC.
--   Warnings and errors are returned.
checkSyntax
    :: Options
    -> Cradle
    -> [FilePath]
    -- ^ The target files.
    -> IO String
checkSyntax _ _ [] = return ""
checkSyntax opt cradle files = withGHC sessionName $ do
    initializeFlagsWithCradle opt cradle
    either id id <$> check opt files
  where
    sessionName = case files of
        [file] -> file
        _ -> "MultipleFiles"

----------------------------------------------------------------

-- | Checking syntax of a target file using GHC.
--   Warnings and errors are returned.
check
    :: Options
    -> [FilePath]
    -- ^ The target files.
    -> Ghc (Either String String)
check opt fileNames =
    withLogger opt (setAllWarningFlags . setPartialSignatures . setDeferTypedHoles) $
        setTargetFiles fileNames

----------------------------------------------------------------

-- | Expanding Haskell Template.
expandTemplate
    :: Options
    -> Cradle
    -> [FilePath]
    -- ^ The target files.
    -> IO String
expandTemplate _ _ [] = return ""
expandTemplate opt cradle files = withGHC sessionName $ do
    initializeFlagsWithCradle opt cradle
    either id id <$> expand opt files
  where
    sessionName = case files of
        [file] -> file
        _ -> "MultipleFiles"

----------------------------------------------------------------

-- | Expanding Haskell Template.
expand
    :: Options
    -> [FilePath]
    -- ^ The target files.
    -> Ghc (Either String String)
expand opt fileNames =
    withLogger opt (setDumpSplices . setNoWarningFlags) $
        setTargetFiles fileNames

setDumpSplices :: DynFlags -> DynFlags
setDumpSplices dflag = dopt_set dflag Opt_D_dump_splices