module Feldspar.Compiler.Backend.C.Plugin.TypeDefinitionGenerator where
import Data.List
import Feldspar.Transformation
import Feldspar.Compiler.Backend.C.CodeGeneration
import Feldspar.Compiler.Backend.C.Options
import Feldspar.Compiler.Error
typeDefGenError :: ErrorClass -> String -> a
typeDefGenError = handleError "PluginArch/TypeDefinitionGenerator"
data TypeDefinitionGenerator = TypeDefinitionGenerator
getTypes :: Options -> Type -> [Entity ()]
getTypes options typ = case typ of
StructType members -> concatMap (\(_,t) -> getTypes options t) members
++ [StructDef {
structName = toC options Declaration_pl (StructType members),
structMembers = map (\(n,t) -> StructMember n t ()) members,
structLabel = (),
definitionLabel = ()
}]
ArrayType _ baseType -> getTypes options baseType
_ -> []
instance Transformation TypeDefinitionGenerator where
type From TypeDefinitionGenerator = ()
type To TypeDefinitionGenerator = ()
type Down TypeDefinitionGenerator = Options
type Up TypeDefinitionGenerator = ()
type State TypeDefinitionGenerator = [Entity ()]
instance Transformable TypeDefinitionGenerator Module where
transform selfpointer origState fromAbove origModule = defaultTransformationResult {
result = (result defaultTransformationResult) {
entities = nub (state defaultTransformationResult)
++ entities (result defaultTransformationResult)
}
} where
defaultTransformationResult = defaultTransform selfpointer origState fromAbove origModule
instance Transformable TypeDefinitionGenerator Variable where
transform selfpointer origState fromAbove origVariable = defaultTransformationResult {
state = state defaultTransformationResult ++ getTypes fromAbove (varType origVariable)
} where
defaultTransformationResult = defaultTransform selfpointer origState fromAbove origVariable
instance Plugin TypeDefinitionGenerator where
type ExternalInfo TypeDefinitionGenerator = Options
executePlugin TypeDefinitionGenerator externalInfo procedure = result
$ transform TypeDefinitionGenerator [] externalInfo procedure