{-# LANGUAGE TypeFamilies, Rank2Types #-}

-- Performs code analysis on the GOOL code
module GOOL.Drasil.CodeInfo (CodeInfo(..)) where

import GOOL.Drasil.ClassInterface (MSBody, VSType, SValue, MSStatement, 
  SMethod, OOProg, ProgramSym(..), FileSym(..), PermanenceSym(..), BodySym(..), 
  BlockSym(..), TypeSym(..), TypeElim(..), VariableSym(..), VariableElim(..), 
  ValueSym(..), Argument(..), Literal(..), MathConstant(..), VariableValue(..), 
  CommandLineArgs(..), NumericExpression(..), BooleanExpression(..), 
  Comparison(..), ValueExpression(..), InternalValueExp(..), FunctionSym(..), 
  GetSet(..), List(..), InternalList(..), StatementSym(..), 
  AssignStatement(..), DeclStatement(..), IOStatement(..), StringStatement(..), 
  FuncAppStatement(..), CommentStatement(..), ControlStatement(..), 
  StatePattern(..), ObserverPattern(..), StrategyPattern(..), ScopeSym(..), 
  ParameterSym(..), MethodSym(..), StateVarSym(..), ClassSym(..), ModuleSym(..))
import GOOL.Drasil.CodeType (CodeType(Void))
import GOOL.Drasil.AST (ScopeTag(..), qualName)
import GOOL.Drasil.CodeAnalysis (ExceptionType(..))
import GOOL.Drasil.Helpers (toCode, toState)
import GOOL.Drasil.State (GOOLState, VS, lensGStoFS, lensFStoCS, lensFStoMS,
  lensCStoMS, lensMStoVS, lensVStoFS, lensCStoFS, modifyReturn, 
  setClassName, getClassName, setModuleName, getModuleName, addClass, 
  updateClassMap, addException, updateMethodExcMap, updateCallMap, addCall, 
  callMapTransClosure, updateMEMWithCalls)

import Control.Monad.State (State, modify)
import qualified Control.Monad.State as S (get)
import Control.Lens.Zoom (zoom)
import Data.Maybe (fromMaybe)

newtype CodeInfo a = CI {CodeInfo a -> a
unCI :: a} deriving CodeInfo a -> CodeInfo a -> Bool
(CodeInfo a -> CodeInfo a -> Bool)
-> (CodeInfo a -> CodeInfo a -> Bool) -> Eq (CodeInfo a)
forall a. Eq a => CodeInfo a -> CodeInfo a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CodeInfo a -> CodeInfo a -> Bool
$c/= :: forall a. Eq a => CodeInfo a -> CodeInfo a -> Bool
== :: CodeInfo a -> CodeInfo a -> Bool
$c== :: forall a. Eq a => CodeInfo a -> CodeInfo a -> Bool
Eq

-- FIXME: Use DerivingVia language extension (and maybe DeriveFunctor) to 
-- derive the Functor, Applicative, Monad instances for this 
-- (and for JavaCode, PythonCode, etc.)
instance Functor CodeInfo where
  fmap :: (a -> b) -> CodeInfo a -> CodeInfo b
fmap f :: a -> b
f (CI x :: a
x) = b -> CodeInfo b
forall a. a -> CodeInfo a
CI (a -> b
f a
x)

instance Applicative CodeInfo where
  pure :: a -> CodeInfo a
pure = a -> CodeInfo a
forall a. a -> CodeInfo a
CI
  (CI f :: a -> b
f) <*> :: CodeInfo (a -> b) -> CodeInfo a -> CodeInfo b
<*> (CI x :: a
x) = b -> CodeInfo b
forall a. a -> CodeInfo a
CI (a -> b
f a
x)

instance Monad CodeInfo where
  return :: a -> CodeInfo a
return = a -> CodeInfo a
forall a. a -> CodeInfo a
CI
  CI x :: a
x >>= :: CodeInfo a -> (a -> CodeInfo b) -> CodeInfo b
>>= f :: a -> CodeInfo b
f = a -> CodeInfo b
f a
x

instance OOProg CodeInfo where

instance ProgramSym CodeInfo where
  type Program CodeInfo = GOOLState
  prog :: Label -> [SFile CodeInfo] -> GSProgram CodeInfo
prog _ fs :: [SFile CodeInfo]
fs = do
    (StateT FileState Identity (CodeInfo ())
 -> StateT GOOLState Identity (CodeInfo ()))
-> [StateT FileState Identity (CodeInfo ())]
-> StateT GOOLState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT FileState Identity) (CodeInfo ()))
  GOOLState
  FileState
-> StateT FileState Identity (CodeInfo ())
-> StateT GOOLState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT FileState Identity) (CodeInfo ()))
  GOOLState
  FileState
Lens' GOOLState FileState
lensGStoFS) [StateT FileState Identity (CodeInfo ())]
[SFile CodeInfo]
fs
    (GOOLState -> GOOLState) -> StateT GOOLState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (GOOLState -> GOOLState
updateMEMWithCalls (GOOLState -> GOOLState)
-> (GOOLState -> GOOLState) -> GOOLState -> GOOLState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GOOLState -> GOOLState
callMapTransClosure)
    GOOLState
s <- StateT GOOLState Identity GOOLState
forall s (m :: * -> *). MonadState s m => m s
S.get
    CodeInfo GOOLState -> State GOOLState (CodeInfo GOOLState)
forall a s. a -> State s a
toState (CodeInfo GOOLState -> State GOOLState (CodeInfo GOOLState))
-> CodeInfo GOOLState -> State GOOLState (CodeInfo GOOLState)
forall a b. (a -> b) -> a -> b
$ GOOLState -> CodeInfo GOOLState
forall (r :: * -> *) a. Monad r => a -> r a
toCode GOOLState
s

instance FileSym CodeInfo where
  type File CodeInfo = ()
  fileDoc :: FSModule CodeInfo -> SFile CodeInfo
fileDoc = FSModule CodeInfo -> SFile CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  
  docMod :: Label -> [Label] -> Label -> SFile CodeInfo -> SFile CodeInfo
docMod _ _ _ = SFile CodeInfo -> SFile CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

instance PermanenceSym CodeInfo where
  type Permanence CodeInfo = ()
  static :: CodeInfo (Permanence CodeInfo)
static  = () -> CodeInfo ()
forall (r :: * -> *) a. Monad r => a -> r a
toCode ()
  dynamic :: CodeInfo (Permanence CodeInfo)
dynamic = () -> CodeInfo ()
forall (r :: * -> *) a. Monad r => a -> r a
toCode ()

instance BodySym CodeInfo where
  type Body CodeInfo = ()
  body :: [MSBlock CodeInfo] -> MSBody CodeInfo
body = [MSBlock CodeInfo] -> MSBody CodeInfo
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList

  addComments :: Label -> MSBody CodeInfo -> MSBody CodeInfo
