{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-}
module Foreign.Hoppy.Generator.Spec.Base (
ErrorMsg,
Interface,
InterfaceOptions (..),
defaultInterfaceOptions,
interface,
interface',
interfaceName,
interfaceModules,
interfaceNamesToModules,
interfaceHaskellModuleBase,
interfaceDefaultHaskellModuleBase,
interfaceAddHaskellModuleBase,
interfaceHaskellModuleImportNames,
interfaceExceptionHandlers,
interfaceCallbacksThrow,
interfaceSetCallbacksThrow,
interfaceExceptionClassId,
interfaceExceptionSupportModule,
interfaceSetExceptionSupportModule,
interfaceSetSharedPtr,
interfaceCompiler,
interfaceSetCompiler,
interfaceSetCompiler',
interfaceSetNoCompiler,
interfaceValidateEnumTypes,
interfaceSetValidateEnumTypes,
interfaceHooks,
interfaceModifyHooks,
Include,
includeStd,
includeLocal,
includeToString,
Module,
moduleName,
moduleHppPath,
moduleCppPath,
moduleExports,
moduleReqs,
moduleExceptionHandlers,
moduleCallbacksThrow,
moduleSetCallbacksThrow,
moduleAddendum,
moduleHaskellName,
makeModule,
moduleModify,
moduleModify',
moduleSetHppPath,
moduleSetCppPath,
moduleAddExports,
moduleAddHaskellName,
Reqs,
reqsIncludes,
reqInclude,
HasReqs (..),
addReqs,
addReqIncludes,
ExtName,
toExtName,
extNameOrIdentifier,
extNameOrFnIdentifier,
extNameOrString,
isValidExtName,
fromExtName,
HasExtNames (..),
getAllExtNames,
FnName (..),
IsFnName (..),
Operator (..),
OperatorType (..),
operatorPreferredExtName,
operatorPreferredExtName',
operatorType,
Identifier,
makeIdentifier,
identifierParts,
IdPart,
makeIdPart,
idPartBase,
idPartArgs,
ident, ident', ident1, ident2, ident3, ident4, ident5,
identT, identT', ident1T, ident2T, ident3T, ident4T, ident5T,
Exportable (..),
Export (..),
Type (..),
normalizeType,
stripConst,
stripToGc,
Scoped (..),
isScoped,
Constness (..), constNegate,
Purity (..),
Parameter, parameterType, onParameterType, parameterName,
IsParameter (..), toParameters,
np, (~:),
ConversionMethod (..),
ConversionSpec (conversionSpecName, conversionSpecCpp, conversionSpecHaskell),
makeConversionSpec,
ConversionSpecCpp (
ConversionSpecCpp,
conversionSpecCppName,
conversionSpecCppReqs,
conversionSpecCppConversionType,
conversionSpecCppConversionToCppExpr,
conversionSpecCppConversionFromCppExpr
),
makeConversionSpecCpp,
ConversionSpecHaskell (
ConversionSpecHaskell,
conversionSpecHaskellHsType,
conversionSpecHaskellHsArgType,
conversionSpecHaskellCType,
conversionSpecHaskellToCppFn,
conversionSpecHaskellFromCppFn
),
makeConversionSpecHaskell,
ExceptionId (..),
exceptionCatchAllId,
ExceptionHandler (..),
ExceptionHandlers (..),
HandlesExceptions (..),
handleExceptions,
Addendum (..),
HasAddendum (..),
addAddendumHaskell,
EnumInfo (..),
EnumEntryWords,
EnumValueMap (..),
EnumValue (..),
ForeignLanguage (..),
WithForeignLanguageOverrides,
MapWithForeignLanguageOverrides,
HsModuleName, HsImportSet, HsImportKey (..), HsImportSpecs (..), HsImportName, HsImportVal (..),
hsWholeModuleImport, hsQualifiedImport, hsImport1, hsImport1', hsImports, hsImports',
hsImportSetMakeSource,
interfaceAllExceptionClasses,
interfaceSharedPtr,
makeHsImportSet,
getHsImportSet,
hsImportForBits,
hsImportForException,
hsImportForInt,
hsImportForWord,
hsImportForForeign,
hsImportForForeignC,
hsImportForMap,
hsImportForPrelude,
hsImportForRuntime,
hsImportForSystemPosixTypes,
hsImportForUnsafeIO,
objToHeapTWrongDirectionErrorMsg,
tToGcInvalidFormErrorMessage,
toGcTWrongDirectionErrorMsg,
) where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative ((<$>), (<*>))
#endif
import Control.Arrow ((&&&))
import Control.Monad (liftM2, unless)
#if MIN_VERSION_mtl(2,2,1)
import Control.Monad.Except (MonadError, throwError)
#else
import Control.Monad.Error (MonadError, throwError)
#endif
import Control.Monad.State (MonadState, StateT, execStateT, get, modify, put)
import Data.Char (isAlpha, isAlphaNum)
import Data.Function (on)
import Data.List (intercalate, intersperse)
import qualified Data.Map as M
import Data.Maybe (catMaybes, fromMaybe)
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid (Monoid, mappend, mconcat, mempty)
#endif
import Data.Semigroup as Sem
import qualified Data.Set as S
import Data.Typeable (Typeable, cast)
import Foreign.Hoppy.Generator.Common
import Foreign.Hoppy.Generator.Compiler (Compiler, SomeCompiler (SomeCompiler), defaultCompiler)
import {-# SOURCE #-} Foreign.Hoppy.Generator.Hook (Hooks, defaultHooks)
import {-# SOURCE #-} qualified Foreign.Hoppy.Generator.Language.Cpp as LC
import {-# SOURCE #-} qualified Foreign.Hoppy.Generator.Language.Haskell as LH
import Foreign.Hoppy.Generator.Override (MapWithOverrides, WithOverrides)
import {-# SOURCE #-} Foreign.Hoppy.Generator.Spec.Class (Class, classExtName)
import GHC.Stack (HasCallStack)
import Language.Haskell.Syntax (HsName, HsQualType, HsType)
type ErrorMsg = String
data Interface = Interface
{ Interface -> HsImportName
interfaceName :: String
, Interface -> Map HsImportName Module
interfaceModules :: M.Map String Module
, Interface -> Map ExtName Module
interfaceNamesToModules :: M.Map ExtName Module
, Interface -> Maybe [HsImportName]
interfaceHaskellModuleBase' :: Maybe [String]
, Interface -> Map Module HsImportName
interfaceHaskellModuleImportNames :: M.Map Module String
, Interface -> ExceptionHandlers
interfaceExceptionHandlers :: ExceptionHandlers
, Interface -> Bool
interfaceCallbacksThrow :: Bool
, Interface -> Map ExtName ExceptionId
interfaceExceptionNamesToIds :: M.Map ExtName ExceptionId
, Interface -> Maybe Module
interfaceExceptionSupportModule :: Maybe Module
, Interface -> (Reqs, HsImportName)
interfaceSharedPtr :: (Reqs, String)
, Interface -> Maybe SomeCompiler
interfaceCompiler :: Maybe SomeCompiler
, Interface -> Hooks
interfaceHooks :: Hooks
, Interface -> Bool
interfaceValidateEnumTypes :: Bool
}
instance Show Interface where
show :: Interface -> HsImportName
show Interface
iface = [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName
"<Interface ", ShowS
forall a. Show a => a -> HsImportName
show (Interface -> HsImportName
interfaceName Interface
iface), HsImportName
">"]
instance HasExports Interface where
lookupExport :: ExtName -> Interface -> Maybe Export
lookupExport ExtName
name Interface
iface =
ExtName -> Module -> Maybe Export
forall a. HasExports a => ExtName -> a -> Maybe Export
lookupExport ExtName
name (Module -> Maybe Export) -> Maybe Module -> Maybe Export
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ExtName -> Map ExtName Module -> Maybe Module
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup ExtName
name (Interface -> Map ExtName Module
interfaceNamesToModules Interface
iface)
newtype InterfaceOptions = InterfaceOptions
{ InterfaceOptions -> ExceptionHandlers
interfaceOptionsExceptionHandlers :: ExceptionHandlers
}
defaultInterfaceOptions :: InterfaceOptions
defaultInterfaceOptions :: InterfaceOptions
defaultInterfaceOptions = ExceptionHandlers -> InterfaceOptions
InterfaceOptions ExceptionHandlers
forall a. Monoid a => a
mempty
interface :: String
-> [Module]
-> Either ErrorMsg Interface
interface :: HsImportName -> [Module] -> Either HsImportName Interface
interface HsImportName
ifName [Module]
modules = HsImportName
-> [Module] -> InterfaceOptions -> Either HsImportName Interface
interface' HsImportName
ifName [Module]
modules InterfaceOptions
defaultInterfaceOptions
interface' :: String
-> [Module]
-> InterfaceOptions
-> Either ErrorMsg Interface
interface' :: HsImportName
-> [Module] -> InterfaceOptions -> Either HsImportName Interface
interface' HsImportName
ifName [Module]
modules InterfaceOptions
options = do
let extNamesToModules :: M.Map ExtName [Module]
extNamesToModules :: Map ExtName [Module]
extNamesToModules =
([Module] -> [Module] -> [Module])
-> [Map ExtName [Module]] -> Map ExtName [Module]
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
M.unionsWith [Module] -> [Module] -> [Module]
forall a. [a] -> [a] -> [a]
(++) ([Map ExtName [Module]] -> Map ExtName [Module])
-> [Map ExtName [Module]] -> Map ExtName [Module]
forall a b. (a -> b) -> a -> b
$
[Module]
-> (Module -> Map ExtName [Module]) -> [Map ExtName [Module]]
forall a b. [a] -> (a -> b) -> [b]
for [Module]
modules ((Module -> Map ExtName [Module]) -> [Map ExtName [Module]])
-> (Module -> Map ExtName [Module]) -> [Map ExtName [Module]]
forall a b. (a -> b) -> a -> b
$ \Module
m ->
let extNames :: [ExtName]
extNames = (Export -> [ExtName]) -> [Export] -> [ExtName]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Export -> [ExtName]
forall a. HasExtNames a => a -> [ExtName]
getAllExtNames ([Export] -> [ExtName]) -> [Export] -> [ExtName]
forall a b. (a -> b) -> a -> b
$ Map ExtName Export -> [Export]
forall k a. Map k a -> [a]
M.elems (Map ExtName Export -> [Export]) -> Map ExtName Export -> [Export]
forall a b. (a -> b) -> a -> b
$ Module -> Map ExtName Export
moduleExports Module
m
in [(ExtName, [Module])] -> Map ExtName [Module]
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(ExtName, [Module])] -> Map ExtName [Module])
-> [(ExtName, [Module])] -> Map ExtName [Module]
forall a b. (a -> b) -> a -> b
$ [ExtName] -> [[Module]] -> [(ExtName, [Module])]
forall a b. [a] -> [b] -> [(a, b)]
zip [ExtName]
extNames ([[Module]] -> [(ExtName, [Module])])
-> [[Module]] -> [(ExtName, [Module])]
forall a b. (a -> b) -> a -> b
$ [Module] -> [[Module]]
forall a. a -> [a]
repeat [Module
m]
extNamesInMultipleModules :: [(ExtName, [Module])]
extNamesInMultipleModules :: [(ExtName, [Module])]
extNamesInMultipleModules =
Map ExtName [Module] -> [(ExtName, [Module])]
forall k a. Map k a -> [(k, a)]
M.toList (Map ExtName [Module] -> [(ExtName, [Module])])
-> Map ExtName [Module] -> [(ExtName, [Module])]
forall a b. (a -> b) -> a -> b
$
([Module] -> Bool) -> Map ExtName [Module] -> Map ExtName [Module]
forall a k. (a -> Bool) -> Map k a -> Map k a
M.filter (\case
Module
_:Module
_:[Module]
_ -> Bool
True
[Module]
_ -> Bool
False)
Map ExtName [Module]
extNamesToModules
Bool -> Either HsImportName () -> Either HsImportName ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([(ExtName, [Module])] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(ExtName, [Module])]
extNamesInMultipleModules) (Either HsImportName () -> Either HsImportName ())
-> Either HsImportName () -> Either HsImportName ()
forall a b. (a -> b) -> a -> b
$
HsImportName -> Either HsImportName ()
forall a b. a -> Either a b
Left (HsImportName -> Either HsImportName ())
-> HsImportName -> Either HsImportName ()
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
unlines ([HsImportName] -> HsImportName) -> [HsImportName] -> HsImportName
forall a b. (a -> b) -> a -> b
$
HsImportName
"Some external name(s) are exported by multiple modules:" HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
:
((ExtName, [Module]) -> HsImportName)
-> [(ExtName, [Module])] -> [HsImportName]
forall a b. (a -> b) -> [a] -> [b]
map (\(ExtName
extName, [Module]
modules') ->
[HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([HsImportName] -> HsImportName) -> [HsImportName] -> HsImportName
forall a b. (a -> b) -> a -> b
$ HsImportName
"- " HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
: ExtName -> HsImportName
forall a. Show a => a -> HsImportName
show ExtName
extName HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
: HsImportName
": " HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
: HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
intersperse HsImportName
", " ((Module -> HsImportName) -> [Module] -> [HsImportName]
forall a b. (a -> b) -> [a] -> [b]
map Module -> HsImportName
forall a. Show a => a -> HsImportName
show [Module]
modules'))
[(ExtName, [Module])]
extNamesInMultipleModules
let haskellModuleImportNames :: Map Module HsImportName
haskellModuleImportNames =
[(Module, HsImportName)] -> Map Module HsImportName
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Module, HsImportName)] -> Map Module HsImportName)
-> [(Module, HsImportName)] -> Map Module HsImportName
forall a b. (a -> b) -> a -> b
$
(\[Module]
a [Int]
b Module -> Int -> (Module, HsImportName)
f -> (Module -> Int -> (Module, HsImportName))
-> [Module] -> [Int] -> [(Module, HsImportName)]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Module -> Int -> (Module, HsImportName)
f [Module]
a [Int]
b) [Module]
modules [(Int
1::Int)..] ((Module -> Int -> (Module, HsImportName))
-> [(Module, HsImportName)])
-> (Module -> Int -> (Module, HsImportName))
-> [(Module, HsImportName)]
forall a b. (a -> b) -> a -> b
$
\Module
m Int
index -> (Module
m, Char
'M' Char -> ShowS
forall a. a -> [a] -> [a]
: Int -> HsImportName
forall a. Show a => a -> HsImportName
show Int
index)
let exceptionNamesToIds :: Map ExtName ExceptionId
exceptionNamesToIds =
[(ExtName, ExceptionId)] -> Map ExtName ExceptionId
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(ExtName, ExceptionId)] -> Map ExtName ExceptionId)
-> [(ExtName, ExceptionId)] -> Map ExtName ExceptionId
forall a b. (a -> b) -> a -> b
$
[ExtName] -> [ExceptionId] -> [(ExtName, ExceptionId)]
forall a b. [a] -> [b] -> [(a, b)]
zip ((Class -> ExtName) -> [Class] -> [ExtName]
forall a b. (a -> b) -> [a] -> [b]
map Class -> ExtName
classExtName ([Class] -> [ExtName]) -> [Class] -> [ExtName]
forall a b. (a -> b) -> a -> b
$ [Module] -> [Class]
interfaceAllExceptionClasses' [Module]
modules)
((Int -> ExceptionId) -> [Int] -> [ExceptionId]
forall a b. (a -> b) -> [a] -> [b]
map Int -> ExceptionId
ExceptionId [Int
exceptionFirstFreeId..])
Interface -> Either HsImportName Interface
forall a. a -> Either HsImportName a
forall (m :: * -> *) a. Monad m => a -> m a
return Interface
{ interfaceName :: HsImportName
interfaceName = HsImportName
ifName
, interfaceModules :: Map HsImportName Module
interfaceModules = [(HsImportName, Module)] -> Map HsImportName Module
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(HsImportName, Module)] -> Map HsImportName Module)
-> [(HsImportName, Module)] -> Map HsImportName Module
forall a b. (a -> b) -> a -> b
$ (Module -> (HsImportName, Module))
-> [Module] -> [(HsImportName, Module)]
forall a b. (a -> b) -> [a] -> [b]
map (Module -> HsImportName
moduleName (Module -> HsImportName)
-> (Module -> Module) -> Module -> (HsImportName, Module)
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Module -> Module
forall a. a -> a
id) [Module]
modules
, interfaceNamesToModules :: Map ExtName Module
interfaceNamesToModules = ([Module] -> Module) -> Map ExtName [Module] -> Map ExtName Module
forall a b k. (a -> b) -> Map k a -> Map k b
M.map (\[Module
x] -> Module
x) Map ExtName [Module]
extNamesToModules
, interfaceHaskellModuleBase' :: Maybe [HsImportName]
interfaceHaskellModuleBase' = Maybe [HsImportName]
forall a. Maybe a
Nothing
, interfaceHaskellModuleImportNames :: Map Module HsImportName
interfaceHaskellModuleImportNames = Map Module HsImportName
haskellModuleImportNames
, interfaceExceptionHandlers :: ExceptionHandlers
interfaceExceptionHandlers = InterfaceOptions -> ExceptionHandlers
interfaceOptionsExceptionHandlers InterfaceOptions
options
, interfaceCallbacksThrow :: Bool
interfaceCallbacksThrow = Bool
False
, interfaceExceptionNamesToIds :: Map ExtName ExceptionId
interfaceExceptionNamesToIds = Map ExtName ExceptionId
exceptionNamesToIds
, interfaceExceptionSupportModule :: Maybe Module
interfaceExceptionSupportModule = Maybe Module
forall a. Maybe a
Nothing
, interfaceSharedPtr :: (Reqs, HsImportName)
interfaceSharedPtr = (Include -> Reqs
reqInclude (Include -> Reqs) -> Include -> Reqs
forall a b. (a -> b) -> a -> b
$ HsImportName -> Include
includeStd HsImportName
"memory", HsImportName
"std::shared_ptr")
, interfaceCompiler :: Maybe SomeCompiler
interfaceCompiler = SomeCompiler -> Maybe SomeCompiler
forall a. a -> Maybe a
Just (SomeCompiler -> Maybe SomeCompiler)
-> SomeCompiler -> Maybe SomeCompiler
forall a b. (a -> b) -> a -> b
$ SimpleCompiler -> SomeCompiler
forall a. Compiler a => a -> SomeCompiler
SomeCompiler SimpleCompiler
defaultCompiler
, interfaceHooks :: Hooks
interfaceHooks = Hooks
defaultHooks
, interfaceValidateEnumTypes :: Bool
interfaceValidateEnumTypes = Bool
True
}
interfaceHaskellModuleBase :: Interface -> [String]
interfaceHaskellModuleBase :: Interface -> [HsImportName]
interfaceHaskellModuleBase =
[HsImportName] -> Maybe [HsImportName] -> [HsImportName]
forall a. a -> Maybe a -> a
fromMaybe [HsImportName]
interfaceDefaultHaskellModuleBase (Maybe [HsImportName] -> [HsImportName])
-> (Interface -> Maybe [HsImportName])
-> Interface
-> [HsImportName]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Interface -> Maybe [HsImportName]
interfaceHaskellModuleBase'
interfaceDefaultHaskellModuleBase :: [String]
interfaceDefaultHaskellModuleBase :: [HsImportName]
interfaceDefaultHaskellModuleBase = [HsImportName
"Foreign", HsImportName
"Hoppy", HsImportName
"Generated"]
interfaceAddHaskellModuleBase :: [String] -> Interface -> Either String Interface
interfaceAddHaskellModuleBase :: [HsImportName] -> Interface -> Either HsImportName Interface
interfaceAddHaskellModuleBase [HsImportName]
modulePath Interface
iface = case Interface -> Maybe [HsImportName]
interfaceHaskellModuleBase' Interface
iface of
Maybe [HsImportName]
Nothing -> Interface -> Either HsImportName Interface
forall a b. b -> Either a b
Right Interface
iface { interfaceHaskellModuleBase' = Just modulePath }
Just [HsImportName]
existingPath ->
HsImportName -> Either HsImportName Interface
forall a b. a -> Either a b
Left (HsImportName -> Either HsImportName Interface)
-> HsImportName -> Either HsImportName Interface
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ HsImportName
"addInterfaceHaskellModuleBase: Trying to add Haskell module base "
, HsImportName -> [HsImportName] -> HsImportName
forall a. [a] -> [[a]] -> [a]
intercalate HsImportName
"." [HsImportName]
modulePath, HsImportName
" to ", Interface -> HsImportName
forall a. Show a => a -> HsImportName
show Interface
iface
, HsImportName
" which already has a module base ", HsImportName -> [HsImportName] -> HsImportName
forall a. [a] -> [[a]] -> [a]
intercalate HsImportName
"." [HsImportName]
existingPath
]
interfaceExceptionClassId :: Interface -> Class -> Maybe ExceptionId
interfaceExceptionClassId :: Interface -> Class -> Maybe ExceptionId
interfaceExceptionClassId Interface
iface Class
cls =
ExtName -> Map ExtName ExceptionId -> Maybe ExceptionId
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup (Class -> ExtName
classExtName Class
cls) (Map ExtName ExceptionId -> Maybe ExceptionId)
-> Map ExtName ExceptionId -> Maybe ExceptionId
forall a b. (a -> b) -> a -> b
$ Interface -> Map ExtName ExceptionId
interfaceExceptionNamesToIds Interface
iface
interfaceAllExceptionClasses :: Interface -> [Class]
interfaceAllExceptionClasses :: Interface -> [Class]
interfaceAllExceptionClasses = [Module] -> [Class]
interfaceAllExceptionClasses' ([Module] -> [Class])
-> (Interface -> [Module]) -> Interface -> [Class]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map HsImportName Module -> [Module]
forall k a. Map k a -> [a]
M.elems (Map HsImportName Module -> [Module])
-> (Interface -> Map HsImportName Module) -> Interface -> [Module]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Interface -> Map HsImportName Module
interfaceModules
interfaceAllExceptionClasses' :: [Module] -> [Class]
interfaceAllExceptionClasses' :: [Module] -> [Class]
interfaceAllExceptionClasses' [Module]
modules =
((Module -> [Class]) -> [Module] -> [Class])
-> [Module] -> (Module -> [Class]) -> [Class]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Module -> [Class]) -> [Module] -> [Class]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap [Module]
modules ((Module -> [Class]) -> [Class]) -> (Module -> [Class]) -> [Class]
forall a b. (a -> b) -> a -> b
$ \Module
m ->
[Maybe Class] -> [Class]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe Class] -> [Class]) -> [Maybe Class] -> [Class]
forall a b. (a -> b) -> a -> b
$
(Export -> Maybe Class) -> [Export] -> [Maybe Class]
forall a b. (a -> b) -> [a] -> [b]
map Export -> Maybe Class
forall a. Exportable a => a -> Maybe Class
getExportExceptionClass ([Export] -> [Maybe Class]) -> [Export] -> [Maybe Class]
forall a b. (a -> b) -> a -> b
$
Map ExtName Export -> [Export]
forall k a. Map k a -> [a]
M.elems (Map ExtName Export -> [Export]) -> Map ExtName Export -> [Export]
forall a b. (a -> b) -> a -> b
$ Module -> Map ExtName Export
moduleExports Module
m
interfaceSetCallbacksThrow :: Bool -> Interface -> Interface
interfaceSetCallbacksThrow :: Bool -> Interface -> Interface
interfaceSetCallbacksThrow Bool
b Interface
iface = Interface
iface { interfaceCallbacksThrow = b }
interfaceSetExceptionSupportModule :: HasCallStack => Module -> Interface -> Interface
interfaceSetExceptionSupportModule :: HasCallStack => Module -> Interface -> Interface
interfaceSetExceptionSupportModule Module
m Interface
iface = case Interface -> Maybe Module
interfaceExceptionSupportModule Interface
iface of
Maybe Module
Nothing -> Interface
iface { interfaceExceptionSupportModule = Just m }
Just Module
existingMod ->
if Module
m Module -> Module -> Bool
forall a. Eq a => a -> a -> Bool
== Module
existingMod
then Interface
iface
else HsImportName -> Interface
forall a. HasCallStack => HsImportName -> a
error (HsImportName -> Interface) -> HsImportName -> Interface
forall a b. (a -> b) -> a -> b
$ HsImportName
"interfaceSetExceptionSupportModule: " HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ Interface -> HsImportName
forall a. Show a => a -> HsImportName
show Interface
iface HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++
HsImportName
" already has exception support module " HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ Module -> HsImportName
forall a. Show a => a -> HsImportName
show Module
existingMod HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++
HsImportName
", trying to set " HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ Module -> HsImportName
forall a. Show a => a -> HsImportName
show Module
m HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
"."
interfaceSetSharedPtr :: String -> Reqs -> Interface -> Interface
interfaceSetSharedPtr :: HsImportName -> Reqs -> Interface -> Interface
interfaceSetSharedPtr HsImportName
identifier Reqs
reqs Interface
iface =
Interface
iface { interfaceSharedPtr = (reqs, identifier) }
interfaceSetCompiler :: Compiler a => a -> Interface -> Interface
interfaceSetCompiler :: forall a. Compiler a => a -> Interface -> Interface
interfaceSetCompiler = Maybe SomeCompiler -> Interface -> Interface
interfaceSetCompiler' (Maybe SomeCompiler -> Interface -> Interface)
-> (a -> Maybe SomeCompiler) -> a -> Interface -> Interface
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeCompiler -> Maybe SomeCompiler
forall a. a -> Maybe a
Just (SomeCompiler -> Maybe SomeCompiler)
-> (a -> SomeCompiler) -> a -> Maybe SomeCompiler
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> SomeCompiler
forall a. Compiler a => a -> SomeCompiler
SomeCompiler
interfaceSetCompiler' :: Maybe SomeCompiler -> Interface -> Interface
interfaceSetCompiler' :: Maybe SomeCompiler -> Interface -> Interface
interfaceSetCompiler' Maybe SomeCompiler
compiler Interface
iface = Interface
iface { interfaceCompiler = compiler }
interfaceSetNoCompiler :: Interface -> Interface
interfaceSetNoCompiler :: Interface -> Interface
interfaceSetNoCompiler =
Bool -> Interface -> Interface
interfaceSetValidateEnumTypes Bool
False (Interface -> Interface)
-> (Interface -> Interface) -> Interface -> Interface
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Maybe SomeCompiler -> Interface -> Interface
interfaceSetCompiler' Maybe SomeCompiler
forall a. Maybe a
Nothing
interfaceSetValidateEnumTypes :: Bool -> Interface -> Interface
interfaceSetValidateEnumTypes :: Bool -> Interface -> Interface
interfaceSetValidateEnumTypes Bool
validate Interface
iface =
Interface
iface { interfaceValidateEnumTypes = validate }
interfaceModifyHooks :: (Hooks -> Hooks) -> Interface -> Interface
interfaceModifyHooks :: (Hooks -> Hooks) -> Interface -> Interface
interfaceModifyHooks Hooks -> Hooks
f Interface
iface =
Interface
iface { interfaceHooks = f $ interfaceHooks iface }
newtype Include = Include
{ Include -> HsImportName
includeToString :: String
} deriving (Include -> Include -> Bool
(Include -> Include -> Bool)
-> (Include -> Include -> Bool) -> Eq Include
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Include -> Include -> Bool
== :: Include -> Include -> Bool
$c/= :: Include -> Include -> Bool
/= :: Include -> Include -> Bool
Eq, Eq Include
Eq Include =>
(Include -> Include -> Ordering)
-> (Include -> Include -> Bool)
-> (Include -> Include -> Bool)
-> (Include -> Include -> Bool)
-> (Include -> Include -> Bool)
-> (Include -> Include -> Include)
-> (Include -> Include -> Include)
-> Ord Include
Include -> Include -> Bool
Include -> Include -> Ordering
Include -> Include -> Include
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
$ccompare :: Include -> Include -> Ordering
compare :: Include -> Include -> Ordering
$c< :: Include -> Include -> Bool
< :: Include -> Include -> Bool
$c<= :: Include -> Include -> Bool
<= :: Include -> Include -> Bool
$c> :: Include -> Include -> Bool
> :: Include -> Include -> Bool
$c>= :: Include -> Include -> Bool
>= :: Include -> Include -> Bool
$cmax :: Include -> Include -> Include
max :: Include -> Include -> Include
$cmin :: Include -> Include -> Include
min :: Include -> Include -> Include
Ord, Int -> Include -> ShowS
[Include] -> ShowS
Include -> HsImportName
(Int -> Include -> ShowS)
-> (Include -> HsImportName)
-> ([Include] -> ShowS)
-> Show Include
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Include -> ShowS
showsPrec :: Int -> Include -> ShowS
$cshow :: Include -> HsImportName
show :: Include -> HsImportName
$cshowList :: [Include] -> ShowS
showList :: [Include] -> ShowS
Show)
includeStd :: String -> Include
includeStd :: HsImportName -> Include
includeStd HsImportName
path = HsImportName -> Include
Include (HsImportName -> Include) -> HsImportName -> Include
forall a b. (a -> b) -> a -> b
$ HsImportName
"#include <" HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
path HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
">\n"
includeLocal :: String -> Include
includeLocal :: HsImportName -> Include
includeLocal HsImportName
path = HsImportName -> Include
Include (HsImportName -> Include) -> HsImportName -> Include
forall a b. (a -> b) -> a -> b
$ HsImportName
"#include \"" HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
path HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
"\"\n"
data Module = Module
{ Module -> HsImportName
moduleName :: String
, Module -> HsImportName
moduleHppPath :: String
, Module -> HsImportName
moduleCppPath :: String
, Module -> Map ExtName Export
moduleExports :: M.Map ExtName Export
, Module -> Reqs
moduleReqs :: Reqs
, Module -> Maybe [HsImportName]
moduleHaskellName :: Maybe [String]
, Module -> ExceptionHandlers
moduleExceptionHandlers :: ExceptionHandlers
, Module -> Maybe Bool
moduleCallbacksThrow :: Maybe Bool
, Module -> Addendum
moduleAddendum :: Addendum
}
instance Eq Module where
== :: Module -> Module -> Bool
(==) = HsImportName -> HsImportName -> Bool
forall a. Eq a => a -> a -> Bool
(==) (HsImportName -> HsImportName -> Bool)
-> (Module -> HsImportName) -> Module -> Module -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Module -> HsImportName
moduleName
instance Ord Module where
compare :: Module -> Module -> Ordering
compare = HsImportName -> HsImportName -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (HsImportName -> HsImportName -> Ordering)
-> (Module -> HsImportName) -> Module -> Module -> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Module -> HsImportName
moduleName
instance Show Module where
show :: Module -> HsImportName
show Module
m = [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName
"<Module ", Module -> HsImportName
moduleName Module
m, HsImportName
">"]
instance HasExports Module where
lookupExport :: ExtName -> Module -> Maybe Export
lookupExport ExtName
name Module
m = ExtName -> Map ExtName Export -> Maybe Export
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup ExtName
name (Map ExtName Export -> Maybe Export)
-> Map ExtName Export -> Maybe Export
forall a b. (a -> b) -> a -> b
$ Module -> Map ExtName Export
moduleExports Module
m
instance HasReqs Module where
getReqs :: Module -> Reqs
getReqs = Module -> Reqs
moduleReqs
setReqs :: Reqs -> Module -> Module
setReqs Reqs
reqs Module
m = Module
m { moduleReqs = reqs }
instance HasAddendum Module where
getAddendum :: Module -> Addendum
getAddendum = Module -> Addendum
moduleAddendum
setAddendum :: Addendum -> Module -> Module
setAddendum Addendum
addendum Module
m = Module
m { moduleAddendum = addendum }
instance HandlesExceptions Module where
getExceptionHandlers :: Module -> ExceptionHandlers
getExceptionHandlers = Module -> ExceptionHandlers
moduleExceptionHandlers
modifyExceptionHandlers :: (ExceptionHandlers -> ExceptionHandlers) -> Module -> Module
modifyExceptionHandlers ExceptionHandlers -> ExceptionHandlers
f Module
m = Module
m { moduleExceptionHandlers = f $ moduleExceptionHandlers m }
makeModule :: String
-> String
-> String
-> Module
makeModule :: HsImportName -> HsImportName -> HsImportName -> Module
makeModule HsImportName
name HsImportName
hppPath HsImportName
cppPath = Module
{ moduleName :: HsImportName
moduleName = HsImportName
name
, moduleHppPath :: HsImportName
moduleHppPath = HsImportName
hppPath
, moduleCppPath :: HsImportName
moduleCppPath = HsImportName
cppPath
, moduleExports :: Map ExtName Export
moduleExports = Map ExtName Export
forall k a. Map k a
M.empty
, moduleReqs :: Reqs
moduleReqs = Reqs
forall a. Monoid a => a
mempty
, moduleHaskellName :: Maybe [HsImportName]
moduleHaskellName = Maybe [HsImportName]
forall a. Maybe a
Nothing
, moduleExceptionHandlers :: ExceptionHandlers
moduleExceptionHandlers = ExceptionHandlers
forall a. Monoid a => a
mempty
, moduleCallbacksThrow :: Maybe Bool
moduleCallbacksThrow = Maybe Bool
forall a. Maybe a
Nothing
, moduleAddendum :: Addendum
moduleAddendum = Addendum
forall a. Monoid a => a
mempty
}
moduleModify :: Module -> StateT Module (Either String) () -> Either ErrorMsg Module
moduleModify :: Module
-> StateT Module (Either HsImportName) ()
-> Either HsImportName Module
moduleModify = (StateT Module (Either HsImportName) ()
-> Module -> Either HsImportName Module)
-> Module
-> StateT Module (Either HsImportName) ()
-> Either HsImportName Module
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT Module (Either HsImportName) ()
-> Module -> Either HsImportName Module
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m s
execStateT
moduleModify' :: HasCallStack => Module -> StateT Module (Either String) () -> Module
moduleModify' :: HasCallStack =>
Module -> StateT Module (Either HsImportName) () -> Module
moduleModify' Module
m StateT Module (Either HsImportName) ()
action = case Module
-> StateT Module (Either HsImportName) ()
-> Either HsImportName Module
moduleModify Module
m StateT Module (Either HsImportName) ()
action of
Left HsImportName
errorMsg ->
HsImportName -> Module
forall a. HasCallStack => HsImportName -> a
error (HsImportName -> Module) -> HsImportName -> Module
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[HsImportName
"moduleModify' failed to modify ", Module -> HsImportName
forall a. Show a => a -> HsImportName
show Module
m, HsImportName
": ", HsImportName
errorMsg]
Right Module
m' -> Module
m'
moduleSetHppPath :: MonadState Module m => String -> m ()
moduleSetHppPath :: forall (m :: * -> *). MonadState Module m => HsImportName -> m ()
moduleSetHppPath HsImportName
path = (Module -> Module) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((Module -> Module) -> m ()) -> (Module -> Module) -> m ()
forall a b. (a -> b) -> a -> b
$ \Module
m -> Module
m { moduleHppPath = path }
moduleSetCppPath :: MonadState Module m => String -> m ()
moduleSetCppPath :: forall (m :: * -> *). MonadState Module m => HsImportName -> m ()
moduleSetCppPath HsImportName
path = (Module -> Module) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((Module -> Module) -> m ()) -> (Module -> Module) -> m ()
forall a b. (a -> b) -> a -> b
$ \Module
m -> Module
m { moduleCppPath = path }
moduleAddExports :: (MonadError String m, MonadState Module m) => [Export] -> m ()
moduleAddExports :: forall (m :: * -> *).
(MonadError HsImportName m, MonadState Module m) =>
[Export] -> m ()
moduleAddExports [Export]
exports = do
Module
m <- m Module
forall s (m :: * -> *). MonadState s m => m s
get
let existingExports :: Map ExtName Export
existingExports = Module -> Map ExtName Export
moduleExports Module
m
newExports :: Map ExtName Export
newExports = [(ExtName, Export)] -> Map ExtName Export
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(ExtName, Export)] -> Map ExtName Export)
-> [(ExtName, Export)] -> Map ExtName Export
forall a b. (a -> b) -> a -> b
$ (Export -> (ExtName, Export)) -> [Export] -> [(ExtName, Export)]
forall a b. (a -> b) -> [a] -> [b]
map (Export -> ExtName
forall a. HasExtNames a => a -> ExtName
getPrimaryExtName (Export -> ExtName)
-> (Export -> Export) -> Export -> (ExtName, Export)
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Export -> Export
forall a. a -> a
id) [Export]
exports
duplicateNames :: Set ExtName
duplicateNames = (Set ExtName -> Set ExtName -> Set ExtName
forall a. Ord a => Set a -> Set a -> Set a
S.intersection (Set ExtName -> Set ExtName -> Set ExtName)
-> (Map ExtName Export -> Set ExtName)
-> Map ExtName Export
-> Map ExtName Export
-> Set ExtName
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Map ExtName Export -> Set ExtName
forall k a. Map k a -> Set k
M.keysSet) Map ExtName Export
existingExports Map ExtName Export
newExports
if Set ExtName -> Bool
forall a. Set a -> Bool
S.null Set ExtName
duplicateNames
then Module -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put Module
m { moduleExports = existingExports `mappend` newExports }
else HsImportName -> m ()
forall a. HsImportName -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (HsImportName -> m ()) -> HsImportName -> m ()
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[HsImportName
"moduleAddExports: ", Module -> HsImportName
forall a. Show a => a -> HsImportName
show Module
m, HsImportName
" defines external names multiple times: ",
Set ExtName -> HsImportName
forall a. Show a => a -> HsImportName
show Set ExtName
duplicateNames]
moduleAddHaskellName :: (MonadError String m, MonadState Module m) => [String] -> m ()
moduleAddHaskellName :: forall (m :: * -> *).
(MonadError HsImportName m, MonadState Module m) =>
[HsImportName] -> m ()
moduleAddHaskellName [HsImportName]
name = do
Module
m <- m Module
forall s (m :: * -> *). MonadState s m => m s
get
case Module -> Maybe [HsImportName]
moduleHaskellName Module
m of
Maybe [HsImportName]
Nothing -> Module -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put Module
m { moduleHaskellName = Just name }
Just [HsImportName]
name' ->
HsImportName -> m ()
forall a. HsImportName -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (HsImportName -> m ()) -> HsImportName -> m ()
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[HsImportName
"moduleAddHaskellName: ", Module -> HsImportName
forall a. Show a => a -> HsImportName
show Module
m, HsImportName
" already has Haskell name ",
[HsImportName] -> HsImportName
forall a. Show a => a -> HsImportName
show [HsImportName]
name', HsImportName
"; trying to add name ", [HsImportName] -> HsImportName
forall a. Show a => a -> HsImportName
show [HsImportName]
name, HsImportName
"."]
moduleSetCallbacksThrow :: MonadState Module m => Maybe Bool -> m ()
moduleSetCallbacksThrow :: forall (m :: * -> *). MonadState Module m => Maybe Bool -> m ()
moduleSetCallbacksThrow Maybe Bool
b = (Module -> Module) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((Module -> Module) -> m ()) -> (Module -> Module) -> m ()
forall a b. (a -> b) -> a -> b
$ \Module
m -> Module
m { moduleCallbacksThrow = b }
newtype Reqs = Reqs
{ Reqs -> Set Include
reqsIncludes :: S.Set Include
} deriving (Int -> Reqs -> ShowS
[Reqs] -> ShowS
Reqs -> HsImportName
(Int -> Reqs -> ShowS)
-> (Reqs -> HsImportName) -> ([Reqs] -> ShowS) -> Show Reqs
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Reqs -> ShowS
showsPrec :: Int -> Reqs -> ShowS
$cshow :: Reqs -> HsImportName
show :: Reqs -> HsImportName
$cshowList :: [Reqs] -> ShowS
showList :: [Reqs] -> ShowS
Show)
instance Sem.Semigroup Reqs where
<> :: Reqs -> Reqs -> Reqs
(<>) (Reqs Set Include
incl) (Reqs Set Include
incl') = Set Include -> Reqs
Reqs (Set Include -> Reqs) -> Set Include -> Reqs
forall a b. (a -> b) -> a -> b
$ Set Include -> Set Include -> Set Include
forall a. Monoid a => a -> a -> a
mappend Set Include
incl Set Include
incl'
instance Monoid Reqs where
mempty :: Reqs
mempty = Set Include -> Reqs
Reqs Set Include
forall a. Monoid a => a
mempty
mappend :: Reqs -> Reqs -> Reqs
mappend = Reqs -> Reqs -> Reqs
forall a. Semigroup a => a -> a -> a
(<>)
mconcat :: [Reqs] -> Reqs
mconcat [Reqs]
reqs = Set Include -> Reqs
Reqs (Set Include -> Reqs) -> Set Include -> Reqs
forall a b. (a -> b) -> a -> b
$ [Set Include] -> Set Include
forall a. Monoid a => [a] -> a
mconcat ([Set Include] -> Set Include) -> [Set Include] -> Set Include
forall a b. (a -> b) -> a -> b
$ (Reqs -> Set Include) -> [Reqs] -> [Set Include]
forall a b. (a -> b) -> [a] -> [b]
map Reqs -> Set Include
reqsIncludes [Reqs]
reqs
reqInclude :: Include -> Reqs
reqInclude :: Include -> Reqs
reqInclude Include
include = Reqs
forall a. Monoid a => a
mempty { reqsIncludes = S.singleton include }
class HasReqs a where
{-# MINIMAL getReqs, (setReqs | modifyReqs) #-}
getReqs :: a -> Reqs
setReqs :: Reqs -> a -> a
setReqs = (Reqs -> Reqs) -> a -> a
forall a. HasReqs a => (Reqs -> Reqs) -> a -> a
modifyReqs ((Reqs -> Reqs) -> a -> a)
-> (Reqs -> Reqs -> Reqs) -> Reqs -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reqs -> Reqs -> Reqs
forall a b. a -> b -> a
const
modifyReqs :: (Reqs -> Reqs) -> a -> a
modifyReqs Reqs -> Reqs
f a
x = Reqs -> a -> a
forall a. HasReqs a => Reqs -> a -> a
setReqs (Reqs -> Reqs
f (Reqs -> Reqs) -> Reqs -> Reqs
forall a b. (a -> b) -> a -> b
$ a -> Reqs
forall a. HasReqs a => a -> Reqs
getReqs a
x) a
x
addReqs :: HasReqs a => Reqs -> a -> a
addReqs :: forall a. HasReqs a => Reqs -> a -> a
addReqs Reqs
reqs = (Reqs -> Reqs) -> a -> a
forall a. HasReqs a => (Reqs -> Reqs) -> a -> a
modifyReqs ((Reqs -> Reqs) -> a -> a) -> (Reqs -> Reqs) -> a -> a
forall a b. (a -> b) -> a -> b
$ Reqs -> Reqs -> Reqs
forall a. Monoid a => a -> a -> a
mappend Reqs
reqs
addReqIncludes :: HasReqs a => [Include] -> a -> a
addReqIncludes :: forall a. HasReqs a => [Include] -> a -> a
addReqIncludes [Include]
includes =
(Reqs -> Reqs) -> a -> a
forall a. HasReqs a => (Reqs -> Reqs) -> a -> a
modifyReqs ((Reqs -> Reqs) -> a -> a) -> (Reqs -> Reqs) -> a -> a
forall a b. (a -> b) -> a -> b
$ Reqs -> Reqs -> Reqs
forall a. Monoid a => a -> a -> a
mappend Reqs
forall a. Monoid a => a
mempty { reqsIncludes = S.fromList includes }
newtype ExtName = ExtName
{ ExtName -> HsImportName
fromExtName :: String
} deriving (ExtName -> ExtName -> Bool
(ExtName -> ExtName -> Bool)
-> (ExtName -> ExtName -> Bool) -> Eq ExtName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ExtName -> ExtName -> Bool
== :: ExtName -> ExtName -> Bool
$c/= :: ExtName -> ExtName -> Bool
/= :: ExtName -> ExtName -> Bool
Eq, NonEmpty ExtName -> ExtName
ExtName -> ExtName -> ExtName
(ExtName -> ExtName -> ExtName)
-> (NonEmpty ExtName -> ExtName)
-> (forall b. Integral b => b -> ExtName -> ExtName)
-> Semigroup ExtName
forall b. Integral b => b -> ExtName -> ExtName
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: ExtName -> ExtName -> ExtName
<> :: ExtName -> ExtName -> ExtName
$csconcat :: NonEmpty ExtName -> ExtName
sconcat :: NonEmpty ExtName -> ExtName
$cstimes :: forall b. Integral b => b -> ExtName -> ExtName
stimes :: forall b. Integral b => b -> ExtName -> ExtName
Sem.Semigroup, Semigroup ExtName
ExtName
Semigroup ExtName =>
ExtName
-> (ExtName -> ExtName -> ExtName)
-> ([ExtName] -> ExtName)
-> Monoid ExtName
[ExtName] -> ExtName
ExtName -> ExtName -> ExtName
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: ExtName
mempty :: ExtName
$cmappend :: ExtName -> ExtName -> ExtName
mappend :: ExtName -> ExtName -> ExtName
$cmconcat :: [ExtName] -> ExtName
mconcat :: [ExtName] -> ExtName
Monoid, Eq ExtName
Eq ExtName =>
(ExtName -> ExtName -> Ordering)
-> (ExtName -> ExtName -> Bool)
-> (ExtName -> ExtName -> Bool)
-> (ExtName -> ExtName -> Bool)
-> (ExtName -> ExtName -> Bool)
-> (ExtName -> ExtName -> ExtName)
-> (ExtName -> ExtName -> ExtName)
-> Ord ExtName
ExtName -> ExtName -> Bool
ExtName -> ExtName -> Ordering
ExtName -> ExtName -> ExtName
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
$ccompare :: ExtName -> ExtName -> Ordering
compare :: ExtName -> ExtName -> Ordering
$c< :: ExtName -> ExtName -> Bool
< :: ExtName -> ExtName -> Bool
$c<= :: ExtName -> ExtName -> Bool
<= :: ExtName -> ExtName -> Bool
$c> :: ExtName -> ExtName -> Bool
> :: ExtName -> ExtName -> Bool
$c>= :: ExtName -> ExtName -> Bool
>= :: ExtName -> ExtName -> Bool
$cmax :: ExtName -> ExtName -> ExtName
max :: ExtName -> ExtName -> ExtName
$cmin :: ExtName -> ExtName -> ExtName
min :: ExtName -> ExtName -> ExtName
Ord)
instance Show ExtName where
show :: ExtName -> HsImportName
show ExtName
extName = [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName
"$\"", ExtName -> HsImportName
fromExtName ExtName
extName, HsImportName
"\"$"]
toExtName :: HasCallStack => String -> ExtName
toExtName :: HasCallStack => HsImportName -> ExtName
toExtName HsImportName
str = case HsImportName
str of
[] -> HsImportName -> ExtName
forall a. HasCallStack => HsImportName -> a
error HsImportName
"An ExtName cannot be empty."
HsImportName
_ -> if HsImportName -> Bool
isValidExtName HsImportName
str
then HsImportName -> ExtName
ExtName HsImportName
str
else HsImportName -> ExtName
forall a. HasCallStack => HsImportName -> a
error (HsImportName -> ExtName) -> HsImportName -> ExtName
forall a b. (a -> b) -> a -> b
$
HsImportName
"An ExtName must start with a letter and only contain letters, numbers, and '_': " HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++
ShowS
forall a. Show a => a -> HsImportName
show HsImportName
str
isValidExtName :: String -> Bool
isValidExtName :: HsImportName -> Bool
isValidExtName HsImportName
str = case HsImportName
str of
[] -> Bool
False
Char
c:HsImportName
cs -> Char -> Bool
isAlpha Char
c Bool -> Bool -> Bool
&& (Char -> Bool) -> HsImportName -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Bool -> Bool -> Bool
(||) (Bool -> Bool -> Bool) -> (Char -> Bool) -> Char -> Bool -> Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char -> Bool
isAlphaNum (Char -> Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall a b. (Char -> a -> b) -> (Char -> a) -> Char -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_')) HsImportName
cs
extNameOrIdentifier :: HasCallStack => Identifier -> Maybe ExtName -> ExtName
extNameOrIdentifier :: HasCallStack => Identifier -> Maybe ExtName -> ExtName
extNameOrIdentifier Identifier
identifier = ExtName -> Maybe ExtName -> ExtName
forall a. a -> Maybe a -> a
fromMaybe (ExtName -> Maybe ExtName -> ExtName)
-> ExtName -> Maybe ExtName -> ExtName
forall a b. (a -> b) -> a -> b
$ case Identifier -> [IdPart]
identifierParts Identifier
identifier of
[] -> HsImportName -> ExtName
forall a. HasCallStack => HsImportName -> a
error HsImportName
"extNameOrIdentifier: Invalid empty identifier."
[IdPart]
parts -> HasCallStack => HsImportName -> ExtName
HsImportName -> ExtName
toExtName (HsImportName -> ExtName) -> HsImportName -> ExtName
forall a b. (a -> b) -> a -> b
$ IdPart -> HsImportName
idPartBase (IdPart -> HsImportName) -> IdPart -> HsImportName
forall a b. (a -> b) -> a -> b
$ [IdPart] -> IdPart
forall a. HasCallStack => [a] -> a
last [IdPart]
parts
extNameOrFnIdentifier :: HasCallStack => FnName Identifier -> Maybe ExtName -> ExtName
extNameOrFnIdentifier :: HasCallStack => FnName Identifier -> Maybe ExtName -> ExtName
extNameOrFnIdentifier FnName Identifier
name =
ExtName -> Maybe ExtName -> ExtName
forall a. a -> Maybe a -> a
fromMaybe (ExtName -> Maybe ExtName -> ExtName)
-> ExtName -> Maybe ExtName -> ExtName
forall a b. (a -> b) -> a -> b
$ case FnName Identifier
name of
FnName Identifier
identifier -> case Identifier -> [IdPart]
identifierParts Identifier
identifier of
[] -> HsImportName -> ExtName
forall a. HasCallStack => HsImportName -> a
error HsImportName
"extNameOrFnIdentifier: Empty idenfitier."
[IdPart]
parts -> HasCallStack => HsImportName -> ExtName
HsImportName -> ExtName
toExtName (HsImportName -> ExtName) -> HsImportName -> ExtName
forall a b. (a -> b) -> a -> b
$ IdPart -> HsImportName
idPartBase (IdPart -> HsImportName) -> IdPart -> HsImportName
forall a b. (a -> b) -> a -> b
$ [IdPart] -> IdPart
forall a. HasCallStack => [a] -> a
last [IdPart]
parts
FnOp Operator
op -> HasCallStack => Operator -> ExtName
Operator -> ExtName
operatorPreferredExtName Operator
op
extNameOrString :: String -> Maybe ExtName -> ExtName
extNameOrString :: HsImportName -> Maybe ExtName -> ExtName
extNameOrString HsImportName
str = ExtName -> Maybe ExtName -> ExtName
forall a. a -> Maybe a -> a
fromMaybe (ExtName -> Maybe ExtName -> ExtName)
-> ExtName -> Maybe ExtName -> ExtName
forall a b. (a -> b) -> a -> b
$ HasCallStack => HsImportName -> ExtName
HsImportName -> ExtName
toExtName HsImportName
str
class HasExtNames a where
getPrimaryExtName :: a -> ExtName
getNestedExtNames :: a -> [ExtName]
getNestedExtNames a
_ = []
getAllExtNames :: HasExtNames a => a -> [ExtName]
getAllExtNames :: forall a. HasExtNames a => a -> [ExtName]
getAllExtNames a
x = a -> ExtName
forall a. HasExtNames a => a -> ExtName
getPrimaryExtName a
x ExtName -> [ExtName] -> [ExtName]
forall a. a -> [a] -> [a]
: a -> [ExtName]
forall a. HasExtNames a => a -> [ExtName]
getNestedExtNames a
x
data FnName name =
FnName name
| FnOp Operator
deriving (FnName name -> FnName name -> Bool
(FnName name -> FnName name -> Bool)
-> (FnName name -> FnName name -> Bool) -> Eq (FnName name)
forall name. Eq name => FnName name -> FnName name -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall name. Eq name => FnName name -> FnName name -> Bool
== :: FnName name -> FnName name -> Bool
$c/= :: forall name. Eq name => FnName name -> FnName name -> Bool
/= :: FnName name -> FnName name -> Bool
Eq, Eq (FnName name)
Eq (FnName name) =>
(FnName name -> FnName name -> Ordering)
-> (FnName name -> FnName name -> Bool)
-> (FnName name -> FnName name -> Bool)
-> (FnName name -> FnName name -> Bool)
-> (FnName name -> FnName name -> Bool)
-> (FnName name -> FnName name -> FnName name)
-> (FnName name -> FnName name -> FnName name)
-> Ord (FnName name)
FnName name -> FnName name -> Bool
FnName name -> FnName name -> Ordering
FnName name -> FnName name -> FnName name
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
forall name. Ord name => Eq (FnName name)
forall name. Ord name => FnName name -> FnName name -> Bool
forall name. Ord name => FnName name -> FnName name -> Ordering
forall name. Ord name => FnName name -> FnName name -> FnName name
$ccompare :: forall name. Ord name => FnName name -> FnName name -> Ordering
compare :: FnName name -> FnName name -> Ordering
$c< :: forall name. Ord name => FnName name -> FnName name -> Bool
< :: FnName name -> FnName name -> Bool
$c<= :: forall name. Ord name => FnName name -> FnName name -> Bool
<= :: FnName name -> FnName name -> Bool
$c> :: forall name. Ord name => FnName name -> FnName name -> Bool
> :: FnName name -> FnName name -> Bool
$c>= :: forall name. Ord name => FnName name -> FnName name -> Bool
>= :: FnName name -> FnName name -> Bool
$cmax :: forall name. Ord name => FnName name -> FnName name -> FnName name
max :: FnName name -> FnName name -> FnName name
$cmin :: forall name. Ord name => FnName name -> FnName name -> FnName name
min :: FnName name -> FnName name -> FnName name
Ord)
instance Show name => Show (FnName name) where
show :: FnName name -> HsImportName
show (FnName name
name) = [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName
"<FnName ", name -> HsImportName
forall a. Show a => a -> HsImportName
show name
name, HsImportName
">"]
show (FnOp Operator
op) = [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName
"<FnOp ", Operator -> HsImportName
forall a. Show a => a -> HsImportName
show Operator
op, HsImportName
">"]
class IsFnName t a where
toFnName :: a -> FnName t
instance IsFnName t (FnName t) where
toFnName :: FnName t -> FnName t
toFnName = FnName t -> FnName t
forall a. a -> a
id
instance IsFnName t t where
toFnName :: t -> FnName t
toFnName = t -> FnName t
forall t. t -> FnName t
FnName
instance IsFnName t Operator where
toFnName :: Operator -> FnName t
toFnName = Operator -> FnName t
forall t. Operator -> FnName t
FnOp
data Operator =
OpCall
| OpComma
| OpAssign
| OpArray
| OpDeref
| OpAddress
| OpAdd
| OpAddAssign
| OpSubtract
| OpSubtractAssign
| OpMultiply
| OpMultiplyAssign
| OpDivide
| OpDivideAssign
| OpModulo
| OpModuloAssign
| OpPlus
| OpMinus
| OpIncPre
| OpIncPost
| OpDecPre
| OpDecPost
| OpEq
| OpNe
| OpLt
| OpLe
| OpGt
| OpGe
| OpNot
| OpAnd
| OpOr
| OpBitNot
| OpBitAnd
| OpBitAndAssign
| OpBitOr
| OpBitOrAssign
| OpBitXor
| OpBitXorAssign
| OpShl
| OpShlAssign
| OpShr
| OpShrAssign
deriving (Operator
Operator -> Operator -> Bounded Operator
forall a. a -> a -> Bounded a
$cminBound :: Operator
minBound :: Operator
$cmaxBound :: Operator
maxBound :: Operator
Bounded, Int -> Operator
Operator -> Int
Operator -> [Operator]
Operator -> Operator
Operator -> Operator -> [Operator]
Operator -> Operator -> Operator -> [Operator]
(Operator -> Operator)
-> (Operator -> Operator)
-> (Int -> Operator)
-> (Operator -> Int)
-> (Operator -> [Operator])
-> (Operator -> Operator -> [Operator])
-> (Operator -> Operator -> [Operator])
-> (Operator -> Operator -> Operator -> [Operator])
-> Enum Operator
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Operator -> Operator
succ :: Operator -> Operator
$cpred :: Operator -> Operator
pred :: Operator -> Operator
$ctoEnum :: Int -> Operator
toEnum :: Int -> Operator
$cfromEnum :: Operator -> Int
fromEnum :: Operator -> Int
$cenumFrom :: Operator -> [Operator]
enumFrom :: Operator -> [Operator]
$cenumFromThen :: Operator -> Operator -> [Operator]
enumFromThen :: Operator -> Operator -> [Operator]
$cenumFromTo :: Operator -> Operator -> [Operator]
enumFromTo :: Operator -> Operator -> [Operator]
$cenumFromThenTo :: Operator -> Operator -> Operator -> [Operator]
enumFromThenTo :: Operator -> Operator -> Operator -> [Operator]
Enum, Operator -> Operator -> Bool
(Operator -> Operator -> Bool)
-> (Operator -> Operator -> Bool) -> Eq Operator
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Operator -> Operator -> Bool
== :: Operator -> Operator -> Bool
$c/= :: Operator -> Operator -> Bool
/= :: Operator -> Operator -> Bool
Eq, Eq Operator
Eq Operator =>
(Operator -> Operator -> Ordering)
-> (Operator -> Operator -> Bool)
-> (Operator -> Operator -> Bool)
-> (Operator -> Operator -> Bool)
-> (Operator -> Operator -> Bool)
-> (Operator -> Operator -> Operator)
-> (Operator -> Operator -> Operator)
-> Ord Operator
Operator -> Operator -> Bool
Operator -> Operator -> Ordering
Operator -> Operator -> Operator
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
$ccompare :: Operator -> Operator -> Ordering
compare :: Operator -> Operator -> Ordering
$c< :: Operator -> Operator -> Bool
< :: Operator -> Operator -> Bool
$c<= :: Operator -> Operator -> Bool
<= :: Operator -> Operator -> Bool
$c> :: Operator -> Operator -> Bool
> :: Operator -> Operator -> Bool
$c>= :: Operator -> Operator -> Bool
>= :: Operator -> Operator -> Bool
$cmax :: Operator -> Operator -> Operator
max :: Operator -> Operator -> Operator
$cmin :: Operator -> Operator -> Operator
min :: Operator -> Operator -> Operator
Ord, Int -> Operator -> ShowS
[Operator] -> ShowS
Operator -> HsImportName
(Int -> Operator -> ShowS)
-> (Operator -> HsImportName)
-> ([Operator] -> ShowS)
-> Show Operator
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Operator -> ShowS
showsPrec :: Int -> Operator -> ShowS
$cshow :: Operator -> HsImportName
show :: Operator -> HsImportName
$cshowList :: [Operator] -> ShowS
showList :: [Operator] -> ShowS
Show)
data OperatorType =
UnaryPrefixOperator String
| UnaryPostfixOperator String
| BinaryOperator String
| CallOperator
| ArrayOperator
data OperatorInfo = OperatorInfo
{ OperatorInfo -> ExtName
operatorPreferredExtName'' :: ExtName
, OperatorInfo -> OperatorType
operatorType' :: OperatorType
}
makeOperatorInfo :: String -> OperatorType -> OperatorInfo
makeOperatorInfo :: HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo = ExtName -> OperatorType -> OperatorInfo
OperatorInfo (ExtName -> OperatorType -> OperatorInfo)
-> (HsImportName -> ExtName)
-> HsImportName
-> OperatorType
-> OperatorInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => HsImportName -> ExtName
HsImportName -> ExtName
toExtName
operatorPreferredExtName :: HasCallStack => Operator -> ExtName
operatorPreferredExtName :: HasCallStack => Operator -> ExtName
operatorPreferredExtName Operator
op = case Operator -> Map Operator OperatorInfo -> Maybe OperatorInfo
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Operator
op Map Operator OperatorInfo
operatorInfo of
Just OperatorInfo
info -> OperatorInfo -> ExtName
operatorPreferredExtName'' OperatorInfo
info
Maybe OperatorInfo
Nothing ->
HsImportName -> ExtName
forall a. HasCallStack => HsImportName -> a
error (HsImportName -> ExtName) -> HsImportName -> ExtName
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[HsImportName
"operatorPreferredExtName: Internal error, missing info for operator ", Operator -> HsImportName
forall a. Show a => a -> HsImportName
show Operator
op, HsImportName
"."]
operatorPreferredExtName' :: Operator -> String
operatorPreferredExtName' :: Operator -> HsImportName
operatorPreferredExtName' = ExtName -> HsImportName
fromExtName (ExtName -> HsImportName)
-> (Operator -> ExtName) -> Operator -> HsImportName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Operator -> ExtName
Operator -> ExtName
operatorPreferredExtName
operatorType :: HasCallStack => Operator -> OperatorType
operatorType :: HasCallStack => Operator -> OperatorType
operatorType Operator
op = case Operator -> Map Operator OperatorInfo -> Maybe OperatorInfo
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Operator
op Map Operator OperatorInfo
operatorInfo of
Just OperatorInfo
info -> OperatorInfo -> OperatorType
operatorType' OperatorInfo
info
Maybe OperatorInfo
Nothing ->
HsImportName -> OperatorType
forall a. HasCallStack => HsImportName -> a
error (HsImportName -> OperatorType) -> HsImportName -> OperatorType
forall a b. (a -> b) -> a -> b
$ [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[HsImportName
"operatorType: Internal error, missing info for operator ", Operator -> HsImportName
forall a. Show a => a -> HsImportName
show Operator
op, HsImportName
"."]
operatorInfo :: M.Map Operator OperatorInfo
operatorInfo :: Map Operator OperatorInfo
operatorInfo =
let input :: [(Operator, OperatorInfo)]
input =
[ (Operator
OpCall, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"CALL" OperatorType
CallOperator)
, (Operator
OpComma, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"COMMA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
",")
, (Operator
OpAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"ASSIGN" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"=")
, (Operator
OpArray, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"ARRAY" OperatorType
ArrayOperator)
, (Operator
OpDeref, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"DEREF" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"*")
, (Operator
OpAddress, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"ADDRESS" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"&")
, (Operator
OpAdd, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"ADD" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"+")
, (Operator
OpAddAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"ADDA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"+=")
, (Operator
OpSubtract, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"SUB" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"-")
, (Operator
OpSubtractAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"SUBA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"-=")
, (Operator
OpMultiply, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"MUL" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"*")
, (Operator
OpMultiplyAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"MULA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"*=")
, (Operator
OpDivide, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"DIV" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"/")
, (Operator
OpDivideAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"DIVA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"/=")
, (Operator
OpModulo, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"MOD" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"%")
, (Operator
OpModuloAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"MODA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"%=")
, (Operator
OpPlus, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"PLUS" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"+")
, (Operator
OpMinus, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"NEG" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"-")
, (Operator
OpIncPre, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"INC" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"++")
, (Operator
OpIncPost, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"INCPOST" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPostfixOperator HsImportName
"++")
, (Operator
OpDecPre, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"DEC" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"--")
, (Operator
OpDecPost, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"DECPOST" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPostfixOperator HsImportName
"--")
, (Operator
OpEq, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"EQ" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"==")
, (Operator
OpNe, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"NE" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"!=")
, (Operator
OpLt, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"LT" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"<")
, (Operator
OpLe, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"LE" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"<=")
, (Operator
OpGt, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"GT" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
">")
, (Operator
OpGe, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"GE" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
">=")
, (Operator
OpNot, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"NOT" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"!")
, (Operator
OpAnd, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"AND" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"&&")
, (Operator
OpOr, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"OR" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"||")
, (Operator
OpBitNot, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BNOT" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
UnaryPrefixOperator HsImportName
"~")
, (Operator
OpBitAnd, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BAND" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"&")
, (Operator
OpBitAndAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BANDA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"&=")
, (Operator
OpBitOr, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BOR" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"|")
, (Operator
OpBitOrAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BORA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"|=")
, (Operator
OpBitXor, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BXOR" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"^")
, (Operator
OpBitXorAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"BXORA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"^=")
, (Operator
OpShl, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"SHL" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"<<")
, (Operator
OpShlAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"SHLA" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
"<<=")
, (Operator
OpShr, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"SHR" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
">>")
, (Operator
OpShrAssign, HsImportName -> OperatorType -> OperatorInfo
makeOperatorInfo HsImportName
"SHR" (OperatorType -> OperatorInfo) -> OperatorType -> OperatorInfo
forall a b. (a -> b) -> a -> b
$ HsImportName -> OperatorType
BinaryOperator HsImportName
">>=")
]
in if ((Operator, OperatorInfo) -> Operator)
-> [(Operator, OperatorInfo)] -> [Operator]
forall a b. (a -> b) -> [a] -> [b]
map (Operator, OperatorInfo) -> Operator
forall a b. (a, b) -> a
fst [(Operator, OperatorInfo)]
input [Operator] -> [Operator] -> Bool
forall a. Eq a => a -> a -> Bool
== [Operator
forall a. Bounded a => a
minBound..]
then [(Operator, OperatorInfo)] -> Map Operator OperatorInfo
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [(Operator, OperatorInfo)]
input
else HsImportName -> Map Operator OperatorInfo
forall a. HasCallStack => HsImportName -> a
error HsImportName
"operatorInfo: Operator info list is out of sync with Operator data type."
class HasExports a where
lookupExport :: ExtName -> a -> Maybe Export
newtype Identifier = Identifier
{ Identifier -> [IdPart]
identifierParts :: [IdPart]
} deriving (Identifier -> Identifier -> Bool
(Identifier -> Identifier -> Bool)
-> (Identifier -> Identifier -> Bool) -> Eq Identifier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Identifier -> Identifier -> Bool
== :: Identifier -> Identifier -> Bool
$c/= :: Identifier -> Identifier -> Bool
/= :: Identifier -> Identifier -> Bool
Eq, Semigroup Identifier
Identifier
Semigroup Identifier =>
Identifier
-> (Identifier -> Identifier -> Identifier)
-> ([Identifier] -> Identifier)
-> Monoid Identifier
[Identifier] -> Identifier
Identifier -> Identifier -> Identifier
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: Identifier
mempty :: Identifier
$cmappend :: Identifier -> Identifier -> Identifier
mappend :: Identifier -> Identifier -> Identifier
$cmconcat :: [Identifier] -> Identifier
mconcat :: [Identifier] -> Identifier
Monoid, NonEmpty Identifier -> Identifier
Identifier -> Identifier -> Identifier
(Identifier -> Identifier -> Identifier)
-> (NonEmpty Identifier -> Identifier)
-> (forall b. Integral b => b -> Identifier -> Identifier)
-> Semigroup Identifier
forall b. Integral b => b -> Identifier -> Identifier
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: Identifier -> Identifier -> Identifier
<> :: Identifier -> Identifier -> Identifier
$csconcat :: NonEmpty Identifier -> Identifier
sconcat :: NonEmpty Identifier -> Identifier
$cstimes :: forall b. Integral b => b -> Identifier -> Identifier
stimes :: forall b. Integral b => b -> Identifier -> Identifier
Sem.Semigroup)
instance Show Identifier where
show :: Identifier -> HsImportName
show Identifier
identifier =
(\[HsImportName]
wordList -> [HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([HsImportName] -> HsImportName) -> [HsImportName] -> HsImportName
forall a b. (a -> b) -> a -> b
$ HsImportName
"<Identifier " HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
: [HsImportName]
wordList [HsImportName] -> [HsImportName] -> [HsImportName]
forall a. [a] -> [a] -> [a]
++ [HsImportName
">"]) ([HsImportName] -> HsImportName) -> [HsImportName] -> HsImportName
forall a b. (a -> b) -> a -> b
$
HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
intersperse HsImportName
"::" ([HsImportName] -> [HsImportName])
-> [HsImportName] -> [HsImportName]
forall a b. (a -> b) -> a -> b
$
(IdPart -> HsImportName) -> [IdPart] -> [HsImportName]
forall a b. (a -> b) -> [a] -> [b]
map (\IdPart
part -> case IdPart -> Maybe [Type]
idPartArgs IdPart
part of
Maybe [Type]
Nothing -> IdPart -> HsImportName
idPartBase IdPart
part
Just [Type]
args ->
[HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([HsImportName] -> HsImportName) -> [HsImportName] -> HsImportName
forall a b. (a -> b) -> a -> b
$
IdPart -> HsImportName
idPartBase IdPart
part HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
: HsImportName
"<" HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
:
HsImportName -> [HsImportName] -> [HsImportName]
forall a. a -> [a] -> [a]
intersperse HsImportName
", " ((Type -> HsImportName) -> [Type] -> [HsImportName]
forall a b. (a -> b) -> [a] -> [b]
map Type -> HsImportName
forall a. Show a => a -> HsImportName
show [Type]
args) [HsImportName] -> [HsImportName] -> [HsImportName]
forall a. [a] -> [a] -> [a]
++ [HsImportName
">"]) ([IdPart] -> [HsImportName]) -> [IdPart] -> [HsImportName]
forall a b. (a -> b) -> a -> b
$
Identifier -> [IdPart]
identifierParts Identifier
identifier
data IdPart = IdPart
{ IdPart -> HsImportName
idPartBase :: String
, IdPart -> Maybe [Type]
idPartArgs :: Maybe [Type]
} deriving (IdPart -> IdPart -> Bool
(IdPart -> IdPart -> Bool)
-> (IdPart -> IdPart -> Bool) -> Eq IdPart
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IdPart -> IdPart -> Bool
== :: IdPart -> IdPart -> Bool
$c/= :: IdPart -> IdPart -> Bool
/= :: IdPart -> IdPart -> Bool
Eq, Int -> IdPart -> ShowS
[IdPart] -> ShowS
IdPart -> HsImportName
(Int -> IdPart -> ShowS)
-> (IdPart -> HsImportName) -> ([IdPart] -> ShowS) -> Show IdPart
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IdPart -> ShowS
showsPrec :: Int -> IdPart -> ShowS
$cshow :: IdPart -> HsImportName
show :: IdPart -> HsImportName
$cshowList :: [IdPart] -> ShowS
showList :: [IdPart] -> ShowS
Show)
makeIdentifier :: [IdPart] -> Identifier
makeIdentifier :: [IdPart] -> Identifier
makeIdentifier = [IdPart] -> Identifier
Identifier
makeIdPart :: String -> Maybe [Type] -> IdPart
makeIdPart :: HsImportName -> Maybe [Type] -> IdPart
makeIdPart = HsImportName -> Maybe [Type] -> IdPart
IdPart
ident :: String -> Identifier
ident :: HsImportName -> Identifier
ident HsImportName
a = [IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a Maybe [Type]
forall a. Maybe a
Nothing]
ident' :: [String] -> Identifier
ident' :: [HsImportName] -> Identifier
ident' = [IdPart] -> Identifier
Identifier ([IdPart] -> Identifier)
-> ([HsImportName] -> [IdPart]) -> [HsImportName] -> Identifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HsImportName -> IdPart) -> [HsImportName] -> [IdPart]
forall a b. (a -> b) -> [a] -> [b]
map (\HsImportName
x -> IdPart { idPartBase :: HsImportName
idPartBase = HsImportName
x, idPartArgs :: Maybe [Type]
idPartArgs = Maybe [Type]
forall a. Maybe a
Nothing })
ident1 :: String -> String -> Identifier
ident1 :: HsImportName -> HsImportName -> Identifier
ident1 HsImportName
a HsImportName
b = [HsImportName] -> Identifier
ident' [HsImportName
a, HsImportName
b]
ident2 :: String -> String -> String -> Identifier
ident2 :: HsImportName -> HsImportName -> HsImportName -> Identifier
ident2 HsImportName
a HsImportName
b HsImportName
c = [HsImportName] -> Identifier
ident' [HsImportName
a, HsImportName
b, HsImportName
c]
ident3 :: String -> String -> String -> String -> Identifier
ident3 :: HsImportName
-> HsImportName -> HsImportName -> HsImportName -> Identifier
ident3 HsImportName
a HsImportName
b HsImportName
c HsImportName
d = [HsImportName] -> Identifier
ident' [HsImportName
a, HsImportName
b, HsImportName
c, HsImportName
d]
ident4 :: String -> String -> String -> String -> String -> Identifier
ident4 :: HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> Identifier
ident4 HsImportName
a HsImportName
b HsImportName
c HsImportName
d HsImportName
e = [HsImportName] -> Identifier
ident' [HsImportName
a, HsImportName
b, HsImportName
c, HsImportName
d, HsImportName
e]
ident5 :: String -> String -> String -> String -> String -> String -> Identifier
ident5 :: HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> Identifier
ident5 HsImportName
a HsImportName
b HsImportName
c HsImportName
d HsImportName
e HsImportName
f = [HsImportName] -> Identifier
ident' [HsImportName
a, HsImportName
b, HsImportName
c, HsImportName
d, HsImportName
e, HsImportName
f]
identT :: String -> [Type] -> Identifier
identT :: HsImportName -> [Type] -> Identifier
identT HsImportName
a [Type]
ts = [IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a (Maybe [Type] -> IdPart) -> Maybe [Type] -> IdPart
forall a b. (a -> b) -> a -> b
$ [Type] -> Maybe [Type]
forall a. a -> Maybe a
Just [Type]
ts]
identT' :: [(String, Maybe [Type])] -> Identifier
identT' :: [(HsImportName, Maybe [Type])] -> Identifier
identT' = [IdPart] -> Identifier
Identifier ([IdPart] -> Identifier)
-> ([(HsImportName, Maybe [Type])] -> [IdPart])
-> [(HsImportName, Maybe [Type])]
-> Identifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((HsImportName, Maybe [Type]) -> IdPart)
-> [(HsImportName, Maybe [Type])] -> [IdPart]
forall a b. (a -> b) -> [a] -> [b]
map ((HsImportName -> Maybe [Type] -> IdPart)
-> (HsImportName, Maybe [Type]) -> IdPart
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry HsImportName -> Maybe [Type] -> IdPart
IdPart)
ident1T :: String -> String -> [Type] -> Identifier
ident1T :: HsImportName -> HsImportName -> [Type] -> Identifier
ident1T HsImportName
a HsImportName
b [Type]
ts = [IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
b (Maybe [Type] -> IdPart) -> Maybe [Type] -> IdPart
forall a b. (a -> b) -> a -> b
$ [Type] -> Maybe [Type]
forall a. a -> Maybe a
Just [Type]
ts]
ident2T :: String -> String -> String -> [Type] -> Identifier
ident2T :: HsImportName
-> HsImportName -> HsImportName -> [Type] -> Identifier
ident2T HsImportName
a HsImportName
b HsImportName
c [Type]
ts = [IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
b Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
c (Maybe [Type] -> IdPart) -> Maybe [Type] -> IdPart
forall a b. (a -> b) -> a -> b
$ [Type] -> Maybe [Type]
forall a. a -> Maybe a
Just [Type]
ts]
ident3T :: String -> String -> String -> String -> [Type] -> Identifier
ident3T :: HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> [Type]
-> Identifier
ident3T HsImportName
a HsImportName
b HsImportName
c HsImportName
d [Type]
ts =
[IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
b Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
c Maybe [Type]
forall a. Maybe a
Nothing,
HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
d (Maybe [Type] -> IdPart) -> Maybe [Type] -> IdPart
forall a b. (a -> b) -> a -> b
$ [Type] -> Maybe [Type]
forall a. a -> Maybe a
Just [Type]
ts]
ident4T :: String -> String -> String -> String -> String -> [Type] -> Identifier
ident4T :: HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> [Type]
-> Identifier
ident4T HsImportName
a HsImportName
b HsImportName
c HsImportName
d HsImportName
e [Type]
ts =
[IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
b Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
c Maybe [Type]
forall a. Maybe a
Nothing,
HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
d Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
e (Maybe [Type] -> IdPart) -> Maybe [Type] -> IdPart
forall a b. (a -> b) -> a -> b
$ [Type] -> Maybe [Type]
forall a. a -> Maybe a
Just [Type]
ts]
ident5T :: String -> String -> String -> String -> String -> String -> [Type] -> Identifier
ident5T :: HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> HsImportName
-> [Type]
-> Identifier
ident5T HsImportName
a HsImportName
b HsImportName
c HsImportName
d HsImportName
e HsImportName
f [Type]
ts =
[IdPart] -> Identifier
Identifier [HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
a Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
b Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
c Maybe [Type]
forall a. Maybe a
Nothing,
HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
d Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
e Maybe [Type]
forall a. Maybe a
Nothing, HsImportName -> Maybe [Type] -> IdPart
IdPart HsImportName
f (Maybe [Type] -> IdPart) -> Maybe [Type] -> IdPart
forall a b. (a -> b) -> a -> b
$ [Type] -> Maybe [Type]
forall a. a -> Maybe a
Just [Type]
ts]
class (HasAddendum a, HasExtNames a, HasReqs a, Typeable a, Show a) => Exportable a where
toExport :: a -> Export
toExport = a -> Export
forall a. Exportable a => a -> Export
Export
castExport :: (Typeable a, Exportable b, Typeable b) => a -> Maybe b
castExport = a -> Maybe b
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast
sayExportCpp :: LC.SayExportMode -> a -> LC.Generator ()
sayExportHaskell :: LH.SayExportMode -> a -> LH.Generator ()
getExportEnumInfo :: a -> Maybe EnumInfo
getExportEnumInfo a
_ = Maybe EnumInfo
forall a. Maybe a
Nothing
getExportExceptionClass :: a -> Maybe Class
getExportExceptionClass a
_ = Maybe Class
forall a. Maybe a
Nothing
data Export = forall a. Exportable a => Export a
instance HasAddendum Export where
getAddendum :: Export -> Addendum
getAddendum (Export a
e) = a -> Addendum
forall a. HasAddendum a => a -> Addendum
getAddendum a
e
setAddendum :: Addendum -> Export -> Export
setAddendum Addendum
a (Export a
e) = a -> Export
forall a. Exportable a => a -> Export
Export (a -> Export) -> a -> Export
forall a b. (a -> b) -> a -> b
$ Addendum -> a -> a
forall a. HasAddendum a => Addendum -> a -> a
setAddendum Addendum
a a
e
modifyAddendum :: (Addendum -> Addendum) -> Export -> Export
modifyAddendum Addendum -> Addendum
f (Export a
e) = a -> Export
forall a. Exportable a => a -> Export
Export (a -> Export) -> a -> Export
forall a b. (a -> b) -> a -> b
$ (Addendum -> Addendum) -> a -> a
forall a. HasAddendum a => (Addendum -> Addendum) -> a -> a
modifyAddendum Addendum -> Addendum
f a
e
instance HasExtNames Export where
getPrimaryExtName :: Export -> ExtName
getPrimaryExtName (Export a
e) = a -> ExtName
forall a. HasExtNames a => a -> ExtName
getPrimaryExtName a
e
getNestedExtNames :: Export -> [ExtName]
getNestedExtNames (Export a
e) = a -> [ExtName]
forall a. HasExtNames a => a -> [ExtName]
getNestedExtNames a
e
instance HasReqs Export where
getReqs :: Export -> Reqs
getReqs (Export a
e) = a -> Reqs
forall a. HasReqs a => a -> Reqs
getReqs a
e
setReqs :: Reqs -> Export -> Export
setReqs Reqs
reqs (Export a
e) = a -> Export
forall a. Exportable a => a -> Export
Export (a -> Export) -> a -> Export
forall a b. (a -> b) -> a -> b
$ Reqs -> a -> a
forall a. HasReqs a => Reqs -> a -> a
setReqs Reqs
reqs a
e
modifyReqs :: (Reqs -> Reqs) -> Export -> Export
modifyReqs Reqs -> Reqs
f (Export a
e) = a -> Export
forall a. Exportable a => a -> Export
Export (a -> Export) -> a -> Export
forall a b. (a -> b) -> a -> b
$ (Reqs -> Reqs) -> a -> a
forall a. HasReqs a => (Reqs -> Reqs) -> a -> a
modifyReqs Reqs -> Reqs
f a
e
instance Exportable Export where
toExport :: Export -> Export
toExport = Export -> Export
forall a. a -> a
id
castExport :: forall b.
(Typeable Export, Exportable b, Typeable b) =>
Export -> Maybe b
castExport (Export a
e) = a -> Maybe b
forall b. (Typeable a, Exportable b, Typeable b) => a -> Maybe b
forall a b.
(Exportable a, Typeable a, Exportable b, Typeable b) =>
a -> Maybe b
castExport a
e
sayExportCpp :: SayExportMode -> Export -> Generator ()
sayExportCpp SayExportMode
sayBody (Export a
e) = SayExportMode -> a -> Generator ()
forall a. Exportable a => SayExportMode -> a -> Generator ()
sayExportCpp SayExportMode
sayBody a
e
sayExportHaskell :: SayExportMode -> Export -> Generator ()
sayExportHaskell SayExportMode
mode (Export a
e) = SayExportMode -> a -> Generator ()
forall a. Exportable a => SayExportMode -> a -> Generator ()
sayExportHaskell SayExportMode
mode a
e
getExportEnumInfo :: Export -> Maybe EnumInfo
getExportEnumInfo (Export a
e) = a -> Maybe EnumInfo
forall a. Exportable a => a -> Maybe EnumInfo
getExportEnumInfo a
e
getExportExceptionClass :: Export -> Maybe Class
getExportExceptionClass (Export a
e) = a -> Maybe Class
forall a. Exportable a => a -> Maybe Class
getExportExceptionClass a
e
instance Show Export where
show :: Export -> HsImportName
show (Export a
e) = HsImportName
"<Export " HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> HsImportName
forall a. Show a => a -> HsImportName
show a
e HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
">"
data Type =
Internal_TVoid
| Internal_TPtr Type
| Internal_TRef Type
| Internal_TFn [Parameter] Type
| Internal_TObj Class
| Internal_TObjToHeap Class
| Internal_TToGc Type
| Internal_TManual ConversionSpec
| Internal_TConst Type
deriving (Int -> Type -> ShowS
[Type] -> ShowS
Type -> HsImportName
(Int -> Type -> ShowS)
-> (Type -> HsImportName) -> ([Type] -> ShowS) -> Show Type
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Type -> ShowS
showsPrec :: Int -> Type -> ShowS
$cshow :: Type -> HsImportName
show :: Type -> HsImportName
$cshowList :: [Type] -> ShowS
showList :: [Type] -> ShowS
Show)
instance Eq Type where
Type
Internal_TVoid == :: Type -> Type -> Bool
== Type
Internal_TVoid = Bool
True
(Internal_TPtr Type
t) == (Internal_TPtr Type
t') = Type
t Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
t'
(Internal_TRef Type
t) == (Internal_TRef Type
t') = Type
t Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
t'
(Internal_TFn [Parameter]
ps Type
r) == (Internal_TFn [Parameter]
ps' Type
r') =
([Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (Parameter -> Parameter -> Bool)
-> [Parameter] -> [Parameter] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Type -> Type -> Bool)
-> (Parameter -> Type) -> Parameter -> Parameter -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Parameter -> Type
parameterType) [Parameter]
ps [Parameter]
ps') Bool -> Bool -> Bool
&& Type
r Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
r'
(Internal_TObj Class
cls) == (Internal_TObj Class
cls') = Class
cls Class -> Class -> Bool
forall a. Eq a => a -> a -> Bool
== Class
cls'
(Internal_TObjToHeap Class
cls) == (Internal_TObjToHeap Class
cls') = Class
cls Class -> Class -> Bool
forall a. Eq a => a -> a -> Bool
== Class
cls'
(Internal_TToGc Type
t) == (Internal_TToGc Type
t') = Type
t Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
t'
(Internal_TManual ConversionSpec
s) == (Internal_TManual ConversionSpec
s') = ConversionSpec
s ConversionSpec -> ConversionSpec -> Bool
forall a. Eq a => a -> a -> Bool
== ConversionSpec
s'
(Internal_TConst Type
t) == (Internal_TConst Type
t') = Type
t Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
t'
Type
_ == Type
_ = Bool
False
normalizeType :: Type -> Type
normalizeType :: Type -> Type
normalizeType Type
t = case Type
t of
Type
Internal_TVoid -> Type
t
Internal_TPtr Type
t' -> Type -> Type
Internal_TPtr (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type -> Type
normalizeType Type
t'
Internal_TRef Type
t' -> Type -> Type
Internal_TRef (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type -> Type
normalizeType Type
t'
Internal_TFn [Parameter]
params Type
retType ->
[Parameter] -> Type -> Type
Internal_TFn ((Parameter -> Parameter) -> [Parameter] -> [Parameter]
forall a b. (a -> b) -> [a] -> [b]
map ((Type -> Type) -> Parameter -> Parameter
onParameterType Type -> Type
normalizeType) [Parameter]
params) (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type -> Type
normalizeType Type
retType
Internal_TObj Class
_ -> Type
t
Internal_TObjToHeap Class
_ -> Type
t
Internal_TToGc Type
_ -> Type
t
Internal_TManual ConversionSpec
_ -> Type
t
Internal_TConst (Internal_TConst Type
t') -> Type -> Type
normalizeType (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type -> Type
Internal_TConst Type
t'
Internal_TConst Type
_ -> Type
t
stripConst :: Type -> Type
stripConst :: Type -> Type
stripConst Type
t = case Type
t of
Internal_TConst Type
t' -> Type -> Type
stripConst Type
t'
Type
_ -> Type
t
stripToGc :: Type -> Type
stripToGc :: Type -> Type
stripToGc Type
t = case Type
t of
Internal_TToGc Type
t' -> Type
t'
Type
_ -> Type
t
data Scoped =
Unscoped
| Scoped
deriving (Scoped -> Scoped -> Bool
(Scoped -> Scoped -> Bool)
-> (Scoped -> Scoped -> Bool) -> Eq Scoped
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Scoped -> Scoped -> Bool
== :: Scoped -> Scoped -> Bool
$c/= :: Scoped -> Scoped -> Bool
/= :: Scoped -> Scoped -> Bool
Eq, Eq Scoped
Eq Scoped =>
(Scoped -> Scoped -> Ordering)
-> (Scoped -> Scoped -> Bool)
-> (Scoped -> Scoped -> Bool)
-> (Scoped -> Scoped -> Bool)
-> (Scoped -> Scoped -> Bool)
-> (Scoped -> Scoped -> Scoped)
-> (Scoped -> Scoped -> Scoped)
-> Ord Scoped
Scoped -> Scoped -> Bool
Scoped -> Scoped -> Ordering
Scoped -> Scoped -> Scoped
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
$ccompare :: Scoped -> Scoped -> Ordering
compare :: Scoped -> Scoped -> Ordering
$c< :: Scoped -> Scoped -> Bool
< :: Scoped -> Scoped -> Bool
$c<= :: Scoped -> Scoped -> Bool
<= :: Scoped -> Scoped -> Bool
$c> :: Scoped -> Scoped -> Bool
> :: Scoped -> Scoped -> Bool
$c>= :: Scoped -> Scoped -> Bool
>= :: Scoped -> Scoped -> Bool
$cmax :: Scoped -> Scoped -> Scoped
max :: Scoped -> Scoped -> Scoped
$cmin :: Scoped -> Scoped -> Scoped
min :: Scoped -> Scoped -> Scoped
Ord, Int -> Scoped -> ShowS
[Scoped] -> ShowS
Scoped -> HsImportName
(Int -> Scoped -> ShowS)
-> (Scoped -> HsImportName) -> ([Scoped] -> ShowS) -> Show Scoped
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Scoped -> ShowS
showsPrec :: Int -> Scoped -> ShowS
$cshow :: Scoped -> HsImportName
show :: Scoped -> HsImportName
$cshowList :: [Scoped] -> ShowS
showList :: [Scoped] -> ShowS
Show)
isScoped :: Scoped -> Bool
isScoped :: Scoped -> Bool
isScoped Scoped
Unscoped = Bool
False
isScoped Scoped
Scoped = Bool
True
data Constness = Nonconst | Const
deriving (Constness
Constness -> Constness -> Bounded Constness
forall a. a -> a -> Bounded a
$cminBound :: Constness
minBound :: Constness
$cmaxBound :: Constness
maxBound :: Constness
Bounded, Int -> Constness
Constness -> Int
Constness -> [Constness]
Constness -> Constness
Constness -> Constness -> [Constness]
Constness -> Constness -> Constness -> [Constness]
(Constness -> Constness)
-> (Constness -> Constness)
-> (Int -> Constness)
-> (Constness -> Int)
-> (Constness -> [Constness])
-> (Constness -> Constness -> [Constness])
-> (Constness -> Constness -> [Constness])
-> (Constness -> Constness -> Constness -> [Constness])
-> Enum Constness
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Constness -> Constness
succ :: Constness -> Constness
$cpred :: Constness -> Constness
pred :: Constness -> Constness
$ctoEnum :: Int -> Constness
toEnum :: Int -> Constness
$cfromEnum :: Constness -> Int
fromEnum :: Constness -> Int
$cenumFrom :: Constness -> [Constness]
enumFrom :: Constness -> [Constness]
$cenumFromThen :: Constness -> Constness -> [Constness]
enumFromThen :: Constness -> Constness -> [Constness]
$cenumFromTo :: Constness -> Constness -> [Constness]
enumFromTo :: Constness -> Constness -> [Constness]
$cenumFromThenTo :: Constness -> Constness -> Constness -> [Constness]
enumFromThenTo :: Constness -> Constness -> Constness -> [Constness]
Enum, Constness -> Constness -> Bool
(Constness -> Constness -> Bool)
-> (Constness -> Constness -> Bool) -> Eq Constness
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Constness -> Constness -> Bool
== :: Constness -> Constness -> Bool
$c/= :: Constness -> Constness -> Bool
/= :: Constness -> Constness -> Bool
Eq, Int -> Constness -> ShowS
[Constness] -> ShowS
Constness -> HsImportName
(Int -> Constness -> ShowS)
-> (Constness -> HsImportName)
-> ([Constness] -> ShowS)
-> Show Constness
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Constness -> ShowS
showsPrec :: Int -> Constness -> ShowS
$cshow :: Constness -> HsImportName
show :: Constness -> HsImportName
$cshowList :: [Constness] -> ShowS
showList :: [Constness] -> ShowS
Show)
constNegate :: Constness -> Constness
constNegate :: Constness -> Constness
constNegate Constness
Nonconst = Constness
Const
constNegate Constness
Const = Constness
Nonconst
data Purity = Nonpure
| Pure
deriving (Purity -> Purity -> Bool
(Purity -> Purity -> Bool)
-> (Purity -> Purity -> Bool) -> Eq Purity
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Purity -> Purity -> Bool
== :: Purity -> Purity -> Bool
$c/= :: Purity -> Purity -> Bool
/= :: Purity -> Purity -> Bool
Eq, Int -> Purity -> ShowS
[Purity] -> ShowS
Purity -> HsImportName
(Int -> Purity -> ShowS)
-> (Purity -> HsImportName) -> ([Purity] -> ShowS) -> Show Purity
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Purity -> ShowS
showsPrec :: Int -> Purity -> ShowS
$cshow :: Purity -> HsImportName
show :: Purity -> HsImportName
$cshowList :: [Purity] -> ShowS
showList :: [Purity] -> ShowS
Show)
data Parameter = Parameter
{ Parameter -> Type
parameterType :: Type
, Parameter -> Maybe HsImportName
parameterName :: Maybe String
} deriving (Int -> Parameter -> ShowS
[Parameter] -> ShowS
Parameter -> HsImportName
(Int -> Parameter -> ShowS)
-> (Parameter -> HsImportName)
-> ([Parameter] -> ShowS)
-> Show Parameter
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Parameter -> ShowS
showsPrec :: Int -> Parameter -> ShowS
$cshow :: Parameter -> HsImportName
show :: Parameter -> HsImportName
$cshowList :: [Parameter] -> ShowS
showList :: [Parameter] -> ShowS
Show)
class Show a => IsParameter a where
toParameter :: a -> Parameter
instance IsParameter Parameter where
toParameter :: Parameter -> Parameter
toParameter = Parameter -> Parameter
forall a. a -> a
id
instance IsParameter Type where
toParameter :: Type -> Parameter
toParameter Type
t =
Parameter
{ parameterType :: Type
parameterType = Type
t
, parameterName :: Maybe HsImportName
parameterName = Maybe HsImportName
forall a. Maybe a
Nothing
}
onParameterType :: (Type -> Type) -> (Parameter -> Parameter)
onParameterType :: (Type -> Type) -> Parameter -> Parameter
onParameterType Type -> Type
f Parameter
p = Parameter
p { parameterType = f $ parameterType p }
np :: [Parameter]
np :: [Parameter]
np = []
toParameters :: IsParameter a => [a] -> [Parameter]
toParameters :: forall a. IsParameter a => [a] -> [Parameter]
toParameters = (a -> Parameter) -> [a] -> [Parameter]
forall a b. (a -> b) -> [a] -> [b]
map a -> Parameter
forall a. IsParameter a => a -> Parameter
toParameter
(~:) :: IsParameter a => String -> a -> Parameter
~: :: forall a. IsParameter a => HsImportName -> a -> Parameter
(~:) HsImportName
name a
param =
(a -> Parameter
forall a. IsParameter a => a -> Parameter
toParameter a
param) { parameterName = if null name then Nothing else Just name }
infixr 0 ~:
data ConversionMethod c =
ConversionUnsupported
| BinaryCompatible
| CustomConversion c
deriving (Int -> ConversionMethod c -> ShowS
[ConversionMethod c] -> ShowS
ConversionMethod c -> HsImportName
(Int -> ConversionMethod c -> ShowS)
-> (ConversionMethod c -> HsImportName)
-> ([ConversionMethod c] -> ShowS)
-> Show (ConversionMethod c)
forall c. Show c => Int -> ConversionMethod c -> ShowS
forall c. Show c => [ConversionMethod c] -> ShowS
forall c. Show c => ConversionMethod c -> HsImportName
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall c. Show c => Int -> ConversionMethod c -> ShowS
showsPrec :: Int -> ConversionMethod c -> ShowS
$cshow :: forall c. Show c => ConversionMethod c -> HsImportName
show :: ConversionMethod c -> HsImportName
$cshowList :: forall c. Show c => [ConversionMethod c] -> ShowS
showList :: [ConversionMethod c] -> ShowS
Show)
data ConversionSpec = ConversionSpec
{ ConversionSpec -> HsImportName
conversionSpecName :: String
, ConversionSpec -> ConversionSpecCpp
conversionSpecCpp :: ConversionSpecCpp
, ConversionSpec -> Maybe ConversionSpecHaskell
conversionSpecHaskell :: Maybe ConversionSpecHaskell
}
instance Eq ConversionSpec where
== :: ConversionSpec -> ConversionSpec -> Bool
(==) = HsImportName -> HsImportName -> Bool
forall a. Eq a => a -> a -> Bool
(==) (HsImportName -> HsImportName -> Bool)
-> (ConversionSpec -> HsImportName)
-> ConversionSpec
-> ConversionSpec
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` ConversionSpec -> HsImportName
conversionSpecName
instance Show ConversionSpec where
show :: ConversionSpec -> HsImportName
show ConversionSpec
x = HsImportName
"<ConversionSpec " HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
forall a. Show a => a -> HsImportName
show (ConversionSpec -> HsImportName
conversionSpecName ConversionSpec
x) HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
">"
makeConversionSpec ::
String
-> ConversionSpecCpp
-> ConversionSpec
makeConversionSpec :: HsImportName -> ConversionSpecCpp -> ConversionSpec
makeConversionSpec HsImportName
name ConversionSpecCpp
cppSpec =
ConversionSpec
{ conversionSpecName :: HsImportName
conversionSpecName = HsImportName
name
, conversionSpecCpp :: ConversionSpecCpp
conversionSpecCpp = ConversionSpecCpp
cppSpec
, conversionSpecHaskell :: Maybe ConversionSpecHaskell
conversionSpecHaskell = Maybe ConversionSpecHaskell
forall a. Maybe a
Nothing
}
data ConversionSpecCpp = ConversionSpecCpp
{ ConversionSpecCpp -> HsImportName
conversionSpecCppName :: String
, ConversionSpecCpp -> Generator Reqs
conversionSpecCppReqs :: LC.Generator Reqs
, ConversionSpecCpp -> Generator (Maybe Type)
conversionSpecCppConversionType :: LC.Generator (Maybe Type)
, ConversionSpecCpp
-> Maybe (Generator () -> Maybe (Generator ()) -> Generator ())
conversionSpecCppConversionToCppExpr ::
Maybe (LC.Generator () -> Maybe (LC.Generator ()) -> LC.Generator ())
, ConversionSpecCpp
-> Maybe (Generator () -> Maybe (Generator ()) -> Generator ())
conversionSpecCppConversionFromCppExpr ::
Maybe (LC.Generator () -> Maybe (LC.Generator ()) -> LC.Generator ())
}
makeConversionSpecCpp :: String -> LC.Generator Reqs -> ConversionSpecCpp
makeConversionSpecCpp :: HsImportName -> Generator Reqs -> ConversionSpecCpp
makeConversionSpecCpp HsImportName
cppName Generator Reqs
cppReqs =
ConversionSpecCpp
{ conversionSpecCppName :: HsImportName
conversionSpecCppName = HsImportName
cppName
, conversionSpecCppReqs :: Generator Reqs
conversionSpecCppReqs = Generator Reqs
cppReqs
, conversionSpecCppConversionType :: Generator (Maybe Type)
conversionSpecCppConversionType = Maybe Type -> Generator (Maybe Type)
forall a.
a -> ReaderT Env (WriterT [Chunk] (Either HsImportName)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Type
forall a. Maybe a
Nothing
, conversionSpecCppConversionToCppExpr :: Maybe (Generator () -> Maybe (Generator ()) -> Generator ())
conversionSpecCppConversionToCppExpr = Maybe (Generator () -> Maybe (Generator ()) -> Generator ())
forall a. Maybe a
Nothing
, conversionSpecCppConversionFromCppExpr :: Maybe (Generator () -> Maybe (Generator ()) -> Generator ())
conversionSpecCppConversionFromCppExpr = Maybe (Generator () -> Maybe (Generator ()) -> Generator ())
forall a. Maybe a
Nothing
}
data ConversionSpecHaskell = ConversionSpecHaskell
{ ConversionSpecHaskell -> Generator HsType
conversionSpecHaskellHsType :: LH.Generator HsType
, ConversionSpecHaskell -> Maybe (HsName -> Generator HsQualType)
conversionSpecHaskellHsArgType :: Maybe (HsName -> LH.Generator HsQualType)
, ConversionSpecHaskell -> Maybe (Generator HsType)
conversionSpecHaskellCType :: Maybe (LH.Generator HsType)
, ConversionSpecHaskell -> ConversionMethod (Generator ())
conversionSpecHaskellToCppFn :: ConversionMethod (LH.Generator ())
, ConversionSpecHaskell -> ConversionMethod (Generator ())
conversionSpecHaskellFromCppFn :: ConversionMethod (LH.Generator ())
}
makeConversionSpecHaskell ::
LH.Generator HsType
-> Maybe (LH.Generator HsType)
-> ConversionMethod (LH.Generator ())
-> ConversionMethod (LH.Generator ())
-> ConversionSpecHaskell
makeConversionSpecHaskell :: Generator HsType
-> Maybe (Generator HsType)
-> ConversionMethod (Generator ())
-> ConversionMethod (Generator ())
-> ConversionSpecHaskell
makeConversionSpecHaskell Generator HsType
hsType Maybe (Generator HsType)
cType ConversionMethod (Generator ())
toCppFn ConversionMethod (Generator ())
fromCppFn =
ConversionSpecHaskell
{ conversionSpecHaskellHsType :: Generator HsType
conversionSpecHaskellHsType = Generator HsType
hsType
, conversionSpecHaskellHsArgType :: Maybe (HsName -> Generator HsQualType)
conversionSpecHaskellHsArgType = Maybe (HsName -> Generator HsQualType)
forall a. Maybe a
Nothing
, conversionSpecHaskellCType :: Maybe (Generator HsType)
conversionSpecHaskellCType = Maybe (Generator HsType)
cType
, conversionSpecHaskellToCppFn :: ConversionMethod (Generator ())
conversionSpecHaskellToCppFn = ConversionMethod (Generator ())
toCppFn
, conversionSpecHaskellFromCppFn :: ConversionMethod (Generator ())
conversionSpecHaskellFromCppFn = ConversionMethod (Generator ())
fromCppFn
}
newtype ExceptionId = ExceptionId
{ ExceptionId -> Int
getExceptionId :: Int
} deriving (ExceptionId -> ExceptionId -> Bool
(ExceptionId -> ExceptionId -> Bool)
-> (ExceptionId -> ExceptionId -> Bool) -> Eq ExceptionId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ExceptionId -> ExceptionId -> Bool
== :: ExceptionId -> ExceptionId -> Bool
$c/= :: ExceptionId -> ExceptionId -> Bool
/= :: ExceptionId -> ExceptionId -> Bool
Eq, Int -> ExceptionId -> ShowS
[ExceptionId] -> ShowS
ExceptionId -> HsImportName
(Int -> ExceptionId -> ShowS)
-> (ExceptionId -> HsImportName)
-> ([ExceptionId] -> ShowS)
-> Show ExceptionId
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ExceptionId -> ShowS
showsPrec :: Int -> ExceptionId -> ShowS
$cshow :: ExceptionId -> HsImportName
show :: ExceptionId -> HsImportName
$cshowList :: [ExceptionId] -> ShowS
showList :: [ExceptionId] -> ShowS
Show)
exceptionCatchAllId :: ExceptionId
exceptionCatchAllId :: ExceptionId
exceptionCatchAllId = Int -> ExceptionId
ExceptionId Int
1
exceptionFirstFreeId :: Int
exceptionFirstFreeId :: Int
exceptionFirstFreeId = ExceptionId -> Int
getExceptionId ExceptionId
exceptionCatchAllId Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
data ExceptionHandler =
CatchClass Class
| CatchAll
deriving (ExceptionHandler -> ExceptionHandler -> Bool
(ExceptionHandler -> ExceptionHandler -> Bool)
-> (ExceptionHandler -> ExceptionHandler -> Bool)
-> Eq ExceptionHandler
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ExceptionHandler -> ExceptionHandler -> Bool
== :: ExceptionHandler -> ExceptionHandler -> Bool
$c/= :: ExceptionHandler -> ExceptionHandler -> Bool
/= :: ExceptionHandler -> ExceptionHandler -> Bool
Eq, Eq ExceptionHandler
Eq ExceptionHandler =>
(ExceptionHandler -> ExceptionHandler -> Ordering)
-> (ExceptionHandler -> ExceptionHandler -> Bool)
-> (ExceptionHandler -> ExceptionHandler -> Bool)
-> (ExceptionHandler -> ExceptionHandler -> Bool)
-> (ExceptionHandler -> ExceptionHandler -> Bool)
-> (ExceptionHandler -> ExceptionHandler -> ExceptionHandler)
-> (ExceptionHandler -> ExceptionHandler -> ExceptionHandler)
-> Ord ExceptionHandler
ExceptionHandler -> ExceptionHandler -> Bool
ExceptionHandler -> ExceptionHandler -> Ordering
ExceptionHandler -> ExceptionHandler -> ExceptionHandler
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
$ccompare :: ExceptionHandler -> ExceptionHandler -> Ordering
compare :: ExceptionHandler -> ExceptionHandler -> Ordering
$c< :: ExceptionHandler -> ExceptionHandler -> Bool
< :: ExceptionHandler -> ExceptionHandler -> Bool
$c<= :: ExceptionHandler -> ExceptionHandler -> Bool
<= :: ExceptionHandler -> ExceptionHandler -> Bool
$c> :: ExceptionHandler -> ExceptionHandler -> Bool
> :: ExceptionHandler -> ExceptionHandler -> Bool
$c>= :: ExceptionHandler -> ExceptionHandler -> Bool
>= :: ExceptionHandler -> ExceptionHandler -> Bool
$cmax :: ExceptionHandler -> ExceptionHandler -> ExceptionHandler
max :: ExceptionHandler -> ExceptionHandler -> ExceptionHandler
$cmin :: ExceptionHandler -> ExceptionHandler -> ExceptionHandler
min :: ExceptionHandler -> ExceptionHandler -> ExceptionHandler
Ord)
newtype ExceptionHandlers = ExceptionHandlers
{ ExceptionHandlers -> [ExceptionHandler]
exceptionHandlersList :: [ExceptionHandler]
}
instance Sem.Semigroup ExceptionHandlers where
<> :: ExceptionHandlers -> ExceptionHandlers -> ExceptionHandlers
(<>) ExceptionHandlers
e1 ExceptionHandlers
e2 =
[ExceptionHandler] -> ExceptionHandlers
ExceptionHandlers ([ExceptionHandler] -> ExceptionHandlers)
-> [ExceptionHandler] -> ExceptionHandlers
forall a b. (a -> b) -> a -> b
$ ExceptionHandlers -> [ExceptionHandler]
exceptionHandlersList ExceptionHandlers
e1 [ExceptionHandler] -> [ExceptionHandler] -> [ExceptionHandler]
forall a. [a] -> [a] -> [a]
++ ExceptionHandlers -> [ExceptionHandler]
exceptionHandlersList ExceptionHandlers
e2
instance Monoid ExceptionHandlers where
mempty :: ExceptionHandlers
mempty = [ExceptionHandler] -> ExceptionHandlers
ExceptionHandlers []
mappend :: ExceptionHandlers -> ExceptionHandlers -> ExceptionHandlers
mappend = ExceptionHandlers -> ExceptionHandlers -> ExceptionHandlers
forall a. Semigroup a => a -> a -> a
(<>)
class HandlesExceptions a where
getExceptionHandlers :: a -> ExceptionHandlers
modifyExceptionHandlers :: (ExceptionHandlers -> ExceptionHandlers) -> a -> a
handleExceptions :: HandlesExceptions a => [ExceptionHandler] -> a -> a
handleExceptions :: forall a. HandlesExceptions a => [ExceptionHandler] -> a -> a
handleExceptions [ExceptionHandler]
classes =
(ExceptionHandlers -> ExceptionHandlers) -> a -> a
forall a.
HandlesExceptions a =>
(ExceptionHandlers -> ExceptionHandlers) -> a -> a
modifyExceptionHandlers ((ExceptionHandlers -> ExceptionHandlers) -> a -> a)
-> (ExceptionHandlers -> ExceptionHandlers) -> a -> a
forall a b. (a -> b) -> a -> b
$ ExceptionHandlers -> ExceptionHandlers -> ExceptionHandlers
forall a. Monoid a => a -> a -> a
mappend ExceptionHandlers
forall a. Monoid a => a
mempty { exceptionHandlersList = classes }
newtype Addendum = Addendum
{ Addendum -> Generator ()
addendumHaskell :: LH.Generator ()
}
instance Sem.Semigroup Addendum where
<> :: Addendum -> Addendum -> Addendum
(<>) (Addendum Generator ()
a) (Addendum Generator ()
b) = Generator () -> Addendum
Addendum (Generator () -> Addendum) -> Generator () -> Addendum
forall a b. (a -> b) -> a -> b
$ Generator ()
a Generator () -> Generator () -> Generator ()
forall a b.
ReaderT Env (WriterT Output (Except HsImportName)) a
-> ReaderT Env (WriterT Output (Except HsImportName)) b
-> ReaderT Env (WriterT Output (Except HsImportName)) b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Generator ()
b
instance Monoid Addendum where
mempty :: Addendum
mempty = Generator () -> Addendum
Addendum (Generator () -> Addendum) -> Generator () -> Addendum
forall a b. (a -> b) -> a -> b
$ () -> Generator ()
forall a. a -> ReaderT Env (WriterT Output (Except HsImportName)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
mappend :: Addendum -> Addendum -> Addendum
mappend = Addendum -> Addendum -> Addendum
forall a. Semigroup a => a -> a -> a
(<>)
class HasAddendum a where
{-# MINIMAL getAddendum, (setAddendum | modifyAddendum) #-}
getAddendum :: a -> Addendum
setAddendum :: Addendum -> a -> a
setAddendum Addendum
addendum = (Addendum -> Addendum) -> a -> a
forall a. HasAddendum a => (Addendum -> Addendum) -> a -> a
modifyAddendum ((Addendum -> Addendum) -> a -> a)
-> (Addendum -> Addendum) -> a -> a
forall a b. (a -> b) -> a -> b
$ Addendum -> Addendum -> Addendum
forall a b. a -> b -> a
const Addendum
addendum
modifyAddendum :: (Addendum -> Addendum) -> a -> a
modifyAddendum Addendum -> Addendum
f a
x = Addendum -> a -> a
forall a. HasAddendum a => Addendum -> a -> a
setAddendum (Addendum -> Addendum
f (Addendum -> Addendum) -> Addendum -> Addendum
forall a b. (a -> b) -> a -> b
$ a -> Addendum
forall a. HasAddendum a => a -> Addendum
getAddendum a
x) a
x
addAddendumHaskell :: HasAddendum a => LH.Generator () -> a -> a
addAddendumHaskell :: forall a. HasAddendum a => Generator () -> a -> a
addAddendumHaskell Generator ()
gen = (Addendum -> Addendum) -> a -> a
forall a. HasAddendum a => (Addendum -> Addendum) -> a -> a
modifyAddendum ((Addendum -> Addendum) -> a -> a)
-> (Addendum -> Addendum) -> a -> a
forall a b. (a -> b) -> a -> b
$ \Addendum
addendum ->
Addendum
addendum Addendum -> Addendum -> Addendum
forall a. Monoid a => a -> a -> a
`mappend` Addendum
forall a. Monoid a => a
mempty { addendumHaskell = gen }
data EnumInfo = EnumInfo
{ EnumInfo -> ExtName
enumInfoExtName :: ExtName
, EnumInfo -> Identifier
enumInfoIdentifier :: Identifier
, EnumInfo -> Maybe Type
enumInfoNumericType :: Maybe Type
, EnumInfo -> Reqs
enumInfoReqs :: Reqs
, EnumInfo -> Scoped
enumInfoScoped :: Scoped
, EnumInfo -> EnumValueMap
enumInfoValues :: EnumValueMap
}
type EnumEntryWords = [String]
data EnumValueMap = EnumValueMap
{ EnumValueMap -> [[HsImportName]]
enumValueMapNames :: [EnumEntryWords]
, EnumValueMap
-> MapWithForeignLanguageOverrides [HsImportName] [HsImportName]
enumValueMapForeignNames :: MapWithForeignLanguageOverrides EnumEntryWords EnumEntryWords
, EnumValueMap -> Map [HsImportName] EnumValue
enumValueMapValues :: M.Map EnumEntryWords EnumValue
}
instance Eq EnumValueMap where
== :: EnumValueMap -> EnumValueMap -> Bool
(==) = Map [HsImportName] EnumValue
-> Map [HsImportName] EnumValue -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Map [HsImportName] EnumValue
-> Map [HsImportName] EnumValue -> Bool)
-> (EnumValueMap -> Map [HsImportName] EnumValue)
-> EnumValueMap
-> EnumValueMap
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` EnumValueMap -> Map [HsImportName] EnumValue
enumValueMapValues
instance Show EnumValueMap where
show :: EnumValueMap -> HsImportName
show EnumValueMap
x = HsImportName
"<EnumValueMap values=" HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ Map [HsImportName] EnumValue -> HsImportName
forall a. Show a => a -> HsImportName
show (EnumValueMap -> Map [HsImportName] EnumValue
enumValueMapValues EnumValueMap
x) HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
">"
data EnumValue =
EnumValueManual Integer
| EnumValueAuto Identifier
deriving (EnumValue -> EnumValue -> Bool
(EnumValue -> EnumValue -> Bool)
-> (EnumValue -> EnumValue -> Bool) -> Eq EnumValue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EnumValue -> EnumValue -> Bool
== :: EnumValue -> EnumValue -> Bool
$c/= :: EnumValue -> EnumValue -> Bool
/= :: EnumValue -> EnumValue -> Bool
Eq, Int -> EnumValue -> ShowS
[EnumValue] -> ShowS
EnumValue -> HsImportName
(Int -> EnumValue -> ShowS)
-> (EnumValue -> HsImportName)
-> ([EnumValue] -> ShowS)
-> Show EnumValue
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EnumValue -> ShowS
showsPrec :: Int -> EnumValue -> ShowS
$cshow :: EnumValue -> HsImportName
show :: EnumValue -> HsImportName
$cshowList :: [EnumValue] -> ShowS
showList :: [EnumValue] -> ShowS
Show)
data ForeignLanguage =
Haskell
deriving (ForeignLanguage -> ForeignLanguage -> Bool
(ForeignLanguage -> ForeignLanguage -> Bool)
-> (ForeignLanguage -> ForeignLanguage -> Bool)
-> Eq ForeignLanguage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ForeignLanguage -> ForeignLanguage -> Bool
== :: ForeignLanguage -> ForeignLanguage -> Bool
$c/= :: ForeignLanguage -> ForeignLanguage -> Bool
/= :: ForeignLanguage -> ForeignLanguage -> Bool
Eq, Eq ForeignLanguage
Eq ForeignLanguage =>
(ForeignLanguage -> ForeignLanguage -> Ordering)
-> (ForeignLanguage -> ForeignLanguage -> Bool)
-> (ForeignLanguage -> ForeignLanguage -> Bool)
-> (ForeignLanguage -> ForeignLanguage -> Bool)
-> (ForeignLanguage -> ForeignLanguage -> Bool)
-> (ForeignLanguage -> ForeignLanguage -> ForeignLanguage)
-> (ForeignLanguage -> ForeignLanguage -> ForeignLanguage)
-> Ord ForeignLanguage
ForeignLanguage -> ForeignLanguage -> Bool
ForeignLanguage -> ForeignLanguage -> Ordering
ForeignLanguage -> ForeignLanguage -> ForeignLanguage
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
$ccompare :: ForeignLanguage -> ForeignLanguage -> Ordering
compare :: ForeignLanguage -> ForeignLanguage -> Ordering
$c< :: ForeignLanguage -> ForeignLanguage -> Bool
< :: ForeignLanguage -> ForeignLanguage -> Bool
$c<= :: ForeignLanguage -> ForeignLanguage -> Bool
<= :: ForeignLanguage -> ForeignLanguage -> Bool
$c> :: ForeignLanguage -> ForeignLanguage -> Bool
> :: ForeignLanguage -> ForeignLanguage -> Bool
$c>= :: ForeignLanguage -> ForeignLanguage -> Bool
>= :: ForeignLanguage -> ForeignLanguage -> Bool
$cmax :: ForeignLanguage -> ForeignLanguage -> ForeignLanguage
max :: ForeignLanguage -> ForeignLanguage -> ForeignLanguage
$cmin :: ForeignLanguage -> ForeignLanguage -> ForeignLanguage
min :: ForeignLanguage -> ForeignLanguage -> ForeignLanguage
Ord, Int -> ForeignLanguage -> ShowS
[ForeignLanguage] -> ShowS
ForeignLanguage -> HsImportName
(Int -> ForeignLanguage -> ShowS)
-> (ForeignLanguage -> HsImportName)
-> ([ForeignLanguage] -> ShowS)
-> Show ForeignLanguage
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ForeignLanguage -> ShowS
showsPrec :: Int -> ForeignLanguage -> ShowS
$cshow :: ForeignLanguage -> HsImportName
show :: ForeignLanguage -> HsImportName
$cshowList :: [ForeignLanguage] -> ShowS
showList :: [ForeignLanguage] -> ShowS
Show)
type WithForeignLanguageOverrides = WithOverrides ForeignLanguage
type MapWithForeignLanguageOverrides = MapWithOverrides ForeignLanguage
data HsImportSet = HsImportSet
{ HsImportSet -> Map HsImportKey HsImportSpecs
getHsImportSet :: M.Map HsImportKey HsImportSpecs
} deriving (Int -> HsImportSet -> ShowS
[HsImportSet] -> ShowS
HsImportSet -> HsImportName
(Int -> HsImportSet -> ShowS)
-> (HsImportSet -> HsImportName)
-> ([HsImportSet] -> ShowS)
-> Show HsImportSet
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HsImportSet -> ShowS
showsPrec :: Int -> HsImportSet -> ShowS
$cshow :: HsImportSet -> HsImportName
show :: HsImportSet -> HsImportName
$cshowList :: [HsImportSet] -> ShowS
showList :: [HsImportSet] -> ShowS
Show)
instance Sem.Semigroup HsImportSet where
<> :: HsImportSet -> HsImportSet -> HsImportSet
(<>) (HsImportSet Map HsImportKey HsImportSpecs
m) (HsImportSet Map HsImportKey HsImportSpecs
m') =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ (HsImportSpecs -> HsImportSpecs -> HsImportSpecs)
-> Map HsImportKey HsImportSpecs
-> Map HsImportKey HsImportSpecs
-> Map HsImportKey HsImportSpecs
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
M.unionWith HsImportSpecs -> HsImportSpecs -> HsImportSpecs
mergeImportSpecs Map HsImportKey HsImportSpecs
m Map HsImportKey HsImportSpecs
m'
instance Monoid HsImportSet where
mempty :: HsImportSet
mempty = Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet Map HsImportKey HsImportSpecs
forall k a. Map k a
M.empty
mappend :: HsImportSet -> HsImportSet -> HsImportSet
mappend = HsImportSet -> HsImportSet -> HsImportSet
forall a. Semigroup a => a -> a -> a
(<>)
mconcat :: [HsImportSet] -> HsImportSet
mconcat [HsImportSet]
sets =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ (HsImportSpecs -> HsImportSpecs -> HsImportSpecs)
-> [Map HsImportKey HsImportSpecs] -> Map HsImportKey HsImportSpecs
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
M.unionsWith HsImportSpecs -> HsImportSpecs -> HsImportSpecs
mergeImportSpecs ([Map HsImportKey HsImportSpecs] -> Map HsImportKey HsImportSpecs)
-> [Map HsImportKey HsImportSpecs] -> Map HsImportKey HsImportSpecs
forall a b. (a -> b) -> a -> b
$ (HsImportSet -> Map HsImportKey HsImportSpecs)
-> [HsImportSet] -> [Map HsImportKey HsImportSpecs]
forall a b. (a -> b) -> [a] -> [b]
map HsImportSet -> Map HsImportKey HsImportSpecs
getHsImportSet [HsImportSet]
sets
makeHsImportSet :: M.Map HsImportKey HsImportSpecs -> HsImportSet
makeHsImportSet :: Map HsImportKey HsImportSpecs -> HsImportSet
makeHsImportSet = Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet
hsImportSetMakeSource :: HsImportSet -> HsImportSet
hsImportSetMakeSource :: HsImportSet -> HsImportSet
hsImportSetMakeSource (HsImportSet Map HsImportKey HsImportSpecs
m) =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ (HsImportSpecs -> HsImportSpecs)
-> Map HsImportKey HsImportSpecs -> Map HsImportKey HsImportSpecs
forall a b k. (a -> b) -> Map k a -> Map k b
M.map (\HsImportSpecs
specs -> HsImportSpecs
specs { hsImportSource = True }) Map HsImportKey HsImportSpecs
m
type HsModuleName = String
data HsImportKey = HsImportKey
{ HsImportKey -> HsImportName
hsImportModule :: HsModuleName
, HsImportKey -> Maybe HsImportName
hsImportQualifiedName :: Maybe HsModuleName
} deriving (HsImportKey -> HsImportKey -> Bool
(HsImportKey -> HsImportKey -> Bool)
-> (HsImportKey -> HsImportKey -> Bool) -> Eq HsImportKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: HsImportKey -> HsImportKey -> Bool
== :: HsImportKey -> HsImportKey -> Bool
$c/= :: HsImportKey -> HsImportKey -> Bool
/= :: HsImportKey -> HsImportKey -> Bool
Eq, Eq HsImportKey
Eq HsImportKey =>
(HsImportKey -> HsImportKey -> Ordering)
-> (HsImportKey -> HsImportKey -> Bool)
-> (HsImportKey -> HsImportKey -> Bool)
-> (HsImportKey -> HsImportKey -> Bool)
-> (HsImportKey -> HsImportKey -> Bool)
-> (HsImportKey -> HsImportKey -> HsImportKey)
-> (HsImportKey -> HsImportKey -> HsImportKey)
-> Ord HsImportKey
HsImportKey -> HsImportKey -> Bool
HsImportKey -> HsImportKey -> Ordering
HsImportKey -> HsImportKey -> HsImportKey
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
$ccompare :: HsImportKey -> HsImportKey -> Ordering
compare :: HsImportKey -> HsImportKey -> Ordering
$c< :: HsImportKey -> HsImportKey -> Bool
< :: HsImportKey -> HsImportKey -> Bool
$c<= :: HsImportKey -> HsImportKey -> Bool
<= :: HsImportKey -> HsImportKey -> Bool
$c> :: HsImportKey -> HsImportKey -> Bool
> :: HsImportKey -> HsImportKey -> Bool
$c>= :: HsImportKey -> HsImportKey -> Bool
>= :: HsImportKey -> HsImportKey -> Bool
$cmax :: HsImportKey -> HsImportKey -> HsImportKey
max :: HsImportKey -> HsImportKey -> HsImportKey
$cmin :: HsImportKey -> HsImportKey -> HsImportKey
min :: HsImportKey -> HsImportKey -> HsImportKey
Ord, Int -> HsImportKey -> ShowS
[HsImportKey] -> ShowS
HsImportKey -> HsImportName
(Int -> HsImportKey -> ShowS)
-> (HsImportKey -> HsImportName)
-> ([HsImportKey] -> ShowS)
-> Show HsImportKey
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HsImportKey -> ShowS
showsPrec :: Int -> HsImportKey -> ShowS
$cshow :: HsImportKey -> HsImportName
show :: HsImportKey -> HsImportName
$cshowList :: [HsImportKey] -> ShowS
showList :: [HsImportKey] -> ShowS
Show)
data HsImportSpecs = HsImportSpecs
{ HsImportSpecs -> Maybe (Map HsImportName HsImportVal)
getHsImportSpecs :: Maybe (M.Map HsImportName HsImportVal)
, HsImportSpecs -> Bool
hsImportSource :: Bool
} deriving (Int -> HsImportSpecs -> ShowS
[HsImportSpecs] -> ShowS
HsImportSpecs -> HsImportName
(Int -> HsImportSpecs -> ShowS)
-> (HsImportSpecs -> HsImportName)
-> ([HsImportSpecs] -> ShowS)
-> Show HsImportSpecs
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HsImportSpecs -> ShowS
showsPrec :: Int -> HsImportSpecs -> ShowS
$cshow :: HsImportSpecs -> HsImportName
show :: HsImportSpecs -> HsImportName
$cshowList :: [HsImportSpecs] -> ShowS
showList :: [HsImportSpecs] -> ShowS
Show)
mergeImportSpecs :: HsImportSpecs -> HsImportSpecs -> HsImportSpecs
mergeImportSpecs :: HsImportSpecs -> HsImportSpecs -> HsImportSpecs
mergeImportSpecs (HsImportSpecs Maybe (Map HsImportName HsImportVal)
mm Bool
s) (HsImportSpecs Maybe (Map HsImportName HsImportVal)
mm' Bool
s') =
Maybe (Map HsImportName HsImportVal) -> Bool -> HsImportSpecs
HsImportSpecs ((Map HsImportName HsImportVal
-> Map HsImportName HsImportVal -> Map HsImportName HsImportVal)
-> Maybe (Map HsImportName HsImportVal)
-> Maybe (Map HsImportName HsImportVal)
-> Maybe (Map HsImportName HsImportVal)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 Map HsImportName HsImportVal
-> Map HsImportName HsImportVal -> Map HsImportName HsImportVal
mergeMaps Maybe (Map HsImportName HsImportVal)
mm Maybe (Map HsImportName HsImportVal)
mm') (Bool
s Bool -> Bool -> Bool
|| Bool
s')
where mergeMaps :: Map HsImportName HsImportVal
-> Map HsImportName HsImportVal -> Map HsImportName HsImportVal
mergeMaps = (HsImportVal -> HsImportVal -> HsImportVal)
-> Map HsImportName HsImportVal
-> Map HsImportName HsImportVal
-> Map HsImportName HsImportVal
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
M.unionWith HsImportVal -> HsImportVal -> HsImportVal
mergeValues
mergeValues :: HsImportVal -> HsImportVal -> HsImportVal
mergeValues HsImportVal
v HsImportVal
v' = case (HsImportVal
v, HsImportVal
v') of
(HsImportVal
HsImportValAll, HsImportVal
_) -> HsImportVal
HsImportValAll
(HsImportVal
_, HsImportVal
HsImportValAll) -> HsImportVal
HsImportValAll
(HsImportValSome [HsImportName]
x, HsImportValSome [HsImportName]
x') -> [HsImportName] -> HsImportVal
HsImportValSome ([HsImportName] -> HsImportVal) -> [HsImportName] -> HsImportVal
forall a b. (a -> b) -> a -> b
$ [HsImportName]
x [HsImportName] -> [HsImportName] -> [HsImportName]
forall a. [a] -> [a] -> [a]
++ [HsImportName]
x'
(x :: HsImportVal
x@(HsImportValSome [HsImportName]
_), HsImportVal
_) -> HsImportVal
x
(HsImportVal
_, x :: HsImportVal
x@(HsImportValSome [HsImportName]
_)) -> HsImportVal
x
(HsImportVal
HsImportVal, HsImportVal
HsImportVal) -> HsImportVal
HsImportVal
type HsImportName = String
data HsImportVal =
HsImportVal
| HsImportValSome [HsImportName]
| HsImportValAll
deriving (Int -> HsImportVal -> ShowS
[HsImportVal] -> ShowS
HsImportVal -> HsImportName
(Int -> HsImportVal -> ShowS)
-> (HsImportVal -> HsImportName)
-> ([HsImportVal] -> ShowS)
-> Show HsImportVal
forall a.
(Int -> a -> ShowS)
-> (a -> HsImportName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HsImportVal -> ShowS
showsPrec :: Int -> HsImportVal -> ShowS
$cshow :: HsImportVal -> HsImportName
show :: HsImportVal -> HsImportName
$cshowList :: [HsImportVal] -> ShowS
showList :: [HsImportVal] -> ShowS
Show)
hsWholeModuleImport :: HsModuleName -> HsImportSet
hsWholeModuleImport :: HsImportName -> HsImportSet
hsWholeModuleImport HsImportName
modName =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ HsImportKey -> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall k a. k -> a -> Map k a
M.singleton (HsImportName -> Maybe HsImportName -> HsImportKey
HsImportKey HsImportName
modName Maybe HsImportName
forall a. Maybe a
Nothing) (HsImportSpecs -> Map HsImportKey HsImportSpecs)
-> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall a b. (a -> b) -> a -> b
$
Maybe (Map HsImportName HsImportVal) -> Bool -> HsImportSpecs
HsImportSpecs Maybe (Map HsImportName HsImportVal)
forall a. Maybe a
Nothing Bool
False
hsQualifiedImport :: HsModuleName -> HsModuleName -> HsImportSet
hsQualifiedImport :: HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
modName HsImportName
qualifiedName =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ HsImportKey -> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall k a. k -> a -> Map k a
M.singleton (HsImportName -> Maybe HsImportName -> HsImportKey
HsImportKey HsImportName
modName (Maybe HsImportName -> HsImportKey)
-> Maybe HsImportName -> HsImportKey
forall a b. (a -> b) -> a -> b
$ HsImportName -> Maybe HsImportName
forall a. a -> Maybe a
Just HsImportName
qualifiedName) (HsImportSpecs -> Map HsImportKey HsImportSpecs)
-> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall a b. (a -> b) -> a -> b
$
Maybe (Map HsImportName HsImportVal) -> Bool -> HsImportSpecs
HsImportSpecs Maybe (Map HsImportName HsImportVal)
forall a. Maybe a
Nothing Bool
False
hsImport1 :: HsModuleName -> HsImportName -> HsImportSet
hsImport1 :: HsImportName -> HsImportName -> HsImportSet
hsImport1 HsImportName
modName HsImportName
valueName = HsImportName -> HsImportName -> HsImportVal -> HsImportSet
hsImport1' HsImportName
modName HsImportName
valueName HsImportVal
HsImportVal
hsImport1' :: HsModuleName -> HsImportName -> HsImportVal -> HsImportSet
hsImport1' :: HsImportName -> HsImportName -> HsImportVal -> HsImportSet
hsImport1' HsImportName
modName HsImportName
valueName HsImportVal
valueType =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ HsImportKey -> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall k a. k -> a -> Map k a
M.singleton (HsImportName -> Maybe HsImportName -> HsImportKey
HsImportKey HsImportName
modName Maybe HsImportName
forall a. Maybe a
Nothing) (HsImportSpecs -> Map HsImportKey HsImportSpecs)
-> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall a b. (a -> b) -> a -> b
$
Maybe (Map HsImportName HsImportVal) -> Bool -> HsImportSpecs
HsImportSpecs (Map HsImportName HsImportVal
-> Maybe (Map HsImportName HsImportVal)
forall a. a -> Maybe a
Just (Map HsImportName HsImportVal
-> Maybe (Map HsImportName HsImportVal))
-> Map HsImportName HsImportVal
-> Maybe (Map HsImportName HsImportVal)
forall a b. (a -> b) -> a -> b
$ HsImportName -> HsImportVal -> Map HsImportName HsImportVal
forall k a. k -> a -> Map k a
M.singleton HsImportName
valueName HsImportVal
valueType) Bool
False
hsImports :: HsModuleName -> [HsImportName] -> HsImportSet
hsImports :: HsImportName -> [HsImportName] -> HsImportSet
hsImports HsImportName
modName [HsImportName]
names =
HsImportName -> [(HsImportName, HsImportVal)] -> HsImportSet
hsImports' HsImportName
modName ([(HsImportName, HsImportVal)] -> HsImportSet)
-> [(HsImportName, HsImportVal)] -> HsImportSet
forall a b. (a -> b) -> a -> b
$ (HsImportName -> (HsImportName, HsImportVal))
-> [HsImportName] -> [(HsImportName, HsImportVal)]
forall a b. (a -> b) -> [a] -> [b]
map (\HsImportName
name -> (HsImportName
name, HsImportVal
HsImportVal)) [HsImportName]
names
hsImports' :: HsModuleName -> [(HsImportName, HsImportVal)] -> HsImportSet
hsImports' :: HsImportName -> [(HsImportName, HsImportVal)] -> HsImportSet
hsImports' HsImportName
modName [(HsImportName, HsImportVal)]
values =
Map HsImportKey HsImportSpecs -> HsImportSet
HsImportSet (Map HsImportKey HsImportSpecs -> HsImportSet)
-> Map HsImportKey HsImportSpecs -> HsImportSet
forall a b. (a -> b) -> a -> b
$ HsImportKey -> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall k a. k -> a -> Map k a
M.singleton (HsImportName -> Maybe HsImportName -> HsImportKey
HsImportKey HsImportName
modName Maybe HsImportName
forall a. Maybe a
Nothing) (HsImportSpecs -> Map HsImportKey HsImportSpecs)
-> HsImportSpecs -> Map HsImportKey HsImportSpecs
forall a b. (a -> b) -> a -> b
$
Maybe (Map HsImportName HsImportVal) -> Bool -> HsImportSpecs
HsImportSpecs (Map HsImportName HsImportVal
-> Maybe (Map HsImportName HsImportVal)
forall a. a -> Maybe a
Just (Map HsImportName HsImportVal
-> Maybe (Map HsImportName HsImportVal))
-> Map HsImportName HsImportVal
-> Maybe (Map HsImportName HsImportVal)
forall a b. (a -> b) -> a -> b
$ [(HsImportName, HsImportVal)] -> Map HsImportName HsImportVal
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [(HsImportName, HsImportVal)]
values) Bool
False
hsImportForBits :: HsImportSet
hsImportForBits :: HsImportSet
hsImportForBits = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Data.Bits" HsImportName
"HoppyDB"
hsImportForException :: HsImportSet
hsImportForException :: HsImportSet
hsImportForException = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Control.Exception" HsImportName
"HoppyCE"
hsImportForInt :: HsImportSet
hsImportForInt :: HsImportSet
hsImportForInt = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Data.Int" HsImportName
"HoppyDI"
hsImportForWord :: HsImportSet
hsImportForWord :: HsImportSet
hsImportForWord = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Data.Word" HsImportName
"HoppyDW"
hsImportForForeign :: HsImportSet
hsImportForForeign :: HsImportSet
hsImportForForeign = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Foreign" HsImportName
"HoppyF"
hsImportForForeignC :: HsImportSet
hsImportForForeignC :: HsImportSet
hsImportForForeignC = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Foreign.C" HsImportName
"HoppyFC"
hsImportForMap :: HsImportSet
hsImportForMap :: HsImportSet
hsImportForMap = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Data.Map" HsImportName
"HoppyDM"
hsImportForPrelude :: HsImportSet
hsImportForPrelude :: HsImportSet
hsImportForPrelude = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Prelude" HsImportName
"HoppyP"
hsImportForRuntime :: HsImportSet
hsImportForRuntime :: HsImportSet
hsImportForRuntime = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"Foreign.Hoppy.Runtime" HsImportName
"HoppyFHR"
hsImportForSystemPosixTypes :: HsImportSet
hsImportForSystemPosixTypes :: HsImportSet
hsImportForSystemPosixTypes = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"System.Posix.Types" HsImportName
"HoppySPT"
hsImportForUnsafeIO :: HsImportSet
hsImportForUnsafeIO :: HsImportSet
hsImportForUnsafeIO = HsImportName -> HsImportName -> HsImportSet
hsQualifiedImport HsImportName
"System.IO.Unsafe" HsImportName
"HoppySIU"
objToHeapTWrongDirectionErrorMsg :: Maybe String -> Class -> String
objToHeapTWrongDirectionErrorMsg :: Maybe HsImportName -> Class -> HsImportName
objToHeapTWrongDirectionErrorMsg Maybe HsImportName
maybeCaller Class
cls =
[HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName -> ShowS -> Maybe HsImportName -> HsImportName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HsImportName
"" (HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
": ") Maybe HsImportName
maybeCaller,
HsImportName
"(TObjToHeap ", Class -> HsImportName
forall a. Show a => a -> HsImportName
show Class
cls, HsImportName
") cannot be passed into C++",
HsImportName -> ShowS -> Maybe HsImportName -> HsImportName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HsImportName
"" (HsImportName -> ShowS
forall a b. a -> b -> a
const HsImportName
".") Maybe HsImportName
maybeCaller]
tToGcInvalidFormErrorMessage :: Maybe String -> Type -> String
tToGcInvalidFormErrorMessage :: Maybe HsImportName -> Type -> HsImportName
tToGcInvalidFormErrorMessage Maybe HsImportName
maybeCaller Type
typeArg =
[HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName -> ShowS -> Maybe HsImportName -> HsImportName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HsImportName
"" (HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
": ") Maybe HsImportName
maybeCaller,
HsImportName
"(", Type -> HsImportName
forall a. Show a => a -> HsImportName
show (Type -> Type
Internal_TToGc Type
typeArg), HsImportName
") is an invalid form for TToGc.",
HsImportName -> ShowS -> Maybe HsImportName -> HsImportName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HsImportName
"" (HsImportName -> ShowS
forall a b. a -> b -> a
const HsImportName
".") Maybe HsImportName
maybeCaller]
toGcTWrongDirectionErrorMsg :: Maybe String -> Type -> String
toGcTWrongDirectionErrorMsg :: Maybe HsImportName -> Type -> HsImportName
toGcTWrongDirectionErrorMsg Maybe HsImportName
maybeCaller Type
typeArg =
[HsImportName] -> HsImportName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [HsImportName -> ShowS -> Maybe HsImportName -> HsImportName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HsImportName
"" (HsImportName -> ShowS
forall a. [a] -> [a] -> [a]
++ HsImportName
": ") Maybe HsImportName
maybeCaller,
HsImportName
"(", Type -> HsImportName
forall a. Show a => a -> HsImportName
show (Type -> Type
Internal_TToGc Type
typeArg), HsImportName
") cannot be passed into C++",
HsImportName -> ShowS -> Maybe HsImportName -> HsImportName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe HsImportName
"" (HsImportName -> ShowS
forall a b. a -> b -> a
const HsImportName
".") Maybe HsImportName
maybeCaller]