module Drasil.GOOL.Renderers (
renderType, renderParam, renderMethod, renderListDec, renderConstDecDef
) where
import Drasil.FileHandling.Legacy (indent)
import Drasil.Shared.InterfaceCommon (UnRepr(..), VariableElim(..))
import Drasil.Shared.RendererClassesCommon (InternalVarElim(..),
VisibilityElim(..), ValueElim(..), ParamElim)
import qualified Drasil.Shared.RendererClassesCommon as RC (BodyElim(..))
import Drasil.GOOL.RendererClassesOO (PermElim(..))
import Drasil.Shared.LanguageRenderer (parameterList, new', constDec')
import Drasil.Shared.AST (TypeData(..))
import Prelude hiding ((<>))
import Text.PrettyPrint.HughesPJ (Doc, (<+>), (<>), vcat, text, lbrace, rbrace,
parens, space, equals)
renderType :: (UnRepr r TypeData) => r TypeData -> Doc
renderType :: forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType = TypeData -> Doc
typeDoc (TypeData -> Doc) -> (r TypeData -> TypeData) -> r TypeData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> TypeData
forall (repr :: * -> *) contents.
UnRepr repr contents =>
repr contents -> contents
unRepr
renderParam
:: (InternalVarElim r var, UnRepr r TypeData, VariableElim r var TypeData)
=> r var -> Doc
renderParam :: forall (r :: * -> *) var.
(InternalVarElim r var, UnRepr r TypeData,
VariableElim r var TypeData) =>
r var -> Doc
renderParam r var
v = r TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (r var -> r TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType r var
v) Doc -> Doc -> Doc
<+> r var -> Doc
forall {k} (r :: k -> *) (var :: k).
InternalVarElim r var =>
r var -> Doc
variable r var
v
renderMethod
:: ( RC.BodyElim r bod
, ParamElim r param typ
, PermElim r attch
, UnRepr r TypeData
, VisibilityElim r vis
)
=> String
-> r vis
-> r attch
-> r TypeData
-> [r param]
-> r bod
-> Doc
renderMethod :: forall (r :: * -> *) bod param typ attch vis.
(BodyElim r bod, ParamElim r param typ, PermElim r attch,
UnRepr r TypeData, VisibilityElim r vis) =>
String
-> r vis -> r attch -> r TypeData -> [r param] -> r bod -> Doc
renderMethod String
n r vis
s r attch
p r TypeData
t [r param]
ps r bod
b = [Doc] -> Doc
vcat [
r vis -> Doc
forall {k} (r :: k -> *) (vis :: k).
VisibilityElim r vis =>
r vis -> Doc
visibility r vis
s Doc -> Doc -> Doc
<+> r attch -> Doc
forall {k} (r :: k -> *) (attch :: k).
PermElim r attch =>
r attch -> Doc
perm r attch
p Doc -> Doc -> Doc
<+> r TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType r TypeData
t Doc -> Doc -> Doc
<+> String -> Doc
text String
n Doc -> Doc -> Doc
<>
(Doc -> Doc
parens ([r param] -> Doc
forall {k} (r :: k -> *) (param :: k) (typ :: k).
ParamElim r param typ =>
[r param] -> Doc
parameterList [r param]
ps) Doc -> Doc -> Doc
<+> Doc
lbrace),
Doc -> Doc
indent (r bod -> Doc
forall {k} (r :: k -> *) (bod :: k). BodyElim r bod => r bod -> Doc
RC.body r bod
b),
Doc
rbrace]
renderListDec
:: (UnRepr r TypeData, ValueElim r val, VariableElim r var TypeData)
=> r var -> r val -> Doc
renderListDec :: forall (r :: * -> *) val var.
(UnRepr r TypeData, ValueElim r val,
VariableElim r var TypeData) =>
r var -> r val -> Doc
renderListDec r var
v r val
n = Doc
space Doc -> Doc -> Doc
<> Doc
equals Doc -> Doc -> Doc
<+> Doc
new' Doc -> Doc -> Doc
<+> r TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (r var -> r TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType r var
v)
Doc -> Doc -> Doc
<> Doc -> Doc
parens (r val -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
value r val
n)
renderConstDecDef
::
( InternalVarElim r var
, UnRepr r TypeData
, ValueElim r val
, VariableElim r var TypeData
)
=> r var -> r val -> Doc
renderConstDecDef :: forall (r :: * -> *) var val.
(InternalVarElim r var, UnRepr r TypeData, ValueElim r val,
VariableElim r var TypeData) =>
r var -> r val -> Doc
renderConstDecDef r var
v r val
def = Doc
constDec' Doc -> Doc -> Doc
<+> r TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (r var -> r TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType r var
v) Doc -> Doc -> Doc
<+>
r var -> Doc
forall {k} (r :: k -> *) (var :: k).
InternalVarElim r var =>
r var -> Doc
variable r var
v Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<+> r val -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
value r val
def