addComments _ _ = MSBody CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance BlockSym CodeInfo where
  type Block CodeInfo = ()
  block :: [MSStatement CodeInfo] -> MSBlock CodeInfo
block = [MSStatement CodeInfo] -> MSBlock CodeInfo
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList

instance TypeSym CodeInfo where
  type Type CodeInfo = String
  bool :: VSType CodeInfo
bool              = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  int :: VSType CodeInfo
int               = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  float :: VSType CodeInfo
float             = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  double :: VSType CodeInfo
double            = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  char :: VSType CodeInfo
char              = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  string :: VSType CodeInfo
string            = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  infile :: VSType CodeInfo
infile            = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  outfile :: VSType CodeInfo
outfile           = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  listType :: VSType CodeInfo -> VSType CodeInfo
listType      _   = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  arrayType :: VSType CodeInfo -> VSType CodeInfo
arrayType     _   = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  listInnerType :: VSType CodeInfo -> VSType CodeInfo
listInnerType _   = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  obj :: Label -> VSType CodeInfo
obj               = CodeInfo Label -> State ValueState (CodeInfo Label)
forall a s. a -> State s a
toState (CodeInfo Label -> State ValueState (CodeInfo Label))
-> (Label -> CodeInfo Label)
-> Label
-> State ValueState (CodeInfo Label)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> CodeInfo Label
forall (r :: * -> *) a. Monad r => a -> r a
toCode
  funcType :: [VSType CodeInfo] -> VSType CodeInfo -> VSType CodeInfo
funcType      _ _ = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType
  void :: VSType CodeInfo
void              = VSType CodeInfo
forall s. State s (CodeInfo Label)
noInfoType

instance TypeElim CodeInfo where
  getType :: CodeInfo (Type CodeInfo) -> CodeType
getType _     = CodeType
Void
  getTypeString :: CodeInfo (Type CodeInfo) -> Label
getTypeString = CodeInfo (Type CodeInfo) -> Label
forall a. CodeInfo a -> a
unCI

instance VariableSym CodeInfo where
  type Variable CodeInfo = ()
  var :: Label -> VSType CodeInfo -> SVariable CodeInfo
var         _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  staticVar :: Label -> VSType CodeInfo -> SVariable CodeInfo
staticVar   _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  const :: Label -> VSType CodeInfo -> SVariable CodeInfo
const       _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  extVar :: Label -> Label -> VSType CodeInfo -> SVariable CodeInfo
extVar      _ _ _ = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  self :: SVariable CodeInfo
self              = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  classVar :: VSType CodeInfo -> SVariable CodeInfo -> SVariable CodeInfo
classVar    _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  extClassVar :: VSType CodeInfo -> SVariable CodeInfo -> SVariable CodeInfo
extClassVar _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  objVar :: SVariable CodeInfo -> SVariable CodeInfo -> SVariable CodeInfo
objVar      _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  objVarSelf :: SVariable CodeInfo -> SVariable CodeInfo
objVarSelf  _     = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  arrayElem :: Integer -> SVariable CodeInfo -> SVariable CodeInfo
arrayElem   _ _   = SVariable CodeInfo
forall s. State s (CodeInfo ())
noInfo
  
instance VariableElim CodeInfo where
  variableName :: CodeInfo (Variable CodeInfo) -> Label
variableName _ = ""
  variableType :: CodeInfo (Variable CodeInfo) -> CodeInfo (Type CodeInfo)
variableType _ = Label -> CodeInfo Label
forall (r :: * -> *) a. Monad r => a -> r a
toCode ""

instance ValueSym CodeInfo where
  type Value CodeInfo = ()
  valueType :: CodeInfo (Value CodeInfo) -> CodeInfo (Type CodeInfo)
valueType _ = Label -> CodeInfo Label
forall (r :: * -> *) a. Monad r => a -> r a
toCode ""

instance Argument CodeInfo where
  pointerArg :: SValue CodeInfo -> SValue CodeInfo
pointerArg = SValue CodeInfo -> SValue CodeInfo
forall a. a -> a
id

instance Literal CodeInfo where
  litTrue :: SValue CodeInfo
litTrue     = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litFalse :: SValue CodeInfo
litFalse    = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litChar :: Char -> SValue CodeInfo
litChar   _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litDouble :: Double -> SValue CodeInfo
litDouble _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litFloat :: Float -> SValue CodeInfo
litFloat  _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litInt :: Integer -> SValue CodeInfo
litInt    _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litString :: Label -> SValue CodeInfo
litString _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  litArray :: VSType CodeInfo -> [SValue CodeInfo] -> SValue CodeInfo
litArray  _ = [SValue CodeInfo] -> SValue CodeInfo
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  litList :: VSType CodeInfo -> [SValue CodeInfo] -> SValue CodeInfo
litList   _ = [SValue CodeInfo] -> SValue CodeInfo
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList

instance MathConstant CodeInfo where
  pi :: SValue CodeInfo
pi = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance VariableValue CodeInfo where
  valueOf :: SVariable CodeInfo -> SValue CodeInfo
valueOf _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance CommandLineArgs CodeInfo where
  arg :: Integer -> SValue CodeInfo
arg       _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  argsList :: SValue CodeInfo
argsList    = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo
  argExists :: Integer -> SValue CodeInfo
argExists _ = SValue CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance NumericExpression CodeInfo where
  #~ :: SValue CodeInfo -> SValue CodeInfo
(#~)  = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  #/^ :: SValue CodeInfo -> SValue CodeInfo
(#/^) = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  #| :: SValue CodeInfo -> SValue CodeInfo
(#|)  = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  #+ :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(#+)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  #- :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(#-)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  #* :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(#*)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  #/ :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(#/)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  #% :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(#%)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  #^ :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(#^)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2

  log :: SValue CodeInfo -> SValue CodeInfo
log    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  ln :: SValue CodeInfo -> SValue CodeInfo
ln     = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  exp :: SValue CodeInfo -> SValue CodeInfo
exp    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  sin :: SValue CodeInfo -> SValue CodeInfo
sin    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  cos :: SValue CodeInfo -> SValue CodeInfo
cos    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  tan :: SValue CodeInfo -> SValue CodeInfo
tan    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  csc :: SValue CodeInfo -> SValue CodeInfo
csc    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  sec :: SValue CodeInfo -> SValue CodeInfo
sec    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  cot :: SValue CodeInfo -> SValue CodeInfo
cot    = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  arcsin :: SValue CodeInfo -> SValue CodeInfo
arcsin = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  arccos :: SValue CodeInfo -> SValue CodeInfo
arccos = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  arctan :: SValue CodeInfo -> SValue CodeInfo
arctan = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  floor :: SValue CodeInfo -> SValue CodeInfo
floor  = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  ceil :: SValue CodeInfo -> SValue CodeInfo
ceil   = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

instance BooleanExpression CodeInfo where
  ?! :: SValue CodeInfo -> SValue CodeInfo
(?!)  = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  ?&& :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?&&) = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  ?|| :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?||) = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2

instance Comparison CodeInfo where
  ?< :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?<)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  ?<= :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?<=) = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  ?> :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?>)  = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  ?>= :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?>=) = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  ?== :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?==) = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  ?!= :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
