{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
module Cubix.Language.C.Parametric.Common.Types where
#ifndef ONLY_ONE_LANGUAGE
import Data.List ( (\\) )
import Language.Haskell.TH ( mkName )
import Data.Comp.Multi ( Node, HFunctor, Term, project', project, (:-<:), CxtS, All, AnnCxtS )
import Data.Comp.Trans ( runCompTrans, makeSumType )
import Cubix.Language.C.Parametric.Full.Names
import Cubix.Language.C.Parametric.Full.Types as C
import Cubix.Language.Info
import Cubix.Language.Parametric.Derive
import Cubix.Language.Parametric.InjF
import Cubix.Language.Parametric.Syntax as P
data CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs e l where
CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs :: e [CDeclarationSpecifierL] -> CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs e MultiLocalVarDeclCommonAttrsL
data CLocalVarAttrs e l where
CLocalVarAttrs :: e [CDerivedDeclaratorL] -> e (Maybe CStringLiteralL) -> e [CAttributeL] -> CLocalVarAttrs e LocalVarDeclAttrsL
deriveAllButSortInjection [''CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs, ''CLocalVarAttrs]
instance ( CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs :-<: fs
, All HFunctor fs
) => InjF fs [CDeclarationSpecifierL] MultiLocalVarDeclCommonAttrsL where
injF :: forall h (a :: * -> *).
CxtS h fs a [CDeclarationSpecifierL]
-> CxtS h fs a MultiLocalVarDeclCommonAttrsL
injF = CxtS h fs a [CDeclarationSpecifierL]
-> CxtS h fs a MultiLocalVarDeclCommonAttrsL
forall h (fs :: Signature) (a :: * -> *) j.
(CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs :-<: fs,
InjF fs MultiLocalVarDeclCommonAttrsL j) =>
CxtS h fs a [CDeclarationSpecifierL] -> CxtS h fs a j
iCDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs
projF' :: forall h p (a :: * -> *).
Cxt h (Sum fs :&: p) a MultiLocalVarDeclCommonAttrsL
-> Maybe (Cxt h (Sum fs :&: p) a [CDeclarationSpecifierL])
projF' (Cxt h (Sum fs :&: p) a MultiLocalVarDeclCommonAttrsL
-> Maybe
(CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs
(Cxt h (Sum fs :&: p) a) MultiLocalVarDeclCommonAttrsL)
forall (f :: (* -> *) -> * -> *) (f' :: (* -> *) -> * -> *)
(s :: (* -> *) -> * -> *) h (a :: * -> *) i.
(RemA f f', s :<: f') =>
Cxt h f a i -> Maybe (s (Cxt h f a) i)
project' -> Just (CDeclarationSpecifiersIsMultiLocalVarDeclCommonAttrs Cxt h (Sum fs :&: p) a [CDeclarationSpecifierL]
x)) = Cxt h (Sum fs :&: p) a [CDeclarationSpecifierL]
-> Maybe (Cxt h (Sum fs :&: p) a [CDeclarationSpecifierL])
forall a. a -> Maybe a
Just Cxt h (Sum fs :&: p) a [CDeclarationSpecifierL]
x
projF' Cxt h (Sum fs :&: p) a MultiLocalVarDeclCommonAttrsL
_ = Maybe (Cxt h (Sum fs :&: p) a [CDeclarationSpecifierL])
forall a. Maybe a
Nothing
createSortInclusionTypes [ ''MultiLocalVarDeclL, ''CInitializerL, ''P.IdentL, ''C.CExpressionL, ''C.CExpressionL, ''C.CAssignOpL, ''P.AssignL, ''C.CCompoundBlockItemL
] [''CCompoundBlockItemL, ''LocalVarInitL, ''C.IdentL, ''P.LhsL, ''P.RhsL, ''P.AssignOpL, ''C.CExpressionL, ''P.BlockItemL
]
deriveAllButSortInjection [''MultiLocalVarDeclIsCCompoundBlockItem, ''CInitializerIsLocalVarInit, ''IdentIsIdent, ''CExpressionIsLhs,
''CExpressionIsRhs, ''CAssignOpIsAssignOp, ''AssignIsCExpression, ''CCompoundBlockItemIsBlockItem]
createSortInclusionInfers [ ''MultiLocalVarDeclL, ''CInitializerL, ''P.IdentL, ''C.CExpressionL, ''C.CExpressionL, ''C.CAssignOpL, ''P.AssignL, ''C.CCompoundBlockItemL
] [''CCompoundBlockItemL, ''LocalVarInitL, ''C.IdentL, ''P.LhsL, ''P.RhsL, ''P.AssignOpL, ''C.CExpressionL, ''P.BlockItemL
]
data CLabeledBlock e l where
CLabeledBlock :: e [P.IdentL] -> e BlockL -> CLabeledBlock e C.CStatementL
deriveAll [''CLabeledBlock]
data CForInitL
data CForInit e l where
CForInitEmpty :: CForInit e CForInitL
CForInitExp :: e CExpressionL -> CForInit e CForInitL
CForInitDecl :: e MultiLocalVarDeclL -> CForInit e CForInitL
data CFor e l where
CFor :: e CForInitL -> e (Maybe CExpressionL) -> e (Maybe CExpressionL) -> e CStatementL -> CFor e CStatementL
deriveAll [''CForInit, ''CFor]
data CSpecialParamL
data CVoidArg :: Node where
CVoidArg :: CVoidArg e CSpecialParamL
deriveAll [''CVoidArg]
data CVarArgParam :: Node where
CVarArgParam :: CVarArgParam e CSpecialParamL
deriveAll [''CVarArgParam]
data COldStyleParamL
data COldStyleParam e l where
COldStyleParam :: e P.IdentL -> COldStyleParam e COldStyleParamL
deriveAll [''COldStyleParam]
data CFunDeclAttrs e l where
CFunDeclAttrs :: e [C.CDerivedDeclaratorL] -> e [C.CAttributeL] -> e (Maybe (C.CStringLiteralL)) -> e [C.CAttributeL] -> CFunDeclAttrs e FunctionDeclAttrsL
deriveAll [''CFunDeclAttrs]
data CFunDefAttrs e l where
CFunDefAttrs :: e [CDeclarationSpecifierL] -> e FunctionDeclAttrsL -> e [CDeclarationL] -> CFunDefAttrs e FunctionDefAttrsL
deriveAll [''CFunDefAttrs]
data CFunParamAttrsL
data CFunParamAttrs e l where
CFunParamAttrs :: e [CDeclarationSpecifierL] -> e [CDerivedDeclaratorL] -> e (Maybe CStringLiteralL) -> e [CAttributeL] -> CFunParamAttrs e CFunParamAttrsL
deriveAll [''CFunParamAttrs]
createSortInclusionTypes [ ''P.FunctionCallL, ''C.CExpressionL, ''C.CExpressionL, ''P.FunctionDeclL, ''CFunParamAttrsL, ''CSpecialParamL, ''P.FunctionDefL, ''CFunParamAttrsL, ''CSpecialParamL, ''COldStyleParamL, ''C.CStatementL
] [''C.CExpressionL, ''P.FunctionExpL, ''P.PositionalArgExpL, ''C.CDeclaratorL, ''P.FunctionParameterDeclAttrsL, ''P.FunctionParameterDeclL, ''C.CFunctionDefL, ''P.ParameterAttrsL, ''P.FunctionParameterL, ''P.FunctionParameterL, ''P.FunctionBodyL
]