module Hint.Typecheck (
typeOf, typeChecks, kindOf, normalizeType, onCompilationError, typeChecksWithDetails
) where
import Control.Monad.Catch
import Hint.Base
import Hint.Parsers
import Hint.Conversions
import qualified Hint.GHC as GHC
typeOf :: MonadInterpreter m => String -> m String
typeOf :: forall (m :: * -> *). MonadInterpreter m => String -> m String
typeOf String
expr =
do
forall (m :: * -> *).
MonadInterpreter m =>
(String -> m ParseResult) -> String -> m ()
failOnParseError forall (m :: * -> *). MonadInterpreter m => String -> m ParseResult
parseExpr String
expr
Type
type_ <- forall (m :: * -> *) a. MonadInterpreter m => m (Maybe a) -> m a
mayFail (forall (m :: * -> *) a. MonadInterpreter m => RunGhc m a
runGhc forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). GhcMonad m => String -> m (Maybe Type)
exprType String
expr)
forall (m :: * -> *). MonadInterpreter m => Type -> m String
typeToString Type
type_
typeChecks :: MonadInterpreter m => String -> m Bool
typeChecks :: forall (m :: * -> *). MonadInterpreter m => String -> m Bool
typeChecks String
expr = (Bool
True forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall (m :: * -> *). MonadInterpreter m => String -> m String
typeOf String
expr)
forall (m :: * -> *) a.
MonadInterpreter m =>
m a -> (InterpreterError -> m a) -> m a
`catchIE`
forall (m :: * -> *) a.
MonadInterpreter m =>
([GhcError] -> m a) -> InterpreterError -> m a
onCompilationError (\[GhcError]
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False)
typeChecksWithDetails :: MonadInterpreter m => String -> m (Either [GhcError] String)
typeChecksWithDetails :: forall (m :: * -> *).
MonadInterpreter m =>
String -> m (Either [GhcError] String)
typeChecksWithDetails String
expr = (forall a b. b -> Either a b
Right forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). MonadInterpreter m => String -> m String
typeOf String
expr)
forall (m :: * -> *) a.
MonadInterpreter m =>
m a -> (InterpreterError -> m a) -> m a
`catchIE`
forall (m :: * -> *) a.
MonadInterpreter m =>
([GhcError] -> m a) -> InterpreterError -> m a
onCompilationError (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> Either a b
Left)
kindOf :: MonadInterpreter m => String -> m String
kindOf :: forall (m :: * -> *). MonadInterpreter m => String -> m String
kindOf String
type_expr =
do
forall (m :: * -> *).
MonadInterpreter m =>
(String -> m ParseResult) -> String -> m ()
failOnParseError forall (m :: * -> *). MonadInterpreter m => String -> m ParseResult
parseType String
type_expr
(Type
_, Type
kind) <- forall (m :: * -> *) a. MonadInterpreter m => m (Maybe a) -> m a
mayFail forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. MonadInterpreter m => RunGhc m a
runGhc forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *).
GhcMonad m =>
String -> m (Maybe (Type, Type))
typeKind String
type_expr
forall (m :: * -> *). MonadInterpreter m => Type -> m String
kindToString Type
kind
normalizeType :: MonadInterpreter m => String -> m String
normalizeType :: forall (m :: * -> *). MonadInterpreter m => String -> m String
normalizeType String
type_expr =
do
forall (m :: * -> *).
MonadInterpreter m =>
(String -> m ParseResult) -> String -> m ()
failOnParseError forall (m :: * -> *). MonadInterpreter m => String -> m ParseResult
parseType String
type_expr
(Type
ty, Type
_) <- forall (m :: * -> *) a. MonadInterpreter m => m (Maybe a) -> m a
mayFail forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. MonadInterpreter m => RunGhc m a
runGhc forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *).
GhcMonad m =>
String -> m (Maybe (Type, Type))
typeKind String
type_expr
forall (m :: * -> *). MonadInterpreter m => Type -> m String
typeToString Type
ty
exprType :: GHC.GhcMonad m => String -> m (Maybe GHC.Type)
exprType :: forall (m :: * -> *). GhcMonad m => String -> m (Maybe Type)
exprType = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *).
GhcMonad m =>
TcRnExprMode -> String -> m Type
GHC.exprType TcRnExprMode
GHC.TM_Inst
typeKind :: GHC.GhcMonad m => String -> m (Maybe (GHC.Type, GHC.Kind))
typeKind :: forall (m :: * -> *).
GhcMonad m =>
String -> m (Maybe (Type, Type))
typeKind = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *).
GhcMonad m =>
Bool -> String -> m (Type, Type)
GHC.typeKind Bool
True
onCompilationError :: MonadInterpreter m
=> ([GhcError] -> m a)
-> (InterpreterError -> m a)
onCompilationError :: forall (m :: * -> *) a.
MonadInterpreter m =>
([GhcError] -> m a) -> InterpreterError -> m a
onCompilationError [GhcError] -> m a
recover InterpreterError
interp_error
= case InterpreterError
interp_error of
WontCompile [GhcError]
errs -> [GhcError] -> m a
recover [GhcError]
errs
InterpreterError
otherErr -> forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM InterpreterError
otherErr