(?!=) = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
    
instance ValueExpression CodeInfo where
  inlineIf :: SValue CodeInfo
-> SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
inlineIf = SValue CodeInfo
-> SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute3
  funcAppMixedArgs :: MixedCall CodeInfo
funcAppMixedArgs n :: Label
n _ = Label
-> [VS (CodeInfo ())]
-> [(VS (CodeInfo ()), VS (CodeInfo ()))]
-> VS (CodeInfo ())
currModCall Label
n
  selfFuncAppMixedArgs :: MixedCall CodeInfo
selfFuncAppMixedArgs = MixedCall CodeInfo
forall (r :: * -> *). ValueExpression r => MixedCall r
funcAppMixedArgs
  extFuncAppMixedArgs :: Label -> MixedCall CodeInfo
extFuncAppMixedArgs l :: Label
l n :: Label
n _ vs :: [SValue CodeInfo]
vs ns :: [(SVariable CodeInfo, SValue CodeInfo)]
ns = do
    [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
[SValue CodeInfo]
vs
    [(VS (CodeInfo ()), VS (CodeInfo ()))] -> VS (CodeInfo ())
forall a.
[(State a (CodeInfo ()), State a (CodeInfo ()))]
-> State a (CodeInfo ())
executePairList [(VS (CodeInfo ()), VS (CodeInfo ()))]
[(SVariable CodeInfo, SValue CodeInfo)]
ns
    Label -> Label -> SValue CodeInfo
addExternalCall Label
l Label
n  
  libFuncAppMixedArgs :: Label -> MixedCall CodeInfo
libFuncAppMixedArgs = Label -> MixedCall CodeInfo
forall (r :: * -> *). ValueExpression r => Label -> MixedCall r
extFuncAppMixedArgs
  newObjMixedArgs :: MixedCtorCall CodeInfo
newObjMixedArgs ot :: VSType CodeInfo
ot vs :: [SValue CodeInfo]
vs ns :: [(SVariable CodeInfo, SValue CodeInfo)]
ns = do
    [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
[SValue CodeInfo]
vs
    [(VS (CodeInfo ()), VS (CodeInfo ()))] -> VS (CodeInfo ())
forall a.
[(State a (CodeInfo ()), State a (CodeInfo ()))]
-> State a (CodeInfo ())
executePairList [(VS (CodeInfo ()), VS (CodeInfo ()))]
[(SVariable CodeInfo, SValue CodeInfo)]
ns
    VSType CodeInfo -> SValue CodeInfo
addCurrModConstructorCall VSType CodeInfo
ot
  extNewObjMixedArgs :: MixedCall CodeInfo
extNewObjMixedArgs l :: Label
l ot :: VSType CodeInfo
ot vs :: [SValue CodeInfo]
vs ns :: [(SVariable CodeInfo, SValue CodeInfo)]
ns = do
    [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
[SValue CodeInfo]
vs
    [(VS (CodeInfo ()), VS (CodeInfo ()))] -> VS (CodeInfo ())
forall a.
[(State a (CodeInfo ()), State a (CodeInfo ()))]
-> State a (CodeInfo ())
executePairList [(VS (CodeInfo ()), VS (CodeInfo ()))]
[(SVariable CodeInfo, SValue CodeInfo)]
ns
    Label -> VSType CodeInfo -> SValue CodeInfo
addExternalConstructorCall Label
l VSType CodeInfo
ot
  libNewObjMixedArgs :: MixedCall CodeInfo
libNewObjMixedArgs = MixedCall CodeInfo
forall (r :: * -> *). ValueExpression r => MixedCall r
extNewObjMixedArgs

  lambda :: [SVariable CodeInfo] -> SValue CodeInfo -> SValue CodeInfo
lambda _ = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

  notNull :: SValue CodeInfo -> SValue CodeInfo
notNull = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  
instance InternalValueExp CodeInfo where
  objMethodCallMixedArgs' :: Label
-> VSType CodeInfo
-> SValue CodeInfo
-> [SValue CodeInfo]
-> [(SVariable CodeInfo, SValue CodeInfo)]
-> SValue CodeInfo
objMethodCallMixedArgs' n :: Label
n _ v :: SValue CodeInfo
v vs :: [SValue CodeInfo]
vs ns :: [(SVariable CodeInfo, SValue CodeInfo)]
ns = VS (CodeInfo ())
SValue CodeInfo
v VS (CodeInfo ()) -> VS (CodeInfo ()) -> VS (CodeInfo ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Label
-> [VS (CodeInfo ())]
-> [(VS (CodeInfo ()), VS (CodeInfo ()))]
-> VS (CodeInfo ())
currModCall Label
n [VS (CodeInfo ())]
[SValue CodeInfo]
vs [(VS (CodeInfo ()), VS (CodeInfo ()))]
[(SVariable CodeInfo, SValue CodeInfo)]
ns

instance FunctionSym CodeInfo where
  type Function CodeInfo = ()
  func :: Label
-> VSType CodeInfo -> [SValue CodeInfo] -> VSFunction CodeInfo
func  _ _ = [SValue CodeInfo] -> VSFunction CodeInfo
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  objAccess :: SValue CodeInfo -> VSFunction CodeInfo -> SValue CodeInfo
objAccess = SValue CodeInfo -> VSFunction CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  
instance GetSet CodeInfo where
  get :: SValue CodeInfo -> SVariable CodeInfo -> SValue CodeInfo
get v :: SValue CodeInfo
v _ = VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 VS (CodeInfo ())
SValue CodeInfo
v
  set :: SValue CodeInfo
-> SVariable CodeInfo -> SValue CodeInfo -> SValue CodeInfo
set v :: SValue CodeInfo
v _ = VS (CodeInfo ()) -> VS (CodeInfo ()) -> VS (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 VS (CodeInfo ())
SValue CodeInfo
v

instance List CodeInfo where
  listSize :: SValue CodeInfo -> SValue CodeInfo
listSize   = SValue CodeInfo -> SValue CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  listAdd :: SValue CodeInfo
-> SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
listAdd    = SValue CodeInfo
-> SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute3
  listAppend :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
listAppend = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  listAccess :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
listAccess = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  listSet :: SValue CodeInfo
-> SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
listSet    = SValue CodeInfo
-> SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute3
  indexOf :: SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
indexOf    = SValue CodeInfo -> SValue CodeInfo -> SValue CodeInfo
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2
  
instance InternalList CodeInfo where
  listSlice' :: Maybe (SValue CodeInfo)
-> Maybe (SValue CodeInfo)
-> Maybe (SValue CodeInfo)
-> SVariable CodeInfo
-> SValue CodeInfo
-> MSBlock CodeInfo
listSlice' b :: Maybe (SValue CodeInfo)
b e :: Maybe (SValue CodeInfo)
e s :: Maybe (SValue CodeInfo)
s _ vl :: SValue CodeInfo
vl = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSBlock CodeInfo)
-> VS (CodeInfo ()) -> MSBlock CodeInfo
forall a b. (a -> b) -> a -> b
$ do
    (Maybe (VS (CodeInfo ())) -> VS (CodeInfo ()))
-> [Maybe (VS (CodeInfo ()))] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (VS (CodeInfo ()) -> Maybe (VS (CodeInfo ())) -> VS (CodeInfo ())
forall a. a -> Maybe a -> a
fromMaybe VS (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo) [Maybe (VS (CodeInfo ()))
Maybe (SValue CodeInfo)
b,Maybe (VS (CodeInfo ()))
Maybe (SValue CodeInfo)
e,Maybe (VS (CodeInfo ()))
Maybe (SValue CodeInfo)
s]
    CodeInfo ()
_ <- VS (CodeInfo ())
SValue CodeInfo
vl
    VS (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

instance StatementSym CodeInfo where
  type Statement CodeInfo = ()
  valStmt :: SValue CodeInfo -> MSStatement CodeInfo
valStmt = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  multi :: [MSStatement CodeInfo] -> MSStatement CodeInfo
multi    = [MSStatement CodeInfo] -> MSStatement CodeInfo
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  
instance AssignStatement CodeInfo where
  assign :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
assign _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  &-= :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
(&-=)  _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  &+= :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
(&+=)  _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  &++ :: SVariable CodeInfo -> MSStatement CodeInfo
(&++)  _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  &-- :: SVariable CodeInfo -> MSStatement CodeInfo
(&--)  _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance DeclStatement CodeInfo where
  varDec :: SVariable CodeInfo -> MSStatement CodeInfo
varDec                 _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  varDecDef :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
varDecDef              _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  listDec :: Integer -> SVariable CodeInfo -> MSStatement CodeInfo
listDec              _ _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  listDecDef :: SVariable CodeInfo -> [SValue CodeInfo] -> MSStatement CodeInfo
listDecDef             _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> ([VS (CodeInfo ())] -> VS (CodeInfo ()))
-> [VS (CodeInfo ())]
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [VS (CodeInfo ())] -> VS (CodeInfo ())
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  arrayDec :: Integer -> SVariable CodeInfo -> MSStatement CodeInfo
arrayDec             _ _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  arrayDecDef :: SVariable CodeInfo -> [SValue CodeInfo] -> MSStatement CodeInfo
arrayDecDef            _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> ([VS (CodeInfo ())] -> VS (CodeInfo ()))
-> [VS (CodeInfo ())]
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [VS (CodeInfo ())] -> VS (CodeInfo ())
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  objDecDef :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
objDecDef              _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  objDecNew :: SVariable CodeInfo -> [SValue CodeInfo] -> MSStatement CodeInfo
objDecNew              _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> ([VS (CodeInfo ())] -> VS (CodeInfo ()))
-> [VS (CodeInfo ())]
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [VS (CodeInfo ())] -> VS (CodeInfo ())
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  extObjDecNew :: Label
-> SVariable CodeInfo -> [SValue CodeInfo] -> MSStatement CodeInfo
extObjDecNew         _ _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> ([VS (CodeInfo ())] -> VS (CodeInfo ()))
-> [VS (CodeInfo ())]
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [VS (CodeInfo ())] -> VS (CodeInfo ())
forall a. [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList
  constDecDef :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
constDecDef            _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  funcDecDef :: SVariable CodeInfo
-> [SVariable CodeInfo] -> MSBody CodeInfo -> MSStatement CodeInfo
funcDecDef           _ _ = MSBody CodeInfo -> MSStatement CodeInfo
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

instance IOStatement CodeInfo where
  print :: SValue CodeInfo -> MSStatement CodeInfo
print        = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  printLn :: SValue CodeInfo -> MSStatement CodeInfo
printLn      = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  printStr :: Label -> MSStatement CodeInfo
printStr   _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  printStrLn :: Label -> MSStatement CodeInfo
printStrLn _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo

  printFile :: SValue CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
printFile      v :: SValue CodeInfo
v   = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ()) -> VS (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 VS (CodeInfo ())
SValue CodeInfo
v
  printFileLn :: SValue CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
printFileLn    v :: SValue CodeInfo
v   = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ()) -> VS (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 VS (CodeInfo ())
SValue CodeInfo
v
  printFileStr :: SValue CodeInfo -> Label -> MSStatement CodeInfo
printFileStr   v :: SValue CodeInfo
v _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 VS (CodeInfo ())
SValue CodeInfo
v
  printFileStrLn :: SValue CodeInfo -> Label -> MSStatement CodeInfo
printFileStrLn v :: SValue CodeInfo
v _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 VS (CodeInfo ())
SValue CodeInfo
v

  getInput :: SVariable CodeInfo -> MSStatement CodeInfo
getInput       _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  discardInput :: MSStatement CodeInfo
discardInput     = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  getFileInput :: SValue CodeInfo -> SVariable CodeInfo -> MSStatement CodeInfo
getFileInput v :: SValue CodeInfo
v _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 VS (CodeInfo ())
SValue CodeInfo
v
  discardFileInput :: SValue CodeInfo -> MSStatement CodeInfo
discardFileInput = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

  openFileR :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
openFileR _ v :: SValue CodeInfo
v = (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (ExceptionType -> MethodState -> MethodState
addException ExceptionType
FileNotFound) StateT MethodState Identity ()
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
    StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)
  openFileW :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
openFileW _ v :: SValue CodeInfo
v = (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (ExceptionType -> MethodState -> MethodState
addException ExceptionType
IO) StateT MethodState Identity ()
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)
  openFileA :: SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
openFileA _ v :: SValue CodeInfo
v = (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (ExceptionType -> MethodState -> MethodState
addException ExceptionType
IO) StateT MethodState Identity ()
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)
  closeFile :: SValue CodeInfo -> MSStatement CodeInfo
closeFile     = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

  getFileInputLine :: SValue CodeInfo -> SVariable CodeInfo -> MSStatement CodeInfo
getFileInputLine v :: SValue CodeInfo
v _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 VS (CodeInfo ())
SValue CodeInfo
v
  discardFileLine :: SValue CodeInfo -> MSStatement CodeInfo
discardFileLine      = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  getFileInputAll :: SValue CodeInfo -> SVariable CodeInfo -> MSStatement CodeInfo
getFileInputAll  v :: SValue CodeInfo
v _ = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)

instance StringStatement CodeInfo where
  stringSplit :: Char
-> SVariable CodeInfo -> SValue CodeInfo -> MSStatement CodeInfo
stringSplit _ _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

  stringListVals :: [SVariable CodeInfo] -> SValue CodeInfo -> MSStatement CodeInfo
stringListVals  _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1
  stringListLists :: [SVariable CodeInfo] -> SValue CodeInfo -> MSStatement CodeInfo
stringListLists _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

instance FuncAppStatement CodeInfo where
  inOutCall :: InOutCall CodeInfo
inOutCall n :: Label
n vs :: [SValue CodeInfo]
vs _ _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ do
    [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
[SValue CodeInfo]
vs
    Label -> SValue CodeInfo
addCurrModCall Label
n
  selfInOutCall :: InOutCall CodeInfo
selfInOutCall n :: Label
n vs :: [SValue CodeInfo]
vs _ _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ do
    [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
[SValue CodeInfo]
vs
    Label -> SValue CodeInfo
addCurrModCall Label
n
  extInOutCall :: Label -> InOutCall CodeInfo
extInOutCall l :: Label
l n :: Label
n vs :: [SValue CodeInfo]
vs _ _ = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> MSStatement CodeInfo)
-> VS (CodeInfo ()) -> MSStatement CodeInfo
forall a b. (a -> b) -> a -> b
$ do
    [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
[SValue CodeInfo]
vs
    Label -> Label -> SValue CodeInfo
addExternalCall Label
l Label
n

instance CommentStatement CodeInfo where
  comment :: Label -> MSStatement CodeInfo
comment _ = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance ControlStatement CodeInfo where
  break :: MSStatement CodeInfo
break    = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo
  continue :: MSStatement CodeInfo
continue = MSStatement CodeInfo
forall s. State s (CodeInfo ())
noInfo

  returnStmt :: SValue CodeInfo -> MSStatement CodeInfo
returnStmt = LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> (VS (CodeInfo ()) -> VS (CodeInfo ()))
-> VS (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VS (CodeInfo ()) -> VS (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1

  throw :: Label -> MSStatement CodeInfo
throw _ = (MethodState -> MethodState)
-> CodeInfo () -> StateT MethodState Identity (CodeInfo ())
forall s a. (s -> s) -> a -> State s a
modifyReturn (ExceptionType -> MethodState -> MethodState
addException ExceptionType
Standard) (() -> CodeInfo ()
forall (r :: * -> *) a. Monad r => a -> r a
toCode ())

  ifCond :: [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo -> MSStatement CodeInfo
ifCond = [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo -> MSStatement CodeInfo
evalConds
  switch :: SValue CodeInfo
-> [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo
-> MSStatement CodeInfo
switch v :: SValue CodeInfo
v cs :: [(SValue CodeInfo, MSBody CodeInfo)]
cs b :: MSBody CodeInfo
b = do
    CodeInfo ()
_ <- LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v
    [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo -> MSStatement CodeInfo
evalConds [(SValue CodeInfo, MSBody CodeInfo)]
cs MSBody CodeInfo
b

  ifExists :: SValue CodeInfo
-> MSBody CodeInfo -> MSBody CodeInfo -> MSStatement CodeInfo
ifExists v :: SValue CodeInfo
v = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute3 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)

  for :: MSStatement CodeInfo
-> SValue CodeInfo
-> MSStatement CodeInfo
-> MSBody CodeInfo
-> MSStatement CodeInfo
for dec :: MSStatement CodeInfo
dec v :: SValue CodeInfo
v = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute4 StateT MethodState Identity (CodeInfo ())
MSStatement CodeInfo
dec (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)
  forRange :: SVariable CodeInfo
-> SValue CodeInfo
-> SValue CodeInfo
-> SValue CodeInfo
-> MSBody CodeInfo
-> MSStatement CodeInfo
forRange _ b :: SValue CodeInfo
b e :: SValue CodeInfo
e s :: SValue CodeInfo
s = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute4 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
b) (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
e) 
    (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
s)
  forEach :: SVariable CodeInfo
-> SValue CodeInfo -> MSBody CodeInfo -> MSStatement CodeInfo
forEach _ v :: SValue CodeInfo
v = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)
  while :: SValue CodeInfo -> MSBody CodeInfo -> MSStatement CodeInfo
while v :: SValue CodeInfo
v = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
SValue CodeInfo
v)

  tryCatch :: MSBody CodeInfo -> MSBody CodeInfo -> MSStatement CodeInfo
tryCatch _ cb :: MSBody CodeInfo
cb = do
    CodeInfo ()
_ <- StateT MethodState Identity (CodeInfo ())
MSBody CodeInfo
cb
    StateT MethodState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

instance StatePattern CodeInfo where
  checkState :: Label
-> [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo
-> MSStatement CodeInfo
checkState _ = [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo -> MSStatement CodeInfo
evalConds

instance ObserverPattern CodeInfo where
  notifyObservers :: VSFunction CodeInfo -> VSType CodeInfo -> MSStatement CodeInfo
notifyObservers f :: VSFunction CodeInfo
f _ = StateT MethodState Identity (CodeInfo ())
-> StateT MethodState Identity (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS VS (CodeInfo ())
VSFunction CodeInfo
f)
  
instance StrategyPattern CodeInfo where
  runStrategy :: Label
-> [(Label, MSBody CodeInfo)]
-> Maybe (SValue CodeInfo)
-> Maybe (SVariable CodeInfo)
-> MSBlock CodeInfo
runStrategy _ ss :: [(Label, MSBody CodeInfo)]
ss vl :: Maybe (SValue CodeInfo)
vl _ = do
    ((Label, StateT MethodState Identity (CodeInfo ()))
 -> StateT MethodState Identity (CodeInfo ()))
-> [(Label, StateT MethodState Identity (CodeInfo ()))]
-> StateT MethodState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Label, StateT MethodState Identity (CodeInfo ()))
-> StateT MethodState Identity (CodeInfo ())
forall a b. (a, b) -> b
snd [(Label, StateT MethodState Identity (CodeInfo ()))]
[(Label, MSBody CodeInfo)]
ss
    CodeInfo ()
_ <- LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall a b. (a -> b) -> a -> b
$ VS (CodeInfo ()) -> Maybe (VS (CodeInfo ())) -> VS (CodeInfo ())
forall a. a -> Maybe a -> a
fromMaybe VS (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo Maybe (VS (CodeInfo ()))
Maybe (SValue CodeInfo)
vl
    StateT MethodState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

instance ScopeSym CodeInfo where
  type Scope CodeInfo = ScopeTag
  private :: CodeInfo (Scope CodeInfo)
private = ScopeTag -> CodeInfo ScopeTag
forall (r :: * -> *) a. Monad r => a -> r a
toCode ScopeTag
Priv
  public :: CodeInfo (Scope CodeInfo)
public  = ScopeTag -> CodeInfo ScopeTag
forall (r :: * -> *) a. Monad r => a -> r a
toCode ScopeTag
Pub

instance ParameterSym CodeInfo where
  type Parameter CodeInfo = ()
  param :: SVariable CodeInfo -> MSParameter CodeInfo
param        _ = MSParameter CodeInfo
forall s. State s (CodeInfo ())
noInfo
  pointerParam :: SVariable CodeInfo -> MSParameter CodeInfo
pointerParam _ = MSParameter CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance MethodSym CodeInfo where
  type Method CodeInfo = ()
  method :: Label
-> CodeInfo (Scope CodeInfo)
-> CodeInfo (Permanence CodeInfo)
-> VSType CodeInfo
-> [MSParameter CodeInfo]
-> MSBody CodeInfo
-> SMethod CodeInfo
method n :: Label
n _ _ _ _ = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM Label
n
  getMethod :: SVariable CodeInfo -> SMethod CodeInfo
getMethod _ = SMethod CodeInfo
forall s. State s (CodeInfo ())
noInfo
  setMethod :: SVariable CodeInfo -> SMethod CodeInfo
setMethod _ = SMethod CodeInfo
forall s. State s (CodeInfo ())
noInfo
  constructor :: [MSParameter CodeInfo]
-> [(SVariable CodeInfo, SValue CodeInfo)]
-> MSBody CodeInfo
-> SMethod CodeInfo
constructor _ il :: [(SVariable CodeInfo, SValue CodeInfo)]
il b :: MSBody CodeInfo
b = do
    ((VS (CodeInfo ()), VS (CodeInfo ()))
 -> StateT MethodState Identity (CodeInfo ()))
-> [(VS (CodeInfo ()), VS (CodeInfo ()))]
-> StateT MethodState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> ((VS (CodeInfo ()), VS (CodeInfo ())) -> VS (CodeInfo ()))
-> (VS (CodeInfo ()), VS (CodeInfo ()))
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VS (CodeInfo ()), VS (CodeInfo ())) -> VS (CodeInfo ())
forall a b. (a, b) -> b
snd) [(VS (CodeInfo ()), VS (CodeInfo ()))]
[(SVariable CodeInfo, SValue CodeInfo)]
il
    CodeInfo ()
_ <- StateT MethodState Identity (CodeInfo ())
MSBody CodeInfo
b
    Label
cn <- MS Label
getClassName
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Label -> MethodState -> MethodState
updateCallMap Label
cn (MethodState -> MethodState)
-> (MethodState -> MethodState) -> MethodState -> MethodState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> MethodState -> MethodState
updateMethodExcMap Label
cn)
    StateT MethodState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

  docMain :: MSBody CodeInfo -> SMethod CodeInfo
docMain = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM "main"

  function :: Label
-> CodeInfo (Scope CodeInfo)
-> VSType CodeInfo
-> [MSParameter CodeInfo]
-> MSBody CodeInfo
-> SMethod CodeInfo
function n :: Label
n _ _ _ = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM Label
n
  mainFunction :: MSBody CodeInfo -> SMethod CodeInfo
mainFunction = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM "main"

  docFunc :: Label
-> [Label] -> Maybe Label -> SMethod CodeInfo -> SMethod CodeInfo
docFunc _ _ _ f :: SMethod CodeInfo
f = do
    CodeInfo ()
_ <- StateT MethodState Identity (CodeInfo ())
SMethod CodeInfo
f
    StateT MethodState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

  inOutMethod :: Label
-> CodeInfo (Scope CodeInfo)
-> CodeInfo (Permanence CodeInfo)
-> InOutFunc CodeInfo
inOutMethod    n :: Label
n _ _ _ _ _   = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM Label
n

  docInOutMethod :: Label
-> CodeInfo (Scope CodeInfo)
-> CodeInfo (Permanence CodeInfo)
-> DocInOutFunc CodeInfo
docInOutMethod n :: Label
n _ _ _ _ _ _ = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM Label
n

  inOutFunc :: Label -> CodeInfo (Scope CodeInfo) -> InOutFunc CodeInfo
inOutFunc      n :: Label
n _ _ _ _     = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM Label
n

  docInOutFunc :: Label -> CodeInfo (Scope CodeInfo) -> DocInOutFunc CodeInfo
docInOutFunc   n :: Label
n _ _ _ _ _   = Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM Label
n

instance StateVarSym CodeInfo where
  type StateVar CodeInfo = ()
  stateVar :: CodeInfo (Scope CodeInfo)
-> CodeInfo (Permanence CodeInfo)
-> SVariable CodeInfo
-> CSStateVar CodeInfo
stateVar    _ _ _   = CSStateVar CodeInfo
forall s. State s (CodeInfo ())
noInfo
  stateVarDef :: CodeInfo (Scope CodeInfo)
-> CodeInfo (Permanence CodeInfo)
-> SVariable CodeInfo
-> SValue CodeInfo
-> CSStateVar CodeInfo
stateVarDef _ _ _ _ = CSStateVar CodeInfo
forall s. State s (CodeInfo ())
noInfo
  constVar :: CodeInfo (Scope CodeInfo)
-> SVariable CodeInfo -> SValue CodeInfo -> CSStateVar CodeInfo
constVar    _ _ _   = CSStateVar CodeInfo
forall s. State s (CodeInfo ())
noInfo

instance ClassSym CodeInfo where
  type Class CodeInfo = ()
  buildClass :: Maybe Label
-> [CSStateVar CodeInfo] -> [SMethod CodeInfo] -> SClass CodeInfo
buildClass _ _ ms :: [SMethod CodeInfo]
ms = do
    Label
n <- LensLike'
  (Zoomed (StateT FileState Identity) Label) ClassState FileState
-> StateT FileState Identity Label
-> StateT ClassState Identity Label
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT FileState Identity) Label) ClassState FileState
Lens' ClassState FileState
lensCStoFS StateT FileState Identity Label
getModuleName
    Label
-> [Label]
-> [CSStateVar CodeInfo]
-> [SMethod CodeInfo]
-> SClass CodeInfo
forall (r :: * -> *).
ClassSym r =>
Label -> [Label] -> [CSStateVar r] -> [SMethod r] -> SClass r
implementingClass Label
n [] [] [SMethod CodeInfo]
ms
  extraClass :: Label
-> Maybe Label
-> [CSStateVar CodeInfo]
-> [SMethod CodeInfo]
-> SClass CodeInfo
extraClass n :: Label
n _ _ ms :: [SMethod CodeInfo]
ms = do
    (ClassState -> ClassState) -> StateT ClassState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Label -> ClassState -> ClassState
setClassName Label
n)
    (StateT MethodState Identity (CodeInfo ())
 -> StateT ClassState Identity (CodeInfo ()))
-> [StateT MethodState Identity (CodeInfo ())]
-> StateT ClassState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT MethodState Identity) (CodeInfo ()))
  ClassState
  MethodState
-> StateT MethodState Identity (CodeInfo ())
-> StateT ClassState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT MethodState Identity) (CodeInfo ()))
  ClassState
  MethodState
Lens' ClassState MethodState
lensCStoMS) [StateT MethodState Identity (CodeInfo ())]
[SMethod CodeInfo]
ms
    StateT ClassState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo
  implementingClass :: Label
-> [Label]
-> [CSStateVar CodeInfo]
-> [SMethod CodeInfo]
-> SClass CodeInfo
implementingClass n :: Label
n _ _ ms :: [SMethod CodeInfo]
ms = do
    (ClassState -> ClassState) -> StateT ClassState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Label -> ClassState -> ClassState
addClass Label
n (ClassState -> ClassState)
-> (ClassState -> ClassState) -> ClassState -> ClassState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> ClassState -> ClassState
setClassName Label
n)
    (StateT MethodState Identity (CodeInfo ())
 -> StateT ClassState Identity (CodeInfo ()))
-> [StateT MethodState Identity (CodeInfo ())]
-> StateT ClassState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT MethodState Identity) (CodeInfo ()))
  ClassState
  MethodState
-> StateT MethodState Identity (CodeInfo ())
-> StateT ClassState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT MethodState Identity) (CodeInfo ()))
  ClassState
  MethodState
Lens' ClassState MethodState
lensCStoMS) [StateT MethodState Identity (CodeInfo ())]
[SMethod CodeInfo]
ms
    StateT ClassState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

  docClass :: Label -> SClass CodeInfo -> SClass CodeInfo
docClass _ c :: SClass CodeInfo
c = do
    CodeInfo ()
_ <- StateT ClassState Identity (CodeInfo ())
SClass CodeInfo
c
    StateT ClassState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

instance ModuleSym CodeInfo where
  type Module CodeInfo = ()
  buildModule :: Label
-> [Label]
-> [SMethod CodeInfo]
-> [SClass CodeInfo]
-> FSModule CodeInfo
buildModule n :: Label
n _ fs :: [SMethod CodeInfo]
fs cs :: [SClass CodeInfo]
cs = do
    (FileState -> FileState) -> StateT FileState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Label -> FileState -> FileState
setModuleName Label
n)
    (StateT ClassState Identity (CodeInfo ())
 -> StateT FileState Identity (CodeInfo ()))
-> [StateT ClassState Identity (CodeInfo ())]
-> StateT FileState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT ClassState Identity) (CodeInfo ()))
  FileState
  ClassState
-> StateT ClassState Identity (CodeInfo ())
-> StateT FileState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ClassState Identity) (CodeInfo ()))
  FileState
  ClassState
Lens' FileState ClassState
lensFStoCS) [StateT ClassState Identity (CodeInfo ())]
[SClass CodeInfo]
cs 
    (StateT MethodState Identity (CodeInfo ())
 -> StateT FileState Identity (CodeInfo ()))
-> [StateT MethodState Identity (CodeInfo ())]
-> StateT FileState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT MethodState Identity) (CodeInfo ()))
  FileState
  MethodState
-> StateT MethodState Identity (CodeInfo ())
-> StateT FileState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT MethodState Identity) (CodeInfo ()))
  FileState
  MethodState
Lens' FileState MethodState
lensFStoMS) [StateT MethodState Identity (CodeInfo ())]
[SMethod CodeInfo]
fs
    (FileState -> FileState)
-> CodeInfo () -> StateT FileState Identity (CodeInfo ())
forall s a. (s -> s) -> a -> State s a
modifyReturn (Label -> FileState -> FileState
updateClassMap Label
n) (() -> CodeInfo ()
forall (r :: * -> *) a. Monad r => a -> r a
toCode ())

-- Helpers

noInfo :: State s (CodeInfo ())
noInfo :: State s (CodeInfo ())
noInfo = CodeInfo () -> State s (CodeInfo ())
forall a s. a -> State s a
toState (CodeInfo () -> State s (CodeInfo ()))
-> CodeInfo () -> State s (CodeInfo ())
forall a b. (a -> b) -> a -> b
$ () -> CodeInfo ()
forall (r :: * -> *) a. Monad r => a -> r a
toCode ()

noInfoType :: State s (CodeInfo String)
noInfoType :: State s (CodeInfo Label)
noInfoType = CodeInfo Label -> State s (CodeInfo Label)
forall a s. a -> State s a
toState (CodeInfo Label -> State s (CodeInfo Label))
-> CodeInfo Label -> State s (CodeInfo Label)
forall a b. (a -> b) -> a -> b
$ Label -> CodeInfo Label
forall (r :: * -> *) a. Monad r => a -> r a
toCode ""

updateMEMandCM :: String -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM :: Label -> MSBody CodeInfo -> SMethod CodeInfo
updateMEMandCM n :: Label
n b :: MSBody CodeInfo
b = do
  CodeInfo ()
_ <- StateT MethodState Identity (CodeInfo ())
MSBody CodeInfo
b
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Label -> MethodState -> MethodState
updateCallMap Label
n (MethodState -> MethodState)
-> (MethodState -> MethodState) -> MethodState -> MethodState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> MethodState -> MethodState
updateMethodExcMap Label
n)
  StateT MethodState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

evalConds :: [(SValue CodeInfo, MSBody CodeInfo)] -> MSBody CodeInfo -> 
  MSStatement CodeInfo
evalConds :: [(SValue CodeInfo, MSBody CodeInfo)]
-> MSBody CodeInfo -> MSStatement CodeInfo
evalConds cs :: [(SValue CodeInfo, MSBody CodeInfo)]
cs def :: MSBody CodeInfo
def = do
  ((VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))
 -> StateT MethodState Identity (CodeInfo ()))
-> [(VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))]
-> StateT MethodState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
-> VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ())
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT ValueState Identity) (CodeInfo ()))
  MethodState
  ValueState
Lens' MethodState ValueState
lensMStoVS (VS (CodeInfo ()) -> StateT MethodState Identity (CodeInfo ()))
-> ((VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))
    -> VS (CodeInfo ()))
-> (VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))
-> StateT MethodState Identity (CodeInfo ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))
-> VS (CodeInfo ())
forall a b. (a, b) -> a
fst) [(VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))]
[(SValue CodeInfo, MSBody CodeInfo)]
cs
  ((VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))
 -> StateT MethodState Identity (CodeInfo ()))
-> [(VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))]
-> StateT MethodState Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))
-> StateT MethodState Identity (CodeInfo ())
forall a b. (a, b) -> b
snd [(VS (CodeInfo ()), StateT MethodState Identity (CodeInfo ()))]
[(SValue CodeInfo, MSBody CodeInfo)]
cs
  CodeInfo ()
_ <- StateT MethodState Identity (CodeInfo ())
MSBody CodeInfo
def
  StateT MethodState Identity (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

addCurrModCall :: String -> SValue CodeInfo
addCurrModCall :: Label -> SValue CodeInfo
addCurrModCall n :: Label
n = do
  Label
mn <- LensLike'
  (Zoomed (StateT FileState Identity) Label) ValueState FileState
-> StateT FileState Identity Label
-> StateT ValueState Identity Label
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
  (Zoomed (StateT FileState Identity) Label) ValueState FileState
Lens' ValueState FileState
lensVStoFS StateT FileState Identity Label
getModuleName 
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (QualifiedName -> ValueState -> ValueState
addCall (Label -> Label -> QualifiedName
qualName Label
mn Label
n)) 
  VS (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

addCurrModConstructorCall :: VSType CodeInfo -> SValue CodeInfo
addCurrModConstructorCall :: VSType CodeInfo -> SValue CodeInfo
addCurrModConstructorCall ot :: VSType CodeInfo
ot = do
  CodeInfo Label
t <- State ValueState (CodeInfo Label)
VSType CodeInfo
ot
  let tp :: Label
tp = CodeInfo (Type CodeInfo) -> Label
forall (r :: * -> *). TypeElim r => r (Type r) -> Label
getTypeString CodeInfo Label
CodeInfo (Type CodeInfo)
t
  Label -> SValue CodeInfo
addCurrModCall Label
tp

addExternalCall :: String -> String -> SValue CodeInfo
addExternalCall :: Label -> Label -> SValue CodeInfo
addExternalCall l :: Label
l n :: Label
n = (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (QualifiedName -> ValueState -> ValueState
addCall (Label -> Label -> QualifiedName
qualName Label
l Label
n)) StateT ValueState Identity ()
-> VS (CodeInfo ()) -> VS (CodeInfo ())
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> VS (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

addExternalConstructorCall :: String -> VSType CodeInfo -> SValue CodeInfo
addExternalConstructorCall :: Label -> VSType CodeInfo -> SValue CodeInfo
addExternalConstructorCall l :: Label
l ot :: VSType CodeInfo
ot = do
  CodeInfo Label
t <- State ValueState (CodeInfo Label)
VSType CodeInfo
ot
  let tp :: Label
tp = CodeInfo (Type CodeInfo) -> Label
forall (r :: * -> *). TypeElim r => r (Type r) -> Label
getTypeString CodeInfo Label
CodeInfo (Type CodeInfo)
t
  Label -> Label -> SValue CodeInfo
addExternalCall Label
l Label
tp

execute1 :: State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 :: State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 s :: State a (CodeInfo ())
s = do
  CodeInfo ()
_ <- State a (CodeInfo ())
s
  State a (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

executeList :: [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList :: [State a (CodeInfo ())] -> State a (CodeInfo ())
executeList l :: [State a (CodeInfo ())]
l = do
  [State a (CodeInfo ())] -> StateT a Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [State a (CodeInfo ())]
l
  State a (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

executePairList :: [(State a (CodeInfo ()), State a (CodeInfo ()))] -> 
  State a (CodeInfo ())
executePairList :: [(State a (CodeInfo ()), State a (CodeInfo ()))]
-> State a (CodeInfo ())
executePairList ps :: [(State a (CodeInfo ()), State a (CodeInfo ()))]
ps = do
  ((State a (CodeInfo ()), State a (CodeInfo ()))
 -> State a (CodeInfo ()))
-> [(State a (CodeInfo ()), State a (CodeInfo ()))]
-> StateT a Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (State a (CodeInfo ()), State a (CodeInfo ()))
-> State a (CodeInfo ())
forall a b. (a, b) -> a
fst [(State a (CodeInfo ()), State a (CodeInfo ()))]
ps
  ((State a (CodeInfo ()), State a (CodeInfo ()))
 -> State a (CodeInfo ()))
-> [(State a (CodeInfo ()), State a (CodeInfo ()))]
-> StateT a Identity ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (State a (CodeInfo ()), State a (CodeInfo ()))
-> State a (CodeInfo ())
forall a b. (a, b) -> b
snd [(State a (CodeInfo ()), State a (CodeInfo ()))]
ps
  State a (CodeInfo ())
forall s. State s (CodeInfo ())
noInfo

execute2 :: State a (CodeInfo ()) -> State a (CodeInfo ()) -> 
  State a (CodeInfo ())
execute2 :: State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 s1 :: State a (CodeInfo ())
s1 s2 :: State a (CodeInfo ())
s2 = do
  CodeInfo ()
_ <- State a (CodeInfo ())
s1
  State a (CodeInfo ()) -> State a (CodeInfo ())
forall a. State a (CodeInfo ()) -> State a (CodeInfo ())
execute1 State a (CodeInfo ())
s2

execute3 :: State a (CodeInfo ()) -> State a (CodeInfo ()) -> 
  State a (CodeInfo ()) -> State a (CodeInfo ())
execute3 :: State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute3 s1 :: State a (CodeInfo ())
s1 s2 :: State a (CodeInfo ())
s2 s3 :: State a (CodeInfo ())
s3 = do
  CodeInfo ()
_ <- State a (CodeInfo ())
s1
  State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ()) -> State a (CodeInfo ())
execute2 State a (CodeInfo ())
s2 State a (CodeInfo ())
s3

execute4 :: State a (CodeInfo ()) -> State a (CodeInfo ()) -> 
  State a (CodeInfo ()) -> State a (CodeInfo ()) -> State a (CodeInfo ())
execute4 :: State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute4 s1 :: State a (CodeInfo ())
s1 s2 :: State a (CodeInfo ())
s2 s3 :: State a (CodeInfo ())
s3 s4 :: State a (CodeInfo ())
s4 = do
  CodeInfo ()
_ <- State a (CodeInfo ())
s1
  State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
forall a.
State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
-> State a (CodeInfo ())
execute3 State a (CodeInfo ())
s2 State a (CodeInfo ())
s3 State a (CodeInfo ())
s4

currModCall :: String -> [VS (CodeInfo ())] -> 
  [(VS (CodeInfo ()), VS (CodeInfo ()))] -> VS (CodeInfo ())
currModCall :: Label
-> [VS (CodeInfo ())]
-> [(VS (CodeInfo ()), VS (CodeInfo ()))]
-> VS (CodeInfo ())
currModCall n :: Label
n ps :: [VS (CodeInfo ())]
ps ns :: [(VS (CodeInfo ()), VS (CodeInfo ()))]
ns = do
  [VS (CodeInfo ())] -> StateT ValueState Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ [VS (CodeInfo ())]
ps
  [(VS (CodeInfo ()), VS (CodeInfo ()))] -> VS (CodeInfo ())
forall a.
[(State a (CodeInfo ()), State a (CodeInfo ()))]
-> State a (CodeInfo ())
executePairList [(VS (CodeInfo ()), VS (CodeInfo ()))]
ns
  Label -> SValue CodeInfo
addCurrModCall Label
n