{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PostfixOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}

-- | The logic to render Java code is contained in this module
module Drasil.GOOL.LanguageRenderer.JavaRenderer (
  -- * Java Code Configuration -- defines syntax of all Java code
  JavaCode(..), jName, jVersion
) where

import Drasil.FileHandling.Legacy (indent)

import Drasil.Shared.CodeType (CodeType(..))
import Drasil.Shared.InterfaceCommon (UnRepr(..), SharedProg, SharedStatement,
  Label, Body, SVariable, Value, SValue, BodySym(..), oneLiner, BlockSym(..),
  TypeSym(..), TypeElim(..), getTypeString, VariableSym(..), VisibilitySym(..),
  VariableElim(..),ValueSym(..), Argument(..), Literal(..), MathConstant(..),
  VariableValue(..), CommandLineArgs(..), NumericExpression(..),
  BooleanExpression(..), Comparison(..), ValueExpression(..), funcApp,
  extFuncApp, IndexTranslator(..), Reference(..), Array(..), List(..), Set(..),
  InternalList(..), StatementSym(..), AssignStatement(..), (&=),
  DeclStatement(..), IOStatement(..), StringStatement(..), FunctionSym,
  FuncAppStatement(..), CommentStatement(..), BinderSym(..), BinderElim(..),
  ControlStatement(..), ScopeSym(..), ParameterSym(..), MethodSym(..))
import Drasil.GOOL.InterfaceGOOL (Class, StateVar, CSStateVar, OOProg,
  OOStatement, ProgramSym(..), FileSym(..), ModuleSym(..), ClassSym(..),
  OOTypeSym(..), OOVariableSym(..), SelfSym(..), StateVarSym(..),
  AttachmentSym(..), OOValueSym, OOVariableValue, OOValueExpression(..),
  objMethodCall, selfMethodCall, newObj, InternalValueExp(..), OOFunctionSym(..),
  ($.), GetSet(..), OODeclStatement(..), OOFuncAppStatement(..),
  ObserverPattern(..), StrategyPattern(..), OOMethodSym(..))
import Drasil.Shared.RendererClassesCommon (CommonRenderSym, ImportSym(..),
  RenderBody(..), BodyElim, RenderBlock(..), BlockElim, RenderType(..),
  UnaryOpSym(..), BinaryOpSym(..), OpElim(uOpPrec, bOpPrec), RenderVariable(..),
  InternalVarElim(variableBind), RenderValue(..), ValueElim(valuePrec, valueInt),
  InternalListFunc(..), RenderFunction(..), FunctionElim(functionType),
  InternalAssignStmt(..), InternalIOStmt(..), InternalControlStmt(..),
  RenderStatement(..), StatementElim(statementTerm), RenderVisibility(..),
  VisibilityElim, MethodTypeSym(..), RenderParam(..),
  ParamElim(parameterName, parameterType), RenderMethod(..), MethodElim,
  BlockCommentSym(..), BlockCommentElim, ScopeElim(..), InternalBinderElim(..))
import qualified Drasil.Shared.RendererClassesCommon as RC (body, block, uOp,
  bOp, variable, value, function, statement, visibility, parameter, method,
  blockComment')
import Drasil.GOOL.RendererClassesOO (OORenderSym, RenderFile(..),
  PermElim(binding), InternalGetSet(..), OOMethodTypeSym(..),
  OORenderMethod(..), StateVarElim, RenderClass(..), ClassElim, RenderMod(..),
  ModuleElim)
import qualified Drasil.GOOL.RendererClassesOO as RC (perm, stateVar, class',
  module')
import Drasil.Shared.LanguageRenderer (new, elseIfLabel, forLabel, tryLabel,
  catchLabel, throwLabel, throwsLabel, importLabel, blockCmtStart, blockCmtEnd,
  docCmtStart, bodyStart, bodyEnd, endStatement, commentStart, exceptionObj',
  new', args, printLabel, exceptionObj, mainFunc, new, nullLabel, listSep,
  access, containing, mathFunc, functionDox, variableList,
  parameterList, appendToBody, surroundBody, valueList)
import qualified Drasil.Shared.LanguageRenderer as R (sqrt, abs, log10,
  log, exp, sin, cos, tan, asin, acos, atan, floor, ceil, pow, package, class',
  multiStmt, body, printFile, classVarAccess, cast, castObj,
  classLevel, instanceLevel, break, continue, private, public, blockCmt, docCmt,
  addComments, commentedMod, commentedItem)
import Drasil.GOOL.Renderers (renderType, renderParam, renderListDec)
import Drasil.Shared.LanguageRenderer.Constructors (mkStmt, mkStateVal, mkVal,
  typeFromData, VSOp, unOpPrec, powerPrec, unExpr, unExpr', unExprNumDbl,
  typeUnExpr, binExpr, binExprNumDbl', typeBinExpr, typeFromData)
import qualified Drasil.Shared.LanguageRenderer.LanguagePolymorphic as G (
  multiBody, block, multiBlock, obj, csc, sec, cot, negateOp, equalOp,
  notEqualOp, greaterOp, greaterEqualOp, lessOp, lessEqualOp, plusOp, minusOp,
  multOp, divideOp, moduloOp, var, classVar, instanceVarAccess, arrayElem,
  litChar, litDouble, litInt, litString, valueOf, arg, argsList, objAccess,
  objMethodCall, funcAppMixedArgs, newObjMixedArgs, lambda, func, get, set,
  listAccess, getFunc, setFunc, stmt, loopStmt, emptyStmt, assign, subAssign,
  objDecNew, print, closeFile, returnStmt, valStmt, comment, throw, ifCond,
  tryCatch, construct, param, method, getMethod, setMethod, function, buildClass,
  implementingClass, commentedClass, modFromData, fileDoc, fileFromData,
  defaultOptSpace, local)
import Drasil.Shared.LanguageRenderer.LanguagePolymorphic (docFuncRepr)
import qualified Drasil.Shared.LanguageRenderer.CommonPseudoOO as CP
import qualified Drasil.Shared.LanguageRenderer.CLike as C (float, double, char,
  listType, void, notOp, andOp, orOp, self, litTrue, litFalse, litFloat,
  inlineIf, libFuncAppMixedArgs, libNewObjMixedArgs, listSize, increment,
  increment1, decrement1, varDec, varDecDef, listDec, extObjDecNew, switch, for,
  while, intFunc, multiAssignError, multiReturnError, multiTypeError, setType)
import qualified Drasil.Shared.LanguageRenderer.Macros as M (ifExists,
  runStrategy, listSlice, stringListVals, stringListLists, forRange,
  notifyObservers)
import qualified Drasil.GOOL.LanguageRenderer.CommonGOOL as CG (classMethodCall,
  listAppend, listAdd, innerType)
import Drasil.Shared.AST (Terminator(..), VisibilityTag(..), qualName,
  FileType(..), fileD, FuncData(..), fd, ModData(..), md, updateMod,
  MethodData(..), mthd, updateMthd, OpData(..), ParamData(..), pd, ProgData(..),
  progD, TypeData(..), ValData(..), vd, VarData(..), vard, ScopeData,
  BinderD(..), bindFormD)
import Drasil.Shared.CodeAnalysis (Exception(..), ExceptionType(..), exception,
  stdExc, HasException(..))
import Drasil.Shared.Helpers (emptyIfNull, toCode, toState, onCodeValue,
  onStateValue, on2CodeValues, on2StateValues, on3CodeValues, on3StateValues,
  onCodeList, onStateList, on2StateWrapped)
import Drasil.Shared.State (CS, MS, VS, lensGStoFS, lensMStoFS, lensMStoVS,
  lensVStoFS, lensVStoMS, modifyReturn, modifyReturnList, revFiles,
  addProgNameToPaths, addLangImport, addLangImportVS, addExceptionImports,
  getModuleName, setFileType, getClassName, setCurrMain, setOutputsDeclared,
  isOutputsDeclared, getExceptions, getMethodExcMap, addExceptions, useVarName,
  setVarScope)

import Prelude hiding (break,print,sin,cos,tan,floor,(<>))
import Control.Lens.Zoom (zoom)
import Control.Monad (join)
import Control.Monad.State (modify)
import Data.Composition ((.:))
import qualified Data.Map as Map (lookup)
import Data.List (nub, intercalate, sort)
import Text.PrettyPrint.HughesPJ (Doc, text, (<>), (<+>), ($$), parens, empty,
  equals, vcat, lbrace, rbrace, braces, colon, quotes)

import qualified Drasil.Shared.LanguageRenderer.Common as CS

jExt :: String
jExt :: String
jExt = String
"java"

newtype JavaCode a = JC {forall a. JavaCode a -> a
unJC :: a}

instance Functor JavaCode where
  fmap :: forall a b. (a -> b) -> JavaCode a -> JavaCode b
fmap a -> b
f (JC a
x) = b -> JavaCode b
forall a. a -> JavaCode a
JC (a -> b
f a
x)

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

instance Monad JavaCode where
  JC a
x >>= :: forall a b. JavaCode a -> (a -> JavaCode b) -> JavaCode b
>>= a -> JavaCode b
f = a -> JavaCode b
f a
x

instance SharedProg JavaCode Doc (Doc, Terminator) MethodData
instance SharedStatement JavaCode (Doc, Terminator)
instance OOStatement JavaCode (Doc, Terminator)
instance OOProg JavaCode Doc (Doc, Terminator) MethodData StateVar Doc ProgData

instance ProgramSym JavaCode Doc (Doc, Terminator) MethodData StateVar Doc ProgData where
  prog :: String
-> String -> [FS (JavaCode File)] -> GSProgram JavaCode ProgData
prog String
n String
st [FS (JavaCode File)]
fs = [State GOOLState (JavaCode File)]
-> (GOOLState -> GOOLState)
-> ([JavaCode File] -> JavaCode ProgData)
-> GSProgram JavaCode ProgData
forall s b a. [State s b] -> (s -> s) -> ([b] -> a) -> State s a
modifyReturnList ((FS (JavaCode File) -> State GOOLState (JavaCode File))
-> [FS (JavaCode File)] -> [State GOOLState (JavaCode File)]
forall a b. (a -> b) -> [a] -> [b]
map (LensLike'
  (Zoomed (StateT FileState Identity) (JavaCode File))
  GOOLState
  FileState
-> FS (JavaCode File) -> State GOOLState (JavaCode File)
forall c.
LensLike'
  (Zoomed (StateT FileState Identity) c) GOOLState FileState
-> StateT FileState Identity c -> StateT GOOLState Identity c
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) (JavaCode File))
  GOOLState
  FileState
(FileState -> Focusing Identity (JavaCode File) FileState)
-> GOOLState -> Focusing Identity (JavaCode File) GOOLState
Lens' GOOLState FileState
lensGStoFS) [FS (JavaCode File)]
fs) (GOOLState -> GOOLState
revFiles (GOOLState -> GOOLState)
-> (GOOLState -> GOOLState) -> GOOLState -> GOOLState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    String -> GOOLState -> GOOLState
addProgNameToPaths String
n) (([File] -> ProgData) -> [JavaCode File] -> JavaCode ProgData
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList (String -> String -> [File] -> ProgData
progD String
n String
st ([File] -> ProgData) -> ([File] -> [File]) -> [File] -> ProgData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (File -> File) -> [File] -> [File]
forall a b. (a -> b) -> [a] -> [b]
map (String -> Doc -> File -> File
R.package String
n
    Doc
endStatement)))

instance CommonRenderSym JavaCode Doc (Doc, Terminator) MethodData
instance OORenderSym JavaCode Doc (Doc, Terminator) MethodData StateVar Doc

instance UnRepr JavaCode contents where
  unRepr :: JavaCode contents -> contents
unRepr = JavaCode contents -> contents
forall a. JavaCode a -> a
unJC

instance FileSym JavaCode Doc (Doc, Terminator) MethodData StateVar Doc where
  fileDoc :: FS (JavaCode Module) -> FS (JavaCode File)
fileDoc FS (JavaCode Module)
m = do
    (FileState -> FileState) -> StateT FileState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (FileType -> FileState -> FileState
setFileType FileType
Combined)
    String
-> (JavaCode Module -> JavaCode Doc)
-> JavaCode Doc
-> FS (JavaCode Module)
-> FS (JavaCode File)
forall (r :: * -> *).
(BlockElim r, RenderMod r, RenderFile r) =>
String
-> (r Module -> r Doc) -> r Doc -> FS (r Module) -> FS (r File)
G.fileDoc String
jExt JavaCode Module -> JavaCode Doc
forall (r :: * -> *). RenderFile r => r Module -> r Doc
top JavaCode Doc
forall (r :: * -> *). RenderFile r => r Doc
bottom FS (JavaCode Module)
m

  docMod :: String
-> String
-> [String]
-> String
-> FS (JavaCode File)
-> FS (JavaCode File)
docMod = String
-> String
-> String
-> [String]
-> String
-> FS (JavaCode File)
-> FS (JavaCode File)
forall (r :: * -> *).
RenderFile r =>
String
-> String
-> String
-> [String]
-> String
-> FS (r File)
-> FS (r File)
CP.doxMod String
jExt

instance RenderFile JavaCode where
  top :: JavaCode Module -> JavaCode Doc
top JavaCode Module
_ = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty
  bottom :: JavaCode Doc
bottom = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty

  commentedMod :: FS (JavaCode File) -> FS (JavaCode Doc) -> FS (JavaCode File)
commentedMod = (JavaCode File -> JavaCode Doc -> JavaCode File)
-> FS (JavaCode File) -> FS (JavaCode Doc) -> FS (JavaCode File)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((File -> Doc -> File)
-> JavaCode File -> JavaCode Doc -> JavaCode File
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues File -> Doc -> File
R.commentedMod)

  fileFromData :: String -> FS (JavaCode Module) -> FS (JavaCode File)
fileFromData = (String -> JavaCode Module -> JavaCode File)
-> String -> FS (JavaCode Module) -> FS (JavaCode File)
forall (r :: * -> *).
ModuleElim r =>
(String -> r Module -> r File)
-> String -> FS (r Module) -> FS (r File)
G.fileFromData ((Module -> File) -> JavaCode Module -> JavaCode File
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Module -> File) -> JavaCode Module -> JavaCode File)
-> (String -> Module -> File)
-> String
-> JavaCode Module
-> JavaCode File
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Module -> File
fileD)

instance ImportSym JavaCode where
  langImport :: String -> JavaCode Doc
langImport = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> (String -> Doc) -> String -> JavaCode Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc
jImport
  modImport :: String -> JavaCode Doc
modImport = String -> JavaCode Doc
forall (r :: * -> *). ImportSym r => String -> r Doc
langImport

instance AttachmentSym JavaCode Doc where
  classLevel :: JavaCode Doc
classLevel = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.classLevel
  instanceLevel :: JavaCode Doc
instanceLevel = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.instanceLevel

instance PermElim JavaCode Doc where
  perm :: JavaCode Doc -> Doc
perm = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC
  binding :: JavaCode Doc -> AttachmentTag
binding = String -> JavaCode Doc -> AttachmentTag
forall a. HasCallStack => String -> a
error (String -> JavaCode Doc -> AttachmentTag)
-> String -> JavaCode Doc -> AttachmentTag
forall a b. (a -> b) -> a -> b
$ String -> String
CP.bindingError String
jName

instance BodySym JavaCode (Doc, Terminator) where
  body :: [MS (JavaCode Doc)] -> MS (JavaCode Doc)
body = ([JavaCode Doc] -> JavaCode Doc)
-> [MS (JavaCode Doc)] -> MS (JavaCode Doc)
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([Doc] -> Doc) -> [JavaCode Doc] -> JavaCode Doc
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [Doc] -> Doc
R.body)

  addComments :: String -> MS (JavaCode Doc) -> MS (JavaCode Doc)
addComments String
s = (JavaCode Doc -> JavaCode Doc)
-> MS (JavaCode Doc) -> MS (JavaCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Doc -> Doc) -> JavaCode Doc -> JavaCode Doc
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (String -> Doc -> Doc -> Doc
R.addComments String
s Doc
commentStart))

instance RenderBody JavaCode where
  multiBody :: [MS (JavaCode Doc)] -> MS (JavaCode Doc)
multiBody = [MS (JavaCode Doc)] -> MS (JavaCode Doc)
forall (r :: * -> *).
(BodyElim r, Monad r) =>
[MS (r Doc)] -> MS (r Doc)
G.multiBody

instance BodyElim JavaCode where
  body :: JavaCode Doc -> Doc
body = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance BlockSym JavaCode (Doc, Terminator) where
  block :: [MS (JavaCode (Doc, Terminator))] -> MS (JavaCode Doc)
block = [MS (JavaCode (Doc, Terminator))] -> MS (JavaCode Doc)
forall (r :: * -> *) smt.
(Monad r, RenderStatement r smt, StatementElim r smt) =>
[MS (r smt)] -> MS (r Doc)
G.block

instance RenderBlock JavaCode where
  multiBlock :: [MS (JavaCode Doc)] -> MS (JavaCode Doc)
multiBlock = [MS (JavaCode Doc)] -> MS (JavaCode Doc)
forall (r :: * -> *).
(BlockElim r, Monad r) =>
[MS (r Doc)] -> MS (r Doc)
G.multiBlock

instance BlockElim JavaCode where
  block :: JavaCode Doc -> Doc
block = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance TypeSym JavaCode where
  bool :: VS (JavaCode TypeData)
bool = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
jBoolType
  int :: VS (JavaCode TypeData)
int = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.int
  float :: VS (JavaCode TypeData)
float = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.float
  double :: VS (JavaCode TypeData)
double = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.double
  char :: VS (JavaCode TypeData)
char = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.char
  string :: VS (JavaCode TypeData)
string = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.string'
  infile :: VS (JavaCode TypeData)
infile = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
jInfileType
  outfile :: VS (JavaCode TypeData)
outfile = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
jOutfileType
  referenceType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
referenceType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall a. a -> a
id -- Ignore reference types in "high-level" langauges for now; later on think about using boxed/unboxed types
  listType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
listType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jListType
  setType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
setType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jSetType
  arrayType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
arrayType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r, Monad r, UnRepr r TypeData) =>
VS (r TypeData) -> VS (r TypeData)
CP.arrayType
  innerType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
innerType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r, OOTypeSym r) =>
VS (r TypeData) -> VS (r TypeData)
CG.innerType
  funcType :: [VS (JavaCode TypeData)]
-> VS (JavaCode TypeData) -> VS (JavaCode TypeData)
funcType = [VS (JavaCode TypeData)]
-> VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r) =>
[VS (r TypeData)] -> VS (r TypeData) -> VS (r TypeData)
CS.funcType -- TODO [Brandon Bosman, 05/11/2026]: fix this to work with lambda types
  void :: VS (JavaCode TypeData)
void = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.void

instance TypeElim JavaCode where
  getCodeType :: JavaCode TypeData -> CodeType
getCodeType = TypeData -> CodeType
cType (TypeData -> CodeType)
-> (JavaCode TypeData -> TypeData) -> JavaCode TypeData -> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode TypeData -> TypeData
forall a. JavaCode a -> a
unJC

instance OOTypeSym JavaCode where
  obj :: String -> VS (JavaCode TypeData)
obj = String -> VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => String -> VS (r TypeData)
G.obj

instance RenderType JavaCode where
  multiType :: [VS (JavaCode TypeData)] -> VS (JavaCode TypeData)
multiType [VS (JavaCode TypeData)]
_ = String -> VS (JavaCode TypeData)
forall a. HasCallStack => String -> a
error (String -> VS (JavaCode TypeData))
-> String -> VS (JavaCode TypeData)
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiTypeError String
jName

instance UnaryOpSym JavaCode where
  notOp :: VSUnOp JavaCode
notOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
C.notOp
  negateOp :: VSUnOp JavaCode
negateOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.negateOp
  sqrtOp :: VSUnOp JavaCode
sqrtOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.sqrt
  absOp :: VSUnOp JavaCode
absOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.abs
  logOp :: VSUnOp JavaCode
logOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.log10
  lnOp :: VSUnOp JavaCode
lnOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.log
  expOp :: VSUnOp JavaCode
expOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.exp
  sinOp :: VSUnOp JavaCode
sinOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.sin
  cosOp :: VSUnOp JavaCode
cosOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.cos
  tanOp :: VSUnOp JavaCode
tanOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.tan
  asinOp :: VSUnOp JavaCode
asinOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.asin
  acosOp :: VSUnOp JavaCode
acosOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.acos
  atanOp :: VSUnOp JavaCode
atanOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.atan
  floorOp :: VSUnOp JavaCode
floorOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.floor
  ceilOp :: VSUnOp JavaCode
ceilOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.ceil

instance BinaryOpSym JavaCode where
  equalOp :: VSUnOp JavaCode
equalOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.equalOp
  notEqualOp :: VSUnOp JavaCode
notEqualOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.notEqualOp
  greaterOp :: VSUnOp JavaCode
greaterOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.greaterOp
  greaterEqualOp :: VSUnOp JavaCode
greaterEqualOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.greaterEqualOp
  lessOp :: VSUnOp JavaCode
lessOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.lessOp
  lessEqualOp :: VSUnOp JavaCode
lessEqualOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.lessEqualOp
  plusOp :: VSUnOp JavaCode
plusOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.plusOp
  minusOp :: VSUnOp JavaCode
minusOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.minusOp
  multOp :: VSUnOp JavaCode
multOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.multOp
  divideOp :: VSUnOp JavaCode
divideOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.divideOp
  powerOp :: VSUnOp JavaCode
powerOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
powerPrec (String -> VSUnOp JavaCode) -> String -> VSUnOp JavaCode
forall a b. (a -> b) -> a -> b
$ String -> String
mathFunc String
R.pow
  moduloOp :: VSUnOp JavaCode
moduloOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.moduloOp
  andOp :: VSUnOp JavaCode
andOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
C.andOp
  orOp :: VSUnOp JavaCode
orOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
C.orOp

instance OpElim JavaCode where
  uOp :: JavaCode OpData -> Doc
uOp = OpData -> Doc
opDoc (OpData -> Doc)
-> (JavaCode OpData -> OpData) -> JavaCode OpData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode OpData -> OpData
forall a. JavaCode a -> a
unJC
  bOp :: JavaCode OpData -> Doc
bOp = OpData -> Doc
opDoc (OpData -> Doc)
-> (JavaCode OpData -> OpData) -> JavaCode OpData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode OpData -> OpData
forall a. JavaCode a -> a
unJC
  uOpPrec :: JavaCode OpData -> Int
uOpPrec = OpData -> Int
opPrec (OpData -> Int)
-> (JavaCode OpData -> OpData) -> JavaCode OpData -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode OpData -> OpData
forall a. JavaCode a -> a
unJC
  bOpPrec :: JavaCode OpData -> Int
bOpPrec = OpData -> Int
opPrec (OpData -> Int)
-> (JavaCode OpData -> OpData) -> JavaCode OpData -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode OpData -> OpData
forall a. JavaCode a -> a
unJC

instance ScopeSym JavaCode where
  global :: JavaCode ScopeData
global = JavaCode ScopeData
forall (r :: * -> *). Monad r => r ScopeData
CP.global
  mainFn :: JavaCode ScopeData
mainFn = JavaCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local
  local :: JavaCode ScopeData
local = JavaCode ScopeData
forall (r :: * -> *). Monad r => r ScopeData
G.local

instance ScopeElim JavaCode where
  scopeData :: JavaCode ScopeData -> ScopeData
scopeData = JavaCode ScopeData -> ScopeData
forall a. JavaCode a -> a
unJC

instance VariableSym JavaCode where
  var :: String -> VS (JavaCode TypeData) -> SVariable JavaCode
var         = String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
RenderVariable r =>
String -> VS (r TypeData) -> SVariable r
G.var
  constant :: String -> VS (JavaCode TypeData) -> SVariable JavaCode
constant    = String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
VariableSym r =>
String -> VS (r TypeData) -> SVariable r
var
  extVar :: String -> String -> VS (JavaCode TypeData) -> SVariable JavaCode
extVar      = String -> String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
RenderVariable r =>
String -> String -> VS (r TypeData) -> SVariable r
CS.extVar

instance OOVariableSym JavaCode where
  classVar :: String -> VS (JavaCode TypeData) -> SVariable JavaCode
classVar = String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
RenderVariable r =>
String -> VS (r TypeData) -> SVariable r
G.classVar
  classConst :: String -> VS (JavaCode TypeData) -> SVariable JavaCode
classConst = String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
OOVariableSym r =>
String -> VS (r TypeData) -> SVariable r
classVar
  classVarAccess :: VS (JavaCode TypeData) -> SVariable JavaCode -> SVariable JavaCode
classVarAccess = (Doc -> Doc -> Doc)
-> VS (JavaCode TypeData)
-> SVariable JavaCode
-> SVariable JavaCode
forall (r :: * -> *).
(InternalVarElim r, RenderVariable r, UnRepr r TypeData,
 VariableElim r) =>
(Doc -> Doc -> Doc)
-> VS (r TypeData) -> SVariable r -> SVariable r
CP.classVarAccess Doc -> Doc -> Doc
R.classVarAccess
  extClassVarAccess :: VS (JavaCode TypeData) -> SVariable JavaCode -> SVariable JavaCode
extClassVarAccess = VS (JavaCode TypeData) -> SVariable JavaCode -> SVariable JavaCode
forall (r :: * -> *).
OOVariableSym r =>
VS (r TypeData) -> SVariable r -> SVariable r
classVarAccess
  instanceVarAccess :: SValue JavaCode -> SVariable JavaCode -> SVariable JavaCode
instanceVarAccess = SValue JavaCode -> SVariable JavaCode -> SVariable JavaCode
forall (r :: * -> *).
(InternalVarElim r, RenderVariable r, ValueElim r,
 VariableElim r) =>
SValue r -> SVariable r -> SVariable r
G.instanceVarAccess

instance SelfSym JavaCode where
  self :: SVariable JavaCode
self = SVariable JavaCode
forall (r :: * -> *).
(OOTypeSym r, RenderVariable r) =>
SVariable r
C.self

instance VariableElim JavaCode where
  variableName :: JavaCode Variable -> String
variableName = Variable -> String
varName (Variable -> String)
-> (JavaCode Variable -> Variable) -> JavaCode Variable -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Variable -> Variable
forall a. JavaCode a -> a
unJC
  variableType :: JavaCode Variable -> JavaCode TypeData
variableType = (Variable -> TypeData) -> JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Variable -> TypeData
varType

instance InternalVarElim JavaCode where
  variableBind :: JavaCode Variable -> AttachmentTag
variableBind = Variable -> AttachmentTag
varBind (Variable -> AttachmentTag)
-> (JavaCode Variable -> Variable)
-> JavaCode Variable
-> AttachmentTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Variable -> Variable
forall a. JavaCode a -> a
unJC
  variable :: JavaCode Variable -> Doc
variable = Variable -> Doc
varDoc (Variable -> Doc)
-> (JavaCode Variable -> Variable) -> JavaCode Variable -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Variable -> Variable
forall a. JavaCode a -> a
unJC

instance RenderVariable JavaCode where
  varFromData :: AttachmentTag
-> String -> VS (JavaCode TypeData) -> Doc -> SVariable JavaCode
varFromData AttachmentTag
b String
n VS (JavaCode TypeData)
t' Doc
d =  do
    JavaCode TypeData
t <- VS (JavaCode TypeData)
t'
    JavaCode Variable -> SVariable JavaCode
forall a s. a -> State s a
toState (JavaCode Variable -> SVariable JavaCode)
-> JavaCode Variable -> SVariable JavaCode
forall a b. (a -> b) -> a -> b
$ (TypeData -> Doc -> Variable)
-> JavaCode TypeData -> JavaCode Doc -> JavaCode Variable
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues (AttachmentTag -> String -> TypeData -> Doc -> Variable
vard AttachmentTag
b String
n) JavaCode TypeData
t (Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

instance ValueSym JavaCode where
  valueType :: JavaCode Value -> JavaCode TypeData
valueType = (Value -> TypeData) -> JavaCode Value -> JavaCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Value -> TypeData
valType

instance OOValueSym JavaCode

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

instance Literal JavaCode where
  litTrue :: SValue JavaCode
litTrue = SValue JavaCode
forall (r :: * -> *). (RenderValue r, TypeSym r) => SValue r
C.litTrue
  litFalse :: SValue JavaCode
litFalse = SValue JavaCode
forall (r :: * -> *). (RenderValue r, TypeSym r) => SValue r
C.litFalse
  litChar :: Char -> SValue JavaCode
litChar = (Doc -> Doc) -> Char -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
(Doc -> Doc) -> Char -> SValue r
G.litChar Doc -> Doc
quotes
  litDouble :: Double -> SValue JavaCode
litDouble = Double -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
Double -> SValue r
G.litDouble
  litFloat :: Float -> SValue JavaCode
litFloat = Float -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
Float -> SValue r
C.litFloat
  litInt :: Integer -> SValue JavaCode
litInt = Integer -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
Integer -> SValue r
G.litInt
  litString :: String -> SValue JavaCode
litString = String -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
String -> SValue r
G.litString
  litArray :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
litArray = VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jLitArray
  litSet :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
litSet = (Doc -> Doc)
-> (Doc -> Doc)
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r, ValueElim r) =>
(Doc -> Doc)
-> (Doc -> Doc) -> VS (r TypeData) -> [SValue r] -> SValue r
CP.litSet (String -> Doc
text String
jSetOf <>) Doc -> Doc
parens

  litList :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
litList VS (JavaCode TypeData)
t [SValue JavaCode]
es = do
    LensLike'
  (Zoomed (StateT MethodState Identity) ()) ValueState MethodState
-> StateT MethodState Identity () -> StateT ValueState Identity ()
forall c.
LensLike'
  (Zoomed (StateT MethodState Identity) c) ValueState MethodState
-> StateT MethodState Identity c -> StateT ValueState Identity c
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) ()) ValueState MethodState
Lens' ValueState MethodState
lensVStoMS (StateT MethodState Identity () -> StateT ValueState Identity ())
-> StateT MethodState Identity () -> StateT ValueState Identity ()
forall a b. (a -> b) -> a -> b
$ (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (if [SValue JavaCode] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SValue JavaCode]
es then MethodState -> MethodState
forall a. a -> a
id else String -> MethodState -> MethodState
addLangImport (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport
      String
jArrays)
    VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj (VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
listType VS (JavaCode TypeData)
t) [VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jAsListFunc VS (JavaCode TypeData)
t [SValue JavaCode]
es | Bool -> Bool
not ([SValue JavaCode] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SValue JavaCode]
es)]

instance MathConstant JavaCode where
  pi :: SValue JavaCode
pi = SValue JavaCode
forall (r :: * -> *). (RenderValue r, TypeSym r) => SValue r
CP.pi

instance VariableValue JavaCode where
  valueOf :: SVariable JavaCode -> SValue JavaCode
valueOf = SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *).
(InternalVarElim r, RenderValue r, VariableElim r) =>
SVariable r -> SValue r
G.valueOf

instance OOVariableValue JavaCode

instance CommandLineArgs JavaCode where
  arg :: Integer -> SValue JavaCode
arg Integer
n = SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r, ValueElim r) =>
SValue r -> SValue r -> SValue r
G.arg (Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
n) SValue JavaCode
forall (r :: * -> *). CommandLineArgs r => SValue r
argsList
  argsList :: SValue JavaCode
argsList = String -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
String -> SValue r
G.argsList String
args
  argExists :: Integer -> SValue JavaCode
argExists Integer
i = SValue JavaCode -> SValue JavaCode
forall (r :: * -> *) smt. List r smt => SValue r -> SValue r
listSize SValue JavaCode
forall (r :: * -> *). CommandLineArgs r => SValue r
argsList SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
Comparison r =>
SValue r -> SValue r -> SValue r
?> Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt (Integer -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
i)

instance NumericExpression JavaCode where
  #~ :: SValue JavaCode -> SValue JavaCode
(#~) = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr' VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
negateOp
  #/^ :: SValue JavaCode -> SValue JavaCode
(#/^) = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
sqrtOp
  #| :: SValue JavaCode -> SValue JavaCode
(#|) = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
absOp
  #+ :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(#+) = VSUnOp JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
plusOp
  #- :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(#-) = VSUnOp JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
minusOp
  #* :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(#*) = VSUnOp JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
multOp
  #/ :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(#/) = VSUnOp JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
divideOp
  #% :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(#%) = VSUnOp JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
moduloOp
  #^ :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(#^) = VSUnOp JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExprNumDbl' VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
powerOp

  log :: SValue JavaCode -> SValue JavaCode
log = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
logOp
  ln :: SValue JavaCode -> SValue JavaCode
ln = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
lnOp
  exp :: SValue JavaCode -> SValue JavaCode
exp = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
expOp
  sin :: SValue JavaCode -> SValue JavaCode
sin = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
sinOp
  cos :: SValue JavaCode -> SValue JavaCode
cos = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
cosOp
  tan :: SValue JavaCode -> SValue JavaCode
tan = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
tanOp
  csc :: SValue JavaCode -> SValue JavaCode
csc = SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(Literal r, NumericExpression r, TypeElim r) =>
SValue r -> SValue r
G.csc
  sec :: SValue JavaCode -> SValue JavaCode
sec = SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(Literal r, NumericExpression r, TypeElim r) =>
SValue r -> SValue r
G.sec
  cot :: SValue JavaCode -> SValue JavaCode
cot = SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(Literal r, NumericExpression r, TypeElim r) =>
SValue r -> SValue r
G.cot
  arcsin :: SValue JavaCode -> SValue JavaCode
arcsin = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
asinOp
  arccos :: SValue JavaCode -> SValue JavaCode
arccos = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
acosOp
  arctan :: SValue JavaCode -> SValue JavaCode
arctan = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
atanOp
  floor :: SValue JavaCode -> SValue JavaCode
floor = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
floorOp
  ceil :: SValue JavaCode -> SValue JavaCode
ceil = VSUnOp JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
ceilOp

instance BooleanExpression JavaCode where
  ?! :: SValue JavaCode -> SValue JavaCode
(?!) = VSUnOp JavaCode
-> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSUnOp r -> VS (r TypeData) -> SValue r -> SValue r
typeUnExpr VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
notOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?&& :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?&&) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
andOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?|| :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?||) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
orOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool

instance Comparison JavaCode where
  ?< :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?<) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?<= :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?<=) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessEqualOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?> :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?>) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?>= :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?>=) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterEqualOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?== :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?==) = SValue JavaCode -> SValue JavaCode -> SValue JavaCode
jEquality
  ?!= :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
(?!=) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
notEqualOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool

instance ValueExpression JavaCode where
  inlineIf :: SValue JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
inlineIf = SValue JavaCode
-> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, ValueElim r, ValueSym r) =>
SValue r -> SValue r -> SValue r -> SValue r
C.inlineIf

  -- Exceptions from function/method calls should already be in the exception
  -- map from the CodeInfo pass, but it's possible that one of the higher-level
  -- functions implicitly calls these functions in the Java renderer, so we
  -- also check here to add the exceptions from the called function to the map
  funcAppMixedArgs :: MixedCall JavaCode
funcAppMixedArgs String
n VS (JavaCode TypeData)
t [SValue JavaCode]
vs NamedArgs JavaCode
ns = do
    String -> StateT ValueState Identity ()
addCallExcsCurrMod String
n
    MixedCall JavaCode
forall (r :: * -> *). RenderValue r => MixedCall r
G.funcAppMixedArgs String
n VS (JavaCode TypeData)
t [SValue JavaCode]
vs NamedArgs JavaCode
ns
  extFuncAppMixedArgs :: String -> MixedCall JavaCode
extFuncAppMixedArgs String
l String
n VS (JavaCode TypeData)
t [SValue JavaCode]
vs NamedArgs JavaCode
ns = do
    Map QualifiedName [ExceptionType]
mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
    (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ValueState -> ValueState)
-> ([ExceptionType] -> ValueState -> ValueState)
-> Maybe [ExceptionType]
-> ValueState
-> ValueState
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ValueState -> ValueState
forall a. a -> a
id [ExceptionType] -> ValueState -> ValueState
addExceptions (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
l String
n) Map QualifiedName [ExceptionType]
mem))
    String -> MixedCall JavaCode
forall (r :: * -> *). RenderValue r => String -> MixedCall r
CS.extFuncAppMixedArgs String
l String
n VS (JavaCode TypeData)
t [SValue JavaCode]
vs NamedArgs JavaCode
ns
  libFuncAppMixedArgs :: String -> MixedCall JavaCode
libFuncAppMixedArgs = String -> MixedCall JavaCode
forall (r :: * -> *). ValueExpression r => String -> MixedCall r
C.libFuncAppMixedArgs

  lambda :: [VSBinder JavaCode] -> SValue JavaCode -> SValue JavaCode
lambda = ([JavaCode BinderD] -> JavaCode Value -> Doc)
-> [VSBinder JavaCode] -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(BinderElim r, RenderValue r, ValueSym r) =>
([r BinderD] -> r Value -> Doc)
-> [VSBinder r] -> SValue r -> SValue r
G.lambda [JavaCode BinderD] -> JavaCode Value -> Doc
forall (r :: * -> *). [r BinderD] -> r Value -> Doc
jLambda

  notNull :: SValue JavaCode -> SValue JavaCode
notNull = String -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(Comparison r, VariableValue r) =>
String -> SValue r -> SValue r
CP.notNull String
nullLabel

instance OOValueExpression JavaCode where
  newObjMixedArgs :: MixedCtorCall JavaCode
newObjMixedArgs VS (JavaCode TypeData)
ot [SValue JavaCode]
vs NamedArgs JavaCode
ns = VS (JavaCode TypeData)
-> (VS (JavaCode TypeData) -> SValue JavaCode) -> SValue JavaCode
forall (r :: * -> *).
UnRepr r TypeData =>
VS (r TypeData) -> (VS (r TypeData) -> SValue r) -> SValue r
addConstructorCallExcsCurrMod VS (JavaCode TypeData)
ot (\VS (JavaCode TypeData)
t ->
    MixedCall JavaCode
forall (r :: * -> *).
(RenderValue r, UnRepr r TypeData) =>
String -> MixedCtorCall r
G.newObjMixedArgs (String
new String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" ") VS (JavaCode TypeData)
t [SValue JavaCode]
vs NamedArgs JavaCode
ns)
  extNewObjMixedArgs :: MixedCall JavaCode
extNewObjMixedArgs String
l VS (JavaCode TypeData)
ot [SValue JavaCode]
vs NamedArgs JavaCode
ns = do
    JavaCode TypeData
t <- VS (JavaCode TypeData)
ot
    Map QualifiedName [ExceptionType]
mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
    let tp :: String
tp = JavaCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString JavaCode TypeData
t
    (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ValueState -> ValueState)
-> ([ExceptionType] -> ValueState -> ValueState)
-> Maybe [ExceptionType]
-> ValueState
-> ValueState
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ValueState -> ValueState
forall a. a -> a
id [ExceptionType] -> ValueState -> ValueState
addExceptions (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
l String
tp) Map QualifiedName [ExceptionType]
mem))
    MixedCtorCall JavaCode
forall (r :: * -> *). OOValueExpression r => MixedCtorCall r
newObjMixedArgs (JavaCode TypeData -> VS (JavaCode TypeData)
forall a s. a -> State s a
toState JavaCode TypeData
t) [SValue JavaCode]
vs NamedArgs JavaCode
ns
  libNewObjMixedArgs :: MixedCall JavaCode
libNewObjMixedArgs = MixedCall JavaCode
forall (r :: * -> *).
OOValueExpression r =>
String -> MixedCtorCall r
C.libNewObjMixedArgs

instance RenderValue JavaCode where
  inputFunc :: SValue JavaCode
inputFunc = (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jScanner) StateT ValueState Identity () -> SValue JavaCode -> SValue JavaCode
forall a b.
StateT ValueState Identity a
-> StateT ValueState Identity b -> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> VS (JavaCode TypeData) -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal
    (String -> VS (JavaCode TypeData)
forall (r :: * -> *). OOTypeSym r => String -> VS (r TypeData)
obj String
jScanner) (Doc -> Doc
parens (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Doc
new' Doc -> Doc -> Doc
<+> Doc
jScanner' Doc -> Doc -> Doc
<> Doc -> Doc
parens (String -> Doc
jSystem String
jStdIn))
  printFunc :: SValue JavaCode
printFunc = VS (JavaCode TypeData) -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void (String -> Doc
jSystem (String
jStdOut String -> String -> String
`access` String
printLabel))
  printLnFunc :: SValue JavaCode
printLnFunc = VS (JavaCode TypeData) -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void (String -> Doc
jSystem (String
jStdOut String -> String -> String
`access` String
jPrintLn))
  printFileFunc :: SValue JavaCode -> SValue JavaCode
printFileFunc = (JavaCode TypeData -> JavaCode Value -> SValue JavaCode)
-> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
on2StateWrapped (\JavaCode TypeData
v -> JavaCode TypeData -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
r TypeData -> Doc -> SValue r
mkVal JavaCode TypeData
v (Doc -> SValue JavaCode)
-> (JavaCode Value -> Doc) -> JavaCode Value -> SValue JavaCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Doc
R.printFile String
printLabel (Doc -> Doc) -> (JavaCode Value -> Doc) -> JavaCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value) VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void
  printFileLnFunc :: SValue JavaCode -> SValue JavaCode
printFileLnFunc = (JavaCode TypeData -> JavaCode Value -> SValue JavaCode)
-> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
on2StateWrapped (\JavaCode TypeData
v -> JavaCode TypeData -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
r TypeData -> Doc -> SValue r
mkVal JavaCode TypeData
v (Doc -> SValue JavaCode)
-> (JavaCode Value -> Doc) -> JavaCode Value -> SValue JavaCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Doc
R.printFile String
jPrintLn (Doc -> Doc) -> (JavaCode Value -> Doc) -> JavaCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value) VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void

  cast :: VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
cast = VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
jCast

  call :: Maybe String -> Maybe Doc -> MixedCall JavaCode
call = String -> Maybe String -> Maybe Doc -> MixedCall JavaCode
forall (r :: * -> *).
(InternalVarElim r, RenderValue r, ValueElim r) =>
String -> Maybe String -> Maybe Doc -> MixedCall r
CP.call' String
jName

  valFromData :: Maybe Int
-> Maybe Integer
-> VS (JavaCode TypeData)
-> Doc
-> SValue JavaCode
valFromData Maybe Int
p Maybe Integer
i VS (JavaCode TypeData)
t' Doc
d = do
    JavaCode TypeData
t <- VS (JavaCode TypeData)
t'
    JavaCode Value -> SValue JavaCode
forall a s. a -> State s a
toState (JavaCode Value -> SValue JavaCode)
-> JavaCode Value -> SValue JavaCode
forall a b. (a -> b) -> a -> b
$ (TypeData -> Doc -> Value)
-> JavaCode TypeData -> JavaCode Doc -> JavaCode Value
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues (Maybe Int -> Maybe Integer -> TypeData -> Doc -> Value
vd Maybe Int
p Maybe Integer
i) JavaCode TypeData
t (Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

instance ValueElim JavaCode where
  valuePrec :: JavaCode Value -> Maybe Int
valuePrec = Value -> Maybe Int
valPrec (Value -> Maybe Int)
-> (JavaCode Value -> Value) -> JavaCode Value -> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Value -> Value
forall a. JavaCode a -> a
unJC
  valueInt :: JavaCode Value -> Maybe Integer
valueInt = Value -> Maybe Integer
valInt (Value -> Maybe Integer)
-> (JavaCode Value -> Value) -> JavaCode Value -> Maybe Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Value -> Value
forall a. JavaCode a -> a
unJC
  value :: JavaCode Value -> Doc
value = Value -> Doc
val (Value -> Doc)
-> (JavaCode Value -> Value) -> JavaCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Value -> Value
forall a. JavaCode a -> a
unJC

instance InternalValueExp JavaCode where
  objMethodCallMixedArgs' :: String
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> [SValue JavaCode]
-> NamedArgs JavaCode
-> SValue JavaCode
objMethodCallMixedArgs' String
f VS (JavaCode TypeData)
t SValue JavaCode
o [SValue JavaCode]
ps NamedArgs JavaCode
ns = do
    JavaCode Value
ob <- SValue JavaCode
o
    Map QualifiedName [ExceptionType]
mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
    let tp :: String
tp = JavaCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString (JavaCode Value -> JavaCode TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType JavaCode Value
ob)
    (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ValueState -> ValueState)
-> ([ExceptionType] -> ValueState -> ValueState)
-> Maybe [ExceptionType]
-> ValueState
-> ValueState
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ValueState -> ValueState
forall a. a -> a
id [ExceptionType] -> ValueState -> ValueState
addExceptions (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
tp String
f) Map QualifiedName [ExceptionType]
mem))
    String
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> [SValue JavaCode]
-> NamedArgs JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(RenderValue r, ValueElim r) =>
String
-> VS (r TypeData)
-> SValue r
-> [SValue r]
-> NamedArgs r
-> SValue r
G.objMethodCall String
f VS (JavaCode TypeData)
t SValue JavaCode
o [SValue JavaCode]
ps NamedArgs JavaCode
ns
  classMethodCallMixedArgs' :: String -> VS (JavaCode TypeData) -> MixedCtorCall JavaCode
classMethodCallMixedArgs' String
f VS (JavaCode TypeData)
t VS (JavaCode TypeData)
c [SValue JavaCode]
ps NamedArgs JavaCode
ns = do
    JavaCode TypeData
cls <- VS (JavaCode TypeData)
c
    Map QualifiedName [ExceptionType]
mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
    let tp :: String
tp = JavaCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString JavaCode TypeData
cls
    (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ValueState -> ValueState)
-> ([ExceptionType] -> ValueState -> ValueState)
-> Maybe [ExceptionType]
-> ValueState
-> ValueState
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ValueState -> ValueState
forall a. a -> a
id [ExceptionType] -> ValueState -> ValueState
addExceptions (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
tp String
f) Map QualifiedName [ExceptionType]
mem))
    String -> VS (JavaCode TypeData) -> MixedCtorCall JavaCode
forall (r :: * -> *).
(RenderValue r, UnRepr r TypeData) =>
String
-> VS (r TypeData)
-> VS (r TypeData)
-> [SValue r]
-> NamedArgs r
-> SValue r
CG.classMethodCall String
f VS (JavaCode TypeData)
t VS (JavaCode TypeData)
c [SValue JavaCode]
ps NamedArgs JavaCode
ns

instance FunctionSym JavaCode where

instance OOFunctionSym JavaCode where
  func :: String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
func = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
(RenderFunction r, ValueElim r, ValueExpression r) =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
G.func
  objAccess :: SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
objAccess = SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
(FunctionElim r, RenderValue r, ValueElim r) =>
SValue r -> VS (r FuncData) -> SValue r
G.objAccess

instance GetSet JavaCode where
  get :: SValue JavaCode -> SVariable JavaCode -> SValue JavaCode
get = SValue JavaCode -> SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *).
(InternalGetSet r, OOFunctionSym r) =>
SValue r -> SVariable r -> SValue r
G.get
  set :: SValue JavaCode
-> SVariable JavaCode -> SValue JavaCode -> SValue JavaCode
set = SValue JavaCode
-> SVariable JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(InternalGetSet r, OOFunctionSym r) =>
SValue r -> SVariable r -> SValue r -> SValue r
G.set

instance IndexTranslator JavaCode where
  intToIndex :: SValue JavaCode -> SValue JavaCode
intToIndex = SValue JavaCode -> SValue JavaCode
forall (r :: * -> *). SValue r -> SValue r
CP.intToIndex
  indexToInt :: SValue JavaCode -> SValue JavaCode
indexToInt = SValue JavaCode -> SValue JavaCode
forall (r :: * -> *). SValue r -> SValue r
CP.indexToInt

instance Reference JavaCode where
  makeRef :: SValue JavaCode -> SValue JavaCode
makeRef = SValue JavaCode -> SValue JavaCode
forall a. a -> a
id
  maybeDeref :: SValue JavaCode -> SValue JavaCode
maybeDeref = SValue JavaCode -> SValue JavaCode
forall a. a -> a
id

instance Array JavaCode where
  arrayElem :: SValue JavaCode -> SValue JavaCode -> SVariable JavaCode
arrayElem = SValue JavaCode -> SValue JavaCode -> SVariable JavaCode
forall (r :: * -> *).
(IndexTranslator r, RenderVariable r, ValueElim r) =>
SValue r -> SValue r -> SVariable r
G.arrayElem
  arrayLength :: SValue JavaCode -> SValue JavaCode
arrayLength SValue JavaCode
arr = SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf (SVariable JavaCode -> SValue JavaCode)
-> SVariable JavaCode -> SValue JavaCode
forall a b. (a -> b) -> a -> b
$ SValue JavaCode -> SVariable JavaCode -> SVariable JavaCode
forall (r :: * -> *).
OOVariableSym r =>
SValue r -> SVariable r -> SVariable r
instanceVarAccess SValue JavaCode
arr (String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
VariableSym r =>
String -> VS (r TypeData) -> SVariable r
var String
"length" VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
int)
  arrayCopy :: SValue JavaCode -> SValue JavaCode
arrayCopy SValue JavaCode
arr = let
    arrTp :: VS (JavaCode TypeData)
arrTp = (JavaCode Value -> JavaCode TypeData)
-> SValue JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Value -> JavaCode TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType SValue JavaCode
arr
    in VS (JavaCode TypeData)
-> SValue JavaCode
-> String
-> [SValue JavaCode]
-> SValue JavaCode
forall (r :: * -> *).
InternalValueExp r =>
VS (r TypeData) -> SValue r -> String -> [SValue r] -> SValue r
objMethodCall VS (JavaCode TypeData)
arrTp SValue JavaCode
arr String
"clone" []

instance List JavaCode (Doc, Terminator) where
  listSize :: SValue JavaCode -> SValue JavaCode
listSize = String -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r
C.listSize String
"size"
  listAdd :: SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
listAdd = String
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(IndexTranslator r, InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> SValue r -> SValue r -> MS (r smt)
CG.listAdd String
jListAdd
  listAppend :: SValue JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
listAppend = String
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> SValue r -> MS (r smt)
CG.listAppend String
jListAdd
  listAccess :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
listAccess = SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(IndexTranslator r, InternalListFunc r, FunctionElim r,
 RenderFunction r, RenderValue r, TypeElim r, ValueElim r) =>
SValue r -> SValue r -> SValue r
G.listAccess
  listSet :: SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
listSet SValue JavaCode
list SValue JavaCode
idx SValue JavaCode
vl = SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
SValue r -> MS (r smt)
valStmt (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ VS (JavaCode TypeData)
-> SValue JavaCode
-> String
-> [SValue JavaCode]
-> SValue JavaCode
forall (r :: * -> *).
InternalValueExp r =>
VS (r TypeData) -> SValue r -> String -> [SValue r] -> SValue r
objMethodCall VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void SValue JavaCode
list String
jListSet [SValue JavaCode
idx, SValue JavaCode
vl]
  indexOf :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
indexOf = String -> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
(IndexTranslator r, OOFunctionSym r) =>
String -> SValue r -> SValue r -> SValue r
CP.indexOf String
jIndex

instance Set JavaCode where
  contains :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
contains = String -> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
String -> SValue r -> SValue r -> SValue r
CP.contains String
jContains
  setAdd :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
setAdd = String -> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r -> SValue r
CP.setMethodCall String
jListAdd
  setRemove :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
setRemove = String -> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r -> SValue r
CP.setMethodCall String
jListRemove
  setUnion :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
setUnion = String -> SValue JavaCode -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r -> SValue r
CP.setMethodCall String
jListUnion

instance InternalList JavaCode where
  listSlice' :: Maybe (SValue JavaCode)
-> Maybe (SValue JavaCode)
-> Maybe (SValue JavaCode)
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode Doc)
listSlice' = Maybe (SValue JavaCode)
-> Maybe (SValue JavaCode)
-> Maybe (SValue JavaCode)
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode Doc)
forall (r :: * -> *) smt.
(SharedStatement r smt, ValueElim r, VariableElim r) =>
Maybe (SValue r)
-> Maybe (SValue r)
-> Maybe (SValue r)
-> SVariable r
-> SValue r
-> MS (r Doc)
M.listSlice

instance InternalGetSet JavaCode where
  getFunc :: SVariable JavaCode -> VS (JavaCode FuncData)
getFunc = SVariable JavaCode -> VS (JavaCode FuncData)
forall (r :: * -> *).
(OOFunctionSym r, VariableElim r) =>
SVariable r -> VS (r FuncData)
G.getFunc
  setFunc :: VS (JavaCode TypeData)
-> SVariable JavaCode -> SValue JavaCode -> VS (JavaCode FuncData)
setFunc = VS (JavaCode TypeData)
-> SVariable JavaCode -> SValue JavaCode -> VS (JavaCode FuncData)
forall (r :: * -> *).
(OOFunctionSym r, VariableElim r) =>
VS (r TypeData) -> SVariable r -> SValue r -> VS (r FuncData)
G.setFunc

instance InternalListFunc JavaCode where
  listAccessFunc :: VS (JavaCode TypeData) -> SValue JavaCode -> VS (JavaCode FuncData)
listAccessFunc = String
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> VS (JavaCode FuncData)
forall (r :: * -> *).
(OOFunctionSym r, TypeElim r) =>
String -> VS (r TypeData) -> SValue r -> VS (r FuncData)
CP.listAccessFunc' String
jListAccess

instance BinderSym JavaCode where
  binder :: String -> VS (JavaCode TypeData) -> VSBinder JavaCode
binder String
nm VS (JavaCode TypeData)
tp = (TypeData -> BinderD) -> JavaCode TypeData -> JavaCode BinderD
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (String -> TypeData -> BinderD
bindFormD String
nm) (JavaCode TypeData -> JavaCode BinderD)
-> VS (JavaCode TypeData) -> VSBinder JavaCode
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
<$> VS (JavaCode TypeData)
tp

instance BinderElim JavaCode where
  binderName :: JavaCode BinderD -> String
binderName = BinderD -> String
bindName (BinderD -> String)
-> (JavaCode BinderD -> BinderD) -> JavaCode BinderD -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode BinderD -> BinderD
forall a. JavaCode a -> a
unJC
  binderType :: JavaCode BinderD -> JavaCode TypeData
binderType = (BinderD -> TypeData) -> JavaCode BinderD -> JavaCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue BinderD -> TypeData
bindType

instance InternalBinderElim JavaCode where
  binderElim :: JavaCode BinderD -> Doc
binderElim = String -> Doc
text (String -> Doc)
-> (JavaCode BinderD -> String) -> JavaCode BinderD -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BinderD -> String
bindName (BinderD -> String)
-> (JavaCode BinderD -> BinderD) -> JavaCode BinderD -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode BinderD -> BinderD
forall a. JavaCode a -> a
unJC

instance RenderFunction JavaCode where
  funcFromData :: Doc -> VS (JavaCode TypeData) -> VS (JavaCode FuncData)
funcFromData Doc
d = (JavaCode TypeData -> JavaCode FuncData)
-> VS (JavaCode TypeData) -> VS (JavaCode FuncData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((TypeData -> FuncData) -> JavaCode TypeData -> JavaCode FuncData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (TypeData -> Doc -> FuncData
`fd` Doc
d))

instance FunctionElim JavaCode where
  functionType :: JavaCode FuncData -> JavaCode TypeData
functionType = (FuncData -> TypeData) -> JavaCode FuncData -> JavaCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue FuncData -> TypeData
fType
  function :: JavaCode FuncData -> Doc
function = FuncData -> Doc
funcDoc (FuncData -> Doc)
-> (JavaCode FuncData -> FuncData) -> JavaCode FuncData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode FuncData -> FuncData
forall a. JavaCode a -> a
unJC

instance InternalAssignStmt JavaCode (Doc, Terminator) where
  multiAssign :: [SVariable JavaCode]
-> [SValue JavaCode] -> MS (JavaCode (Doc, Terminator))
multiAssign [SVariable JavaCode]
_ [SValue JavaCode]
_ = String -> MS (JavaCode (Doc, Terminator))
forall a. HasCallStack => String -> a
error (String -> MS (JavaCode (Doc, Terminator)))
-> String -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiAssignError String
jName

instance InternalIOStmt JavaCode (Doc, Terminator) where
  printSt :: Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
printSt Bool
_ Maybe (SValue JavaCode)
_ = SValue JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, ValueElim r) =>
SValue r -> SValue r -> MS (r smt)
CP.printSt

instance InternalControlStmt JavaCode (Doc, Terminator) where
  multiReturn :: [SValue JavaCode] -> MS (JavaCode (Doc, Terminator))
multiReturn [SValue JavaCode]
_ = String -> MS (JavaCode (Doc, Terminator))
forall a. HasCallStack => String -> a
error (String -> MS (JavaCode (Doc, Terminator)))
-> String -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiReturnError String
jName

instance RenderStatement JavaCode (Doc, Terminator) where
  stmt :: MS (JavaCode (Doc, Terminator)) -> MS (JavaCode (Doc, Terminator))
stmt = MS (JavaCode (Doc, Terminator)) -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, StatementElim r smt) =>
MS (r smt) -> MS (r smt)
G.stmt
  loopStmt :: MS (JavaCode (Doc, Terminator)) -> MS (JavaCode (Doc, Terminator))
loopStmt = MS (JavaCode (Doc, Terminator)) -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, StatementElim r smt) =>
MS (r smt) -> MS (r smt)
G.loopStmt
  stmtFromData :: Doc -> Terminator -> MS (JavaCode (Doc, Terminator))
stmtFromData Doc
d Terminator
t = JavaCode (Doc, Terminator) -> MS (JavaCode (Doc, Terminator))
forall a s. a -> State s a
toState (JavaCode (Doc, Terminator) -> MS (JavaCode (Doc, Terminator)))
-> JavaCode (Doc, Terminator) -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ (Doc, Terminator) -> JavaCode (Doc, Terminator)
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc
d, Terminator
t)

instance StatementElim JavaCode (Doc, Terminator) where
  statement :: JavaCode (Doc, Terminator) -> Doc
statement = (Doc, Terminator) -> Doc
forall a b. (a, b) -> a
fst ((Doc, Terminator) -> Doc)
-> (JavaCode (Doc, Terminator) -> (Doc, Terminator))
-> JavaCode (Doc, Terminator)
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode (Doc, Terminator) -> (Doc, Terminator)
forall a. JavaCode a -> a
unJC
  statementTerm :: JavaCode (Doc, Terminator) -> Terminator
statementTerm = (Doc, Terminator) -> Terminator
forall a b. (a, b) -> b
snd ((Doc, Terminator) -> Terminator)
-> (JavaCode (Doc, Terminator) -> (Doc, Terminator))
-> JavaCode (Doc, Terminator)
-> Terminator
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode (Doc, Terminator) -> (Doc, Terminator)
forall a. JavaCode a -> a
unJC

instance StatementSym JavaCode (Doc, Terminator) where
  -- Terminator determines how statements end
  valStmt :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
valStmt = Terminator -> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, ValueElim r) =>
Terminator -> SValue r -> MS (r smt)
G.valStmt Terminator
Semi
  emptyStmt :: MS (JavaCode (Doc, Terminator))
emptyStmt = MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt. RenderStatement r smt => MS (r smt)
G.emptyStmt
  multi :: [MS (JavaCode (Doc, Terminator))]
-> MS (JavaCode (Doc, Terminator))
multi = ([JavaCode (Doc, Terminator)] -> JavaCode (Doc, Terminator))
-> [MS (JavaCode (Doc, Terminator))]
-> MS (JavaCode (Doc, Terminator))
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([(Doc, Terminator)] -> (Doc, Terminator))
-> [JavaCode (Doc, Terminator)] -> JavaCode (Doc, Terminator)
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [(Doc, Terminator)] -> (Doc, Terminator)
R.multiStmt)

instance AssignStatement JavaCode (Doc, Terminator) where
  assign :: SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
assign = Terminator
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ValueElim r) =>
Terminator -> SVariable r -> SValue r -> MS (r smt)
G.assign Terminator
Semi
  &-= :: SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
(&-=) = Terminator
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ValueElim r) =>
Terminator -> SVariable r -> SValue r -> MS (r smt)
G.subAssign Terminator
Semi
  &+= :: SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
(&+=) = SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ValueElim r) =>
SVariable r -> SValue r -> MS (r smt)
C.increment
  &++ :: SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
(&++) = SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt) =>
SVariable r -> MS (r smt)
C.increment1
  &-- :: SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
(&--) = SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt) =>
SVariable r -> MS (r smt)
C.decrement1

instance DeclStatement JavaCode (Doc, Terminator) where
  varDec :: SVariable JavaCode
-> JavaCode ScopeData -> MS (JavaCode (Doc, Terminator))
varDec = JavaCode Doc
-> JavaCode Doc
-> Doc
-> SVariable JavaCode
-> JavaCode ScopeData
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) att smt.
(InternalVarElim r, PermElim r att, RenderStatement r smt,
 ScopeElim r, UnRepr r TypeData, TypeElim r, VariableElim r) =>
r att -> r att -> Doc -> SVariable r -> r ScopeData -> MS (r smt)
C.varDec JavaCode Doc
forall (r :: * -> *) att. AttachmentSym r att => r att
classLevel JavaCode Doc
forall (r :: * -> *) att. AttachmentSym r att => r att
instanceLevel Doc
empty
  varDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
varDecDef = Terminator
-> SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
Terminator -> SVariable r -> r ScopeData -> SValue r -> MS (r smt)
C.varDecDef Terminator
Semi
  setDec :: SVariable JavaCode
-> JavaCode ScopeData -> MS (JavaCode (Doc, Terminator))
setDec = SVariable JavaCode
-> JavaCode ScopeData -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> MS (r smt)
varDec
  setDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
setDecDef = SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> SValue r -> MS (r smt)
varDecDef
  listDec :: Integer
-> SVariable JavaCode
-> JavaCode ScopeData
-> MS (JavaCode (Doc, Terminator))
listDec Integer
n SVariable JavaCode
v JavaCode ScopeData
scp = LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> SVariable JavaCode
-> StateT MethodState Identity (JavaCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable JavaCode
v StateT MethodState Identity (JavaCode Variable)
-> (JavaCode Variable -> MS (JavaCode (Doc, Terminator)))
-> MS (JavaCode (Doc, Terminator))
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\JavaCode Variable
v' -> (JavaCode Value -> Doc)
-> SValue JavaCode
-> SVariable JavaCode
-> JavaCode ScopeData
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, RenderStatement r smt,
 StatementElim r smt) =>
(r Value -> Doc)
-> SValue r -> SVariable r -> r ScopeData -> MS (r smt)
C.listDec (JavaCode Variable -> JavaCode Value -> Doc
forall (r :: * -> *).
(UnRepr r TypeData, ValueElim r, VariableElim r) =>
r Variable -> r Value -> Doc
renderListDec JavaCode Variable
v')
    (Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
n) SVariable JavaCode
v JavaCode ScopeData
scp)
  listDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
listDecDef = SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, Literal r, VariableElim r) =>
SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
CP.listDecDef
  arrayDec :: Integer
-> SValue JavaCode
-> SVariable JavaCode
-> JavaCode ScopeData
-> MS (JavaCode (Doc, Terminator))
arrayDec Integer
n SValue JavaCode
_ = SValue JavaCode
-> SVariable JavaCode
-> JavaCode ScopeData
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(ScopeElim r, UnRepr r TypeData, InternalVarElim r,
 RenderStatement r smt, ValueElim r, VariableElim r) =>
SValue r -> SVariable r -> r ScopeData -> MS (r smt)
CP.arrayDec (Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
n)
  arrayDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
arrayDecDef = SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
CP.arrayDecDef
  constDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
constDecDef = SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
jConstDecDef
  funcDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> [SVariable JavaCode]
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
funcDecDef = SVariable JavaCode
-> JavaCode ScopeData
-> [SVariable JavaCode]
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
jFuncDecDef

instance OODeclStatement JavaCode (Doc, Terminator) where
  objDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
objDecDef = SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> SValue r -> MS (r smt)
varDecDef
  objDecNew :: SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
objDecNew = SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, OOValueExpression r, VariableElim r) =>
SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
G.objDecNew
  extObjDecNew :: String
-> SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
extObjDecNew = String
-> SVariable JavaCode
-> JavaCode ScopeData
-> [SValue JavaCode]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, OOValueExpression r, VariableElim r) =>
String -> SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
C.extObjDecNew

instance IOStatement JavaCode (Doc, Terminator) where
  print :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
print      = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
False Maybe (SValue JavaCode)
forall a. Maybe a
Nothing SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc
  printLn :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
printLn    = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
True  Maybe (SValue JavaCode)
forall a. Maybe a
Nothing SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc
  printStr :: String -> MS (JavaCode (Doc, Terminator))
printStr   = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
False Maybe (SValue JavaCode)
forall a. Maybe a
Nothing SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc   (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> (String -> SValue JavaCode)
-> String
-> MS (JavaCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue JavaCode
forall (r :: * -> *). Literal r => String -> SValue r
litString
  printStrLn :: String -> MS (JavaCode (Doc, Terminator))
printStrLn = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
True  Maybe (SValue JavaCode)
forall a. Maybe a
Nothing SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> (String -> SValue JavaCode)
-> String
-> MS (JavaCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue JavaCode
forall (r :: * -> *). Literal r => String -> SValue r
litString

  printFile :: SValue JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
printFile SValue JavaCode
f      = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
False (SValue JavaCode -> Maybe (SValue JavaCode)
forall a. a -> Maybe a
Just SValue JavaCode
f) (SValue JavaCode -> SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileFunc SValue JavaCode
f)
  printFileLn :: SValue JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
printFileLn SValue JavaCode
f    = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
True  (SValue JavaCode -> Maybe (SValue JavaCode)
forall a. a -> Maybe a
Just SValue JavaCode
f) (SValue JavaCode -> SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileLnFunc SValue JavaCode
f)
  printFileStr :: SValue JavaCode -> String -> MS (JavaCode (Doc, Terminator))
printFileStr SValue JavaCode
f   = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
False (SValue JavaCode -> Maybe (SValue JavaCode)
forall a. a -> Maybe a
Just SValue JavaCode
f) (SValue JavaCode -> SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileFunc SValue JavaCode
f)   (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> (String -> SValue JavaCode)
-> String
-> MS (JavaCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue JavaCode
forall (r :: * -> *). Literal r => String -> SValue r
litString
  printFileStrLn :: SValue JavaCode -> String -> MS (JavaCode (Doc, Terminator))
printFileStrLn SValue JavaCode
f = Bool
-> Maybe (SValue JavaCode)
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
True  (SValue JavaCode -> Maybe (SValue JavaCode)
forall a. a -> Maybe a
Just SValue JavaCode
f) (SValue JavaCode -> SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileLnFunc SValue JavaCode
f) (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> (String -> SValue JavaCode)
-> String
-> MS (JavaCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue JavaCode
forall (r :: * -> *). Literal r => String -> SValue r
litString

  getInput :: SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
getInput SVariable JavaCode
v = SVariable JavaCode
v SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= SVariable JavaCode -> SValue JavaCode -> SValue JavaCode
jInput SVariable JavaCode
v SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r
inputFunc
  discardInput :: MS (JavaCode (Doc, Terminator))
discardInput = SValue JavaCode -> MS (JavaCode (Doc, Terminator))
jDiscardInput SValue JavaCode
forall (r :: * -> *). RenderValue r => SValue r
inputFunc
  getFileInput :: SValue JavaCode
-> SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
getFileInput SValue JavaCode
f SVariable JavaCode
v = SVariable JavaCode
v SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= SVariable JavaCode -> SValue JavaCode -> SValue JavaCode
jInput SVariable JavaCode
v SValue JavaCode
f
  discardFileInput :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
discardFileInput = SValue JavaCode -> MS (JavaCode (Doc, Terminator))
jDiscardInput

  openFileR :: SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
openFileR = (SValue JavaCode -> VS (JavaCode TypeData) -> SValue JavaCode)
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
(SValue r -> VS (r TypeData) -> SValue r)
-> SVariable r -> SValue r -> MS (r smt)
CP.openFileR SValue JavaCode -> VS (JavaCode TypeData) -> SValue JavaCode
forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r
jOpenFileR
  openFileW :: SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
openFileW = (SValue JavaCode
 -> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode)
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, Literal r) =>
(SValue r -> VS (r TypeData) -> SValue r -> SValue r)
-> SVariable r -> SValue r -> MS (r smt)
CP.openFileW SValue JavaCode
-> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r -> SValue r
jOpenFileWorA
  openFileA :: SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
openFileA = (SValue JavaCode
 -> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode)
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, Literal r) =>
(SValue r -> VS (r TypeData) -> SValue r -> SValue r)
-> SVariable r -> SValue r -> MS (r smt)
CP.openFileA SValue JavaCode
-> VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r -> SValue r
jOpenFileWorA
  closeFile :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
closeFile = String -> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> MS (r smt)
G.closeFile String
jClose

  getFileInputLine :: SValue JavaCode
-> SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
getFileInputLine SValue JavaCode
f SVariable JavaCode
v = SVariable JavaCode
v SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= SValue JavaCode
f SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextLineFunc
  discardFileLine :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
discardFileLine = String -> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> MS (r smt)
CP.discardFileLine String
jNextLine
  getFileInputAll :: SValue JavaCode
-> SVariable JavaCode -> MS (JavaCode (Doc, Terminator))
getFileInputAll SValue JavaCode
f SVariable JavaCode
v = SValue JavaCode
-> MS (JavaCode Doc) -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r Doc) -> MS (r smt)
while (SValue JavaCode
f SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jHasNextLineFunc)
    (MS (JavaCode (Doc, Terminator)) -> MS (JavaCode Doc)
forall (r :: * -> *) smt. BodySym r smt => MS (r smt) -> MS (r Doc)
oneLiner (MS (JavaCode (Doc, Terminator)) -> MS (JavaCode Doc))
-> MS (JavaCode (Doc, Terminator)) -> MS (JavaCode Doc)
forall a b. (a -> b) -> a -> b
$ SValue JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
List r smt =>
SValue r -> SValue r -> MS (r smt)
listAppend (SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
v) (SValue JavaCode
f SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextLineFunc))

instance StringStatement JavaCode (Doc, Terminator) where
  stringSplit :: Char
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
stringSplit Char
d SVariable JavaCode
vnew SValue JavaCode
s = do
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> MethodState -> MethodState
addLangImport (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jArrays)
    Doc
ss <- LensLike'
  (Zoomed (StateT ValueState Identity) Doc) MethodState ValueState
-> StateT ValueState Identity Doc
-> StateT MethodState Identity Doc
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) Doc) MethodState ValueState
(ValueState -> Focusing Identity Doc ValueState)
-> MethodState -> Focusing Identity Doc MethodState
Lens' MethodState ValueState
lensMStoVS (StateT ValueState Identity Doc -> StateT MethodState Identity Doc)
-> StateT ValueState Identity Doc
-> StateT MethodState Identity Doc
forall a b. (a -> b) -> a -> b
$
      SVariable JavaCode
-> SValue JavaCode -> StateT ValueState Identity Doc
jStringSplit SVariable JavaCode
vnew (VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jAsListFunc VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string [SValue JavaCode
s SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. Char -> VS (JavaCode FuncData)
forall (r :: * -> *).
(Literal r, OOFunctionSym r) =>
Char -> VS (r FuncData)
jSplitFunc Char
d])
    Doc -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt Doc
ss

  stringListVals :: [SVariable JavaCode]
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
stringListVals = [SVariable JavaCode]
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, List r smt, Literal r, RenderValue r,
 TypeElim r, VariableElim r) =>
[SVariable r] -> SValue r -> MS (r smt)
M.stringListVals
  stringListLists :: [SVariable JavaCode]
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
stringListLists = [SVariable JavaCode]
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderValue r, SharedStatement r smt, TypeElim r,
 VariableElim r) =>
[SVariable r] -> SValue r -> MS (r smt)
M.stringListLists

instance FuncAppStatement JavaCode (Doc, Terminator) where
  inOutCall :: InOutCall JavaCode (Doc, Terminator)
inOutCall = (String
 -> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode)
-> InOutCall JavaCode (Doc, Terminator)
jInOutCall String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp
  extInOutCall :: String -> InOutCall JavaCode (Doc, Terminator)
extInOutCall String
m = (String
 -> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode)
-> InOutCall JavaCode (Doc, Terminator)
jInOutCall (String
-> String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> SValue JavaCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
m)

instance OOFuncAppStatement JavaCode (Doc, Terminator) where
  selfInOutCall :: InOutCall JavaCode (Doc, Terminator)
selfInOutCall = (String
 -> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode)
-> InOutCall JavaCode (Doc, Terminator)
jInOutCall String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *).
(InternalValueExp r, VariableValue r, SelfSym r) =>
PosCall r
selfMethodCall

instance CommentStatement JavaCode (Doc, Terminator) where
  comment :: String -> MS (JavaCode (Doc, Terminator))
comment = Doc -> String -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> String -> MS (r smt)
G.comment Doc
commentStart

instance ControlStatement JavaCode (Doc, Terminator) where
  break :: MS (JavaCode (Doc, Terminator))
break = Doc -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt Doc
R.break
  continue :: MS (JavaCode (Doc, Terminator))
continue = Doc -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt Doc
R.continue

  returnStmt :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
returnStmt = Terminator -> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, ValueElim r) =>
Terminator -> SValue r -> MS (r smt)
G.returnStmt Terminator
Semi

  throw :: String -> MS (JavaCode (Doc, Terminator))
throw = (JavaCode Value -> Doc)
-> Terminator -> String -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(Literal r, RenderStatement r smt) =>
(r Value -> Doc) -> Terminator -> String -> MS (r smt)
G.throw JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
jThrowDoc Terminator
Semi

  ifCond :: [(SValue JavaCode, MS (JavaCode Doc))]
-> MS (JavaCode Doc) -> MS (JavaCode (Doc, Terminator))
ifCond = (Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(SValue JavaCode, MS (JavaCode Doc))]
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, ValueElim r) =>
(Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(SValue r, MS (r Doc))]
-> MS (r Doc)
-> MS (r smt)
G.ifCond Doc -> Doc
parens Doc
bodyStart OptionalSpace
G.defaultOptSpace Doc
elseIfLabel Doc
bodyEnd Doc
empty
  switch :: SValue JavaCode
-> [(SValue JavaCode, MS (JavaCode Doc))]
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
switch  = (Doc -> Doc)
-> MS (JavaCode (Doc, Terminator))
-> SValue JavaCode
-> [(SValue JavaCode, MS (JavaCode Doc))]
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
(Doc -> Doc)
-> MS (r smt)
-> SValue r
-> [(SValue r, MS (r Doc))]
-> MS (r Doc)
-> MS (r smt)
C.switch Doc -> Doc
parens MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt. ControlStatement r smt => MS (r smt)
break

  ifExists :: SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
ifExists = SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(ControlStatement r smt, ValueExpression r) =>
SValue r -> MS (r Doc) -> MS (r Doc) -> MS (r smt)
M.ifExists

  for :: MS (JavaCode (Doc, Terminator))
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
for = Doc
-> Doc
-> MS (JavaCode (Doc, Terminator))
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
Doc
-> Doc
-> MS (r smt)
-> SValue r
-> MS (r smt)
-> MS (r Doc)
-> MS (r smt)
C.for Doc
bodyStart Doc
bodyEnd
  forRange :: SVariable JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forRange = SVariable JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
SharedStatement r smt =>
SVariable r
-> SValue r -> SValue r -> SValue r -> MS (r Doc) -> MS (r smt)
M.forRange
  forEach :: SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forEach = Doc
-> Doc
-> Doc
-> Doc
-> SVariable JavaCode
-> SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, InternalVarElim r, RenderStatement r smt,
 UnRepr r TypeData, ValueElim r, VariableElim r) =>
Doc
-> Doc
-> Doc
-> Doc
-> SVariable r
-> SValue r
-> MS (r Doc)
-> MS (r smt)
CP.forEach Doc
bodyStart Doc
bodyEnd Doc
forLabel Doc
colon
  while :: SValue JavaCode
-> MS (JavaCode Doc) -> MS (JavaCode (Doc, Terminator))
while = (Doc -> Doc)
-> Doc
-> Doc
-> SValue JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, ValueElim r) =>
(Doc -> Doc) -> Doc -> Doc -> SValue r -> MS (r Doc) -> MS (r smt)
C.while Doc -> Doc
parens Doc
bodyStart Doc
bodyEnd

  tryCatch :: MS (JavaCode Doc)
-> MS (JavaCode Doc) -> MS (JavaCode (Doc, Terminator))
tryCatch = (JavaCode Doc -> JavaCode Doc -> Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
(r Doc -> r Doc -> Doc) -> MS (r Doc) -> MS (r Doc) -> MS (r smt)
G.tryCatch JavaCode Doc -> JavaCode Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> r Doc -> Doc
jTryCatch

  assert :: SValue JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
assert SValue JavaCode
condition SValue JavaCode
errorMessage = do
    JavaCode Value
cond <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Value))
  MethodState
  ValueState
-> SValue JavaCode -> StateT MethodState Identity (JavaCode Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Value) ValueState)
-> MethodState -> Focusing Identity (JavaCode Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue JavaCode
condition
    JavaCode Value
errMsg <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Value))
  MethodState
  ValueState
-> SValue JavaCode -> StateT MethodState Identity (JavaCode Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Value) ValueState)
-> MethodState -> Focusing Identity (JavaCode Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue JavaCode
errorMessage
    Doc -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt (JavaCode Value -> JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> r Value -> Doc
jAssert JavaCode Value
cond JavaCode Value
errMsg)

instance ObserverPattern JavaCode (Doc, Terminator) where
  notifyObservers :: VS (JavaCode FuncData)
-> VS (JavaCode TypeData) -> MS (JavaCode (Doc, Terminator))
notifyObservers = VS (JavaCode FuncData)
-> VS (JavaCode TypeData) -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
OOStatement r smt =>
VS (r FuncData) -> VS (r TypeData) -> MS (r smt)
M.notifyObservers

instance StrategyPattern JavaCode (Doc, Terminator) where
  runStrategy :: String
-> [(String, MS (JavaCode Doc))]
-> Maybe (SValue JavaCode)
-> Maybe (SVariable JavaCode)
-> MS (JavaCode Doc)
runStrategy = String
-> [(String, MS (JavaCode Doc))]
-> Maybe (SValue JavaCode)
-> Maybe (SVariable JavaCode)
-> MS (JavaCode Doc)
forall (r :: * -> *) smt.
(AssignStatement r smt, BodyElim r, Monad r, RenderStatement r smt,
 StatementElim r smt) =>
String
-> [(String, MS (r Doc))]
-> Maybe (SValue r)
-> Maybe (SVariable r)
-> MS (r Doc)
M.runStrategy

instance VisibilitySym JavaCode Doc where
  private :: JavaCode Doc
private = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.private
  public :: JavaCode Doc
public = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.public

instance RenderVisibility JavaCode Doc where
  visibilityFromData :: VisibilityTag -> Doc -> JavaCode Doc
visibilityFromData VisibilityTag
_ = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode

instance VisibilityElim JavaCode Doc where
  visibility :: JavaCode Doc -> Doc
visibility = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance MethodTypeSym JavaCode where
  mType :: VS (JavaCode TypeData) -> MSMthdType JavaCode
mType = LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode TypeData))
  MethodState
  ValueState
-> VS (JavaCode TypeData) -> MSMthdType JavaCode
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode TypeData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode TypeData) ValueState)
-> MethodState -> Focusing Identity (JavaCode TypeData) MethodState
Lens' MethodState ValueState
lensMStoVS

instance OOMethodTypeSym JavaCode where
  construct :: String -> MSMthdType JavaCode
construct = String -> MSMthdType JavaCode
forall (r :: * -> *). Monad r => String -> MS (r TypeData)
G.construct

instance ParameterSym JavaCode where
  param :: SVariable JavaCode -> MS (JavaCode ParamData)
param = (JavaCode Variable -> Doc)
-> SVariable JavaCode -> MS (JavaCode ParamData)
forall (r :: * -> *).
(RenderParam r, VariableElim r) =>
(r Variable -> Doc) -> SVariable r -> MS (r ParamData)
G.param JavaCode Variable -> Doc
forall (r :: * -> *).
(InternalVarElim r, UnRepr r TypeData, VariableElim r) =>
r Variable -> Doc
renderParam
  pointerParam :: SVariable JavaCode -> MS (JavaCode ParamData)
pointerParam = SVariable JavaCode -> MS (JavaCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param

instance RenderParam JavaCode where
  paramFromData :: SVariable JavaCode -> Doc -> MS (JavaCode ParamData)
paramFromData SVariable JavaCode
v' Doc
d = do
    JavaCode Variable
v <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> SVariable JavaCode
-> StateT MethodState Identity (JavaCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable JavaCode
v'
    JavaCode ParamData -> MS (JavaCode ParamData)
forall a s. a -> State s a
toState (JavaCode ParamData -> MS (JavaCode ParamData))
-> JavaCode ParamData -> MS (JavaCode ParamData)
forall a b. (a -> b) -> a -> b
$ (Variable -> Doc -> ParamData)
-> JavaCode Variable -> JavaCode Doc -> JavaCode ParamData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues Variable -> Doc -> ParamData
pd JavaCode Variable
v (Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

instance ParamElim JavaCode where
  parameterName :: JavaCode ParamData -> String
parameterName = JavaCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName (JavaCode Variable -> String)
-> (JavaCode ParamData -> JavaCode Variable)
-> JavaCode ParamData
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> Variable) -> JavaCode ParamData -> JavaCode Variable
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ParamData -> Variable
paramVar
  parameterType :: JavaCode ParamData -> JavaCode TypeData
parameterType = JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType (JavaCode Variable -> JavaCode TypeData)
-> (JavaCode ParamData -> JavaCode Variable)
-> JavaCode ParamData
-> JavaCode TypeData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> Variable) -> JavaCode ParamData -> JavaCode Variable
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ParamData -> Variable
paramVar
  parameter :: JavaCode ParamData -> Doc
parameter = ParamData -> Doc
paramDoc (ParamData -> Doc)
-> (JavaCode ParamData -> ParamData) -> JavaCode ParamData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode ParamData -> ParamData
forall a. JavaCode a -> a
unJC

instance MethodSym JavaCode Doc (Doc, Terminator) MethodData where
  docMain :: MS (JavaCode Doc) -> MS (JavaCode MethodData)
docMain = MS (JavaCode Doc) -> MS (JavaCode MethodData)
forall (r :: * -> *) vis smt md svr att.
OORenderSym r vis smt md svr att =>
MS (r Doc) -> MS (r md)
CP.docMain
  function :: String
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
function = String
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) att vis md.
(AttachmentSym r att, OORenderMethod r vis md att) =>
String
-> r vis
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
G.function
  mainFunction :: MS (JavaCode Doc) -> MS (JavaCode MethodData)
mainFunction = VS (JavaCode TypeData)
-> String -> MS (JavaCode Doc) -> MS (JavaCode MethodData)
forall (r :: * -> *) att vis md.
(AttachmentSym r att, OORenderMethod r vis md att, ParameterSym r,
 UnRepr r TypeData, Monad r, VisibilitySym r vis) =>
VS (r TypeData) -> String -> MS (r Doc) -> MS (r md)
CP.mainFunction VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string String
mainFunc
  docFunc :: String
-> [String]
-> Maybe String
-> MS (JavaCode MethodData)
-> MS (JavaCode MethodData)
docFunc = String
-> [String]
-> Maybe String
-> MS (JavaCode MethodData)
-> MS (JavaCode MethodData)
forall (r :: * -> *) md.
RenderMethod r md =>
String -> [String] -> Maybe String -> MS (r md) -> MS (r md)
CP.doxFunc

  inOutFunc :: String -> JavaCode Doc -> InOutFunc JavaCode MethodData
inOutFunc String
n JavaCode Doc
s = (VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode MethodData))
-> InOutFunc JavaCode MethodData
forall md.
(VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode md))
-> [SVariable JavaCode]
-> [SVariable JavaCode]
-> [SVariable JavaCode]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
jInOut (String
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) vis smt md.
MethodSym r vis smt md =>
String
-> r vis
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
function String
n JavaCode Doc
s)
  docInOutFunc :: String -> JavaCode Doc -> DocInOutFunc JavaCode MethodData
docInOutFunc String
n JavaCode Doc
s = InOutFunc JavaCode MethodData -> DocInOutFunc JavaCode MethodData
forall (r :: * -> *) md.
RenderMethod r md =>
([SVariable r]
 -> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md))
-> String
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> MS (r Doc)
-> MS (r md)
jDocInOut (String -> JavaCode Doc -> InOutFunc JavaCode MethodData
forall (r :: * -> *) vis smt md.
MethodSym r vis smt md =>
String -> r vis -> InOutFunc r md
inOutFunc String
n JavaCode Doc
s)

instance OOMethodSym JavaCode Doc (Doc, Terminator) MethodData Doc where
  method :: String
-> JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
method = String
-> JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) vis md att.
OORenderMethod r vis md att =>
String
-> r vis
-> r att
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
G.method
  getMethod :: SVariable JavaCode -> MS (JavaCode MethodData)
getMethod = SVariable JavaCode -> MS (JavaCode MethodData)
forall (r :: * -> *) vis smt md svr att.
OORenderSym r vis smt md svr att =>
SVariable r -> MS (r md)
G.getMethod
  setMethod :: SVariable JavaCode -> MS (JavaCode MethodData)
setMethod = SVariable JavaCode -> MS (JavaCode MethodData)
forall (r :: * -> *) vis smt md svr att.
OORenderSym r vis smt md svr att =>
SVariable r -> MS (r md)
G.setMethod
  constructor :: [MS (JavaCode ParamData)]
-> NamedArgs JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
constructor [MS (JavaCode ParamData)]
ps NamedArgs JavaCode
is MS (JavaCode Doc)
b = MS String
getClassName MS String
-> (String -> MS (JavaCode MethodData)) -> MS (JavaCode MethodData)
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\String
n -> String
-> [MS (JavaCode ParamData)]
-> NamedArgs JavaCode
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) vis smt md svr att.
(OORenderSym r vis smt md svr att, OOStatement r smt) =>
String
-> [MS (r ParamData)] -> Initializers r -> MS (r Doc) -> MS (r md)
CP.constructor String
n [MS (JavaCode ParamData)]
ps NamedArgs JavaCode
is MS (JavaCode Doc)
b)

  inOutMethod :: String
-> JavaCode Doc -> JavaCode Doc -> InOutFunc JavaCode MethodData
inOutMethod String
n JavaCode Doc
s JavaCode Doc
p = (VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode MethodData))
-> InOutFunc JavaCode MethodData
forall md.
(VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode md))
-> [SVariable JavaCode]
-> [SVariable JavaCode]
-> [SVariable JavaCode]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
jInOut (String
-> JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) vis smt md att.
OOMethodSym r vis smt md att =>
String
-> r vis
-> r att
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
method String
n JavaCode Doc
s JavaCode Doc
p)
  docInOutMethod :: String
-> JavaCode Doc -> JavaCode Doc -> DocInOutFunc JavaCode MethodData
docInOutMethod String
n JavaCode Doc
s JavaCode Doc
p = InOutFunc JavaCode MethodData -> DocInOutFunc JavaCode MethodData
forall (r :: * -> *) md.
RenderMethod r md =>
([SVariable r]
 -> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md))
-> String
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> MS (r Doc)
-> MS (r md)
jDocInOut (String
-> JavaCode Doc -> JavaCode Doc -> InOutFunc JavaCode MethodData
forall (r :: * -> *) vis smt md att.
OOMethodSym r vis smt md att =>
String -> r vis -> r att -> InOutFunc r md
inOutMethod String
n JavaCode Doc
s JavaCode Doc
p)

instance RenderMethod JavaCode MethodData where
  commentedFunc :: MS (JavaCode Doc)
-> MS (JavaCode MethodData) -> MS (JavaCode MethodData)
commentedFunc MS (JavaCode Doc)
cmt MS (JavaCode MethodData)
m = (JavaCode MethodData
 -> JavaCode (Doc -> Doc) -> JavaCode MethodData)
-> MS (JavaCode MethodData)
-> State MethodState (JavaCode (Doc -> Doc))
-> MS (JavaCode MethodData)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((MethodData -> (Doc -> Doc) -> MethodData)
-> JavaCode MethodData
-> JavaCode (Doc -> Doc)
-> JavaCode MethodData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues MethodData -> (Doc -> Doc) -> MethodData
updateMthd) MS (JavaCode MethodData)
m
    ((JavaCode Doc -> JavaCode (Doc -> Doc))
-> MS (JavaCode Doc) -> State MethodState (JavaCode (Doc -> Doc))
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Doc -> Doc -> Doc) -> JavaCode Doc -> JavaCode (Doc -> Doc)
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Doc -> Doc -> Doc
R.commentedItem) MS (JavaCode Doc)
cmt)

  mthdFromData :: VisibilityTag -> Doc -> MS (JavaCode MethodData)
mthdFromData VisibilityTag
_ Doc
d = JavaCode MethodData -> MS (JavaCode MethodData)
forall a s. a -> State s a
toState (JavaCode MethodData -> MS (JavaCode MethodData))
-> JavaCode MethodData -> MS (JavaCode MethodData)
forall a b. (a -> b) -> a -> b
$ MethodData -> JavaCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> JavaCode MethodData)
-> MethodData -> JavaCode MethodData
forall a b. (a -> b) -> a -> b
$ Doc -> MethodData
mthd Doc
d

instance OORenderMethod JavaCode Doc MethodData Doc where
  intMethod :: Bool
-> String
-> JavaCode Doc
-> JavaCode Doc
-> MSMthdType JavaCode
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
intMethod Bool
m String
n JavaCode Doc
s JavaCode Doc
p MSMthdType JavaCode
t [MS (JavaCode ParamData)]
ps MS (JavaCode Doc)
b = do
    JavaCode TypeData
tp <- MSMthdType JavaCode
t
    [JavaCode ParamData]
pms <- [MS (JavaCode ParamData)]
-> StateT MethodState Identity [JavaCode ParamData]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [MS (JavaCode ParamData)]
ps
    JavaCode Doc
bd <- MS (JavaCode Doc)
b
    Map QualifiedName [ExceptionType]
mem <- LensLike'
  (Zoomed
     (StateT ValueState Identity) (Map QualifiedName [ExceptionType]))
  MethodState
  ValueState
-> VS (Map QualifiedName [ExceptionType])
-> StateT MethodState Identity (Map QualifiedName [ExceptionType])
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (Map QualifiedName [ExceptionType]))
  MethodState
  ValueState
(ValueState
 -> Focusing
      Identity (Map QualifiedName [ExceptionType]) ValueState)
-> MethodState
-> Focusing
     Identity (Map QualifiedName [ExceptionType]) MethodState
Lens' MethodState ValueState
lensMStoVS VS (Map QualifiedName [ExceptionType])
getMethodExcMap
    [ExceptionType]
es <- MS [ExceptionType]
getExceptions
    String
mn <- LensLike'
  (Zoomed (StateT FileState Identity) String) MethodState FileState
-> StateT FileState Identity String -> MS String
forall c.
LensLike'
  (Zoomed (StateT FileState Identity) c) MethodState FileState
-> StateT FileState Identity c -> StateT MethodState Identity c
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) String) MethodState FileState
(FileState -> Focusing Identity String FileState)
-> MethodState -> Focusing Identity String MethodState
Lens' MethodState FileState
lensMStoFS StateT FileState Identity String
getModuleName
    let excs :: [Exception]
excs = (ExceptionType -> Exception) -> [ExceptionType] -> [Exception]
forall a b. (a -> b) -> [a] -> [b]
map (JavaCode Exception -> Exception
forall a. JavaCode a -> a
unJC (JavaCode Exception -> Exception)
-> (ExceptionType -> JavaCode Exception)
-> ExceptionType
-> Exception
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionType -> JavaCode Exception
forall (r :: * -> *).
HasException r =>
ExceptionType -> r Exception
toConcreteExc) ([ExceptionType] -> [Exception]) -> [ExceptionType] -> [Exception]
forall a b. (a -> b) -> a -> b
$ [ExceptionType]
-> ([ExceptionType] -> [ExceptionType])
-> Maybe [ExceptionType]
-> [ExceptionType]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [ExceptionType]
es ([ExceptionType] -> [ExceptionType]
forall a. Eq a => [a] -> [a]
nub ([ExceptionType] -> [ExceptionType])
-> ([ExceptionType] -> [ExceptionType])
-> [ExceptionType]
-> [ExceptionType]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([ExceptionType] -> [ExceptionType] -> [ExceptionType]
forall a. [a] -> [a] -> [a]
++ [ExceptionType]
es))
          (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
mn String
n) Map QualifiedName [ExceptionType]
mem)
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((if Bool
m then MethodState -> MethodState
setCurrMain else MethodState -> MethodState
forall a. a -> a
id) (MethodState -> MethodState)
-> (MethodState -> MethodState) -> MethodState -> MethodState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Exception] -> MethodState -> MethodState
addExceptionImports [Exception]
excs)
    JavaCode MethodData -> MS (JavaCode MethodData)
forall a. a -> StateT MethodState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (JavaCode MethodData -> MS (JavaCode MethodData))
-> JavaCode MethodData -> MS (JavaCode MethodData)
forall a b. (a -> b) -> a -> b
$ MethodData -> JavaCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> JavaCode MethodData)
-> MethodData -> JavaCode MethodData
forall a b. (a -> b) -> a -> b
$ Doc -> MethodData
mthd (Doc -> MethodData) -> Doc -> MethodData
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> JavaCode Doc
-> JavaCode Doc
-> JavaCode TypeData
-> [JavaCode ParamData]
-> JavaCode Doc
-> Doc
jMethod String
n ((Exception -> String) -> [Exception] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Exception -> String
exc [Exception]
excs) JavaCode Doc
s JavaCode Doc
p JavaCode TypeData
tp [JavaCode ParamData]
pms JavaCode Doc
bd
  intFunc :: Bool
-> String
-> JavaCode Doc
-> JavaCode Doc
-> MSMthdType JavaCode
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
intFunc = Bool
-> String
-> JavaCode Doc
-> JavaCode Doc
-> MSMthdType JavaCode
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) vis md att.
OORenderMethod r vis md att =>
Bool
-> String
-> r vis
-> r att
-> MSMthdType r
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
C.intFunc
  destructor :: forall svr. [CSStateVar JavaCode svr] -> MS (JavaCode MethodData)
destructor [CSStateVar JavaCode svr]
_ = String -> MS (JavaCode MethodData)
forall a. HasCallStack => String -> a
error (String -> MS (JavaCode MethodData))
-> String -> MS (JavaCode MethodData)
forall a b. (a -> b) -> a -> b
$ String -> String
CP.destructorError String
jName

instance MethodElim JavaCode MethodData where
  method :: JavaCode MethodData -> Doc
method = MethodData -> Doc
mthdDoc (MethodData -> Doc)
-> (JavaCode MethodData -> MethodData)
-> JavaCode MethodData
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode MethodData -> MethodData
forall a. JavaCode a -> a
unJC

instance StateVarSym JavaCode Doc Doc Doc where
  stateVar :: JavaCode Doc
-> JavaCode Doc -> SVariable JavaCode -> CSStateVar JavaCode Doc
stateVar = JavaCode Doc
-> JavaCode Doc -> SVariable JavaCode -> CSStateVar JavaCode Doc
forall (r :: * -> *) vis smt md svr att.
(Monad r, OORenderSym r vis smt md svr att) =>
r vis -> r att -> SVariable r -> CS (r Doc)
CP.stateVar
  stateVarDef :: JavaCode Doc
-> JavaCode Doc
-> SVariable JavaCode
-> SValue JavaCode
-> CSStateVar JavaCode Doc
stateVarDef = JavaCode Doc
-> JavaCode Doc
-> SVariable JavaCode
-> SValue JavaCode
-> CSStateVar JavaCode Doc
forall (r :: * -> *) vis smt md svr att.
(OORenderSym r vis smt md svr att, Monad r) =>
r vis -> r att -> SVariable r -> SValue r -> CS (r Doc)
CP.stateVarDef
  constVar :: JavaCode Doc
-> SVariable JavaCode -> SValue JavaCode -> CSStateVar JavaCode Doc
constVar = Doc
-> JavaCode Doc
-> SVariable JavaCode
-> SValue JavaCode
-> CSStateVar JavaCode Doc
forall (r :: * -> *) vis smt md.
(CommonRenderSym r vis smt md, Monad r) =>
Doc -> r vis -> SVariable r -> SValue r -> CS (r Doc)
CP.constVar (JavaCode Doc -> Doc
forall (r :: * -> *) att. PermElim r att => r att -> Doc
RC.perm (JavaCode Doc
forall (r :: * -> *) att. AttachmentSym r att => r att
classLevel :: JavaCode Doc))

instance StateVarElim JavaCode StateVar where
  stateVar :: JavaCode Doc -> Doc
stateVar = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance ClassSym JavaCode Doc (Doc, Terminator) MethodData StateVar Doc where
  buildClass :: Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
buildClass = Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, VisibilitySym r vis) =>
Maybe String
-> [CSStateVar r svr] -> [MS (r md)] -> [MS (r md)] -> CS (r Doc)
G.buildClass
  extraClass :: String
-> Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
extraClass = String
-> Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, RenderVisibility r vis) =>
String
-> Maybe String
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
jExtraClass
  implementingClass :: String
-> [String]
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
implementingClass = String
-> [String]
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, VisibilitySym r vis) =>
String
-> [String]
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
G.implementingClass

  docClass :: String -> CSStateVar JavaCode Doc -> CSStateVar JavaCode Doc
docClass = String -> CSStateVar JavaCode Doc -> CSStateVar JavaCode Doc
forall (r :: * -> *) vis md svr.
RenderClass r vis md svr =>
String -> CS (r Doc) -> CS (r Doc)
CP.doxClass

instance RenderClass JavaCode Doc MethodData StateVar where
  intClass :: String
-> JavaCode Doc
-> JavaCode Doc
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
intClass = (String -> Doc -> Doc -> Doc -> Doc -> Doc)
-> String
-> JavaCode Doc
-> JavaCode Doc
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) md svr vis.
(MethodElim r md, Monad r, StateVarElim r svr,
 VisibilityElim r vis) =>
(String -> Doc -> Doc -> Doc -> Doc -> Doc)
-> String
-> r vis
-> r Doc
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
CP.intClass String -> Doc -> Doc -> Doc -> Doc -> Doc
R.class'

  inherit :: Maybe String -> JavaCode Doc
inherit Maybe String
n = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ Doc -> (String -> Doc) -> Maybe String -> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
empty ((Doc
jExtends <+>) (Doc -> Doc) -> (String -> Doc) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc
text) Maybe String
n
  implements :: [String] -> JavaCode Doc
implements [String]
is = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ Doc
jImplements Doc -> Doc -> Doc
<+> String -> Doc
text (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
listSep [String]
is)

  commentedClass :: CSStateVar JavaCode Doc
-> CSStateVar JavaCode Doc -> CSStateVar JavaCode Doc
commentedClass = CSStateVar JavaCode Doc
-> CSStateVar JavaCode Doc -> CSStateVar JavaCode Doc
forall (r :: * -> *).
(BlockCommentElim r, ClassElim r, Monad r) =>
CS (r Doc) -> CS (r Doc) -> CS (r Doc)
G.commentedClass

instance ClassElim JavaCode where
  class' :: JavaCode Doc -> Doc
class' = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance ModuleSym JavaCode Doc (Doc, Terminator) MethodData StateVar Doc where
  buildModule :: String
-> [String]
-> [MS (JavaCode MethodData)]
-> [CSStateVar JavaCode Doc]
-> FS (JavaCode Module)
buildModule String
n = String
-> (String -> JavaCode Doc)
-> [String]
-> [MS (JavaCode MethodData)]
-> [CSStateVar JavaCode Doc]
-> FS (JavaCode Module)
forall (r :: * -> *) vis smt md svr att.
(OORenderSym r vis smt md svr att, UnRepr r Doc) =>
String
-> (String -> r Doc)
-> [String]
-> [MS (r md)]
-> [CS (r Doc)]
-> FS (r Module)
CP.buildModule' String
n String -> JavaCode Doc
forall (r :: * -> *). ImportSym r => String -> r Doc
langImport

instance RenderMod JavaCode where
  modFromData :: String -> FS Doc -> FS (JavaCode Module)
modFromData String
n = String
-> (Doc -> JavaCode Module) -> FS Doc -> FS (JavaCode Module)
forall (r :: * -> *).
String -> (Doc -> r Module) -> FS Doc -> FS (r Module)
G.modFromData String
n (Module -> JavaCode Module
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Module -> JavaCode Module)
-> (Doc -> Module) -> Doc -> JavaCode Module
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Module
md String
n)
  updateModuleDoc :: (Doc -> Doc) -> JavaCode Module -> JavaCode Module
updateModuleDoc Doc -> Doc
f = (Module -> Module) -> JavaCode Module -> JavaCode Module
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Doc -> Doc) -> Module -> Module
updateMod Doc -> Doc
f)

instance ModuleElim JavaCode where
  module' :: JavaCode Module -> Doc
module' = Module -> Doc
modDoc (Module -> Doc)
-> (JavaCode Module -> Module) -> JavaCode Module -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Module -> Module
forall a. JavaCode a -> a
unJC

instance BlockCommentSym JavaCode where
  blockComment :: [String] -> JavaCode Doc
blockComment [String]
lns = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ [String] -> Doc -> Doc -> Doc
R.blockCmt [String]
lns Doc
blockCmtStart Doc
blockCmtEnd
  docComment :: forall a. State a [String] -> State a (JavaCode Doc)
docComment = ([String] -> JavaCode Doc)
-> State a [String] -> State a (JavaCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue (\[String]
lns -> Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ [String] -> Doc -> Doc -> Doc
R.docCmt [String]
lns Doc
docCmtStart
    Doc
blockCmtEnd)

instance BlockCommentElim JavaCode where
  blockComment' :: JavaCode Doc -> Doc
blockComment' = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance HasException JavaCode where
  toConcreteExc :: ExceptionType -> JavaCode Exception
toConcreteExc ExceptionType
Standard = Exception -> JavaCode Exception
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Exception -> JavaCode Exception)
-> Exception -> JavaCode Exception
forall a b. (a -> b) -> a -> b
$ String -> Exception
stdExc String
exceptionObj
  toConcreteExc ExceptionType
FileNotFound = Exception -> JavaCode Exception
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Exception -> JavaCode Exception)
-> Exception -> JavaCode Exception
forall a b. (a -> b) -> a -> b
$ String -> String -> Exception
exception (String -> String
javaImport String
io) String
jFNFExc
  toConcreteExc ExceptionType
IO = Exception -> JavaCode Exception
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Exception -> JavaCode Exception)
-> Exception -> JavaCode Exception
forall a b. (a -> b) -> a -> b
$ String -> String -> Exception
exception (String -> String
javaImport String
io) String
jIOExc

jName, jVersion :: String
jName :: String
jName = String
"Java"
jVersion :: String
jVersion = String
"14"

jImport :: Label -> Doc
jImport :: String -> Doc
jImport String
n = Doc
importLabel Doc -> Doc -> Doc
<+> String -> Doc
text String
n Doc -> Doc -> Doc
<> Doc
endStatement

jBoolType :: (Monad r) => VS (r TypeData)
jBoolType :: forall (r :: * -> *). Monad r => VS (r TypeData)
jBoolType = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
Boolean String
jBool (String -> Doc
text String
jBool)

jInfileType :: (Monad r) => VS (r TypeData)
jInfileType :: forall (r :: * -> *). Monad r => VS (r TypeData)
jInfileType = do
  r TypeData
tpf <- CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
InFile String
jScanner Doc
jScanner'
  (ValueState -> ValueState) -> r TypeData -> VS (r TypeData)
forall s a. (s -> s) -> a -> State s a
modifyReturn (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jScanner) r TypeData
tpf

jOutfileType :: (Monad r) => VS (r TypeData)
jOutfileType :: forall (r :: * -> *). Monad r => VS (r TypeData)
jOutfileType = do
  r TypeData
tpf <- CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
OutFile String
jPrintWriter (String -> Doc
text String
jPrintWriter)
  (ValueState -> ValueState) -> r TypeData -> VS (r TypeData)
forall s a. (s -> s) -> a -> State s a
modifyReturn (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
ioImport String
jPrintWriter) r TypeData
tpf

jExtends, jImplements, jFinal, jScanner', jLambdaSep :: Doc
jExtends :: Doc
jExtends = String -> Doc
text String
"extends"
jImplements :: Doc
jImplements = String -> Doc
text String
"implements"
jFinal :: Doc
jFinal = String -> Doc
text String
"final"
jScanner' :: Doc
jScanner' = String -> Doc
text String
jScanner
jLambdaSep :: Doc
jLambdaSep = String -> Doc
text String
"->"

arrayList, jBool, jBool', jInteger, jObject, jScanner, jContains, jPrintWriter,
  jFile, jFileWriter, jIOExc, jFNFExc, jArrays, jSet, jAsList, jSetOf, jStdIn,
  jStdOut, jPrintLn, jEquals, jParseInt, jParseDbl, jParseFloat, jIndex,
  jListAdd, jListRemove, jListUnion, jListAccess, jListSet, jClose, jNext,
  jNextLine, jNextBool, jHasNextLine, jCharAt, jSplit, io, util :: String
arrayList :: String
arrayList = String
"ArrayList"
jBool :: String
jBool = String
"boolean"
jBool' :: String
jBool' = String
"Boolean"
jInteger :: String
jInteger = String
"Integer"
jObject :: String
jObject = String
"Object"
jScanner :: String
jScanner = String
"Scanner"
jContains :: String
jContains = String
"contains"
jPrintWriter :: String
jPrintWriter = String
"PrintWriter"
jFile :: String
jFile = String
"File"
jFileWriter :: String
jFileWriter = String
"FileWriter"
jIOExc :: String
jIOExc = String
"IOException"
jFNFExc :: String
jFNFExc = String
"FileNotFoundException"
jArrays :: String
jArrays = String
"Arrays"
jSet :: String
jSet = String
"Set"
jAsList :: String
jAsList = String
jArrays String -> String -> String
`access` String
"asList"
jSetOf :: String
jSetOf = String
jSet String -> String -> String
`access` String
"of"
jStdIn :: String
jStdIn = String
"in"
jStdOut :: String
jStdOut = String
"out"
jPrintLn :: String
jPrintLn = String
"println"
jEquals :: String
jEquals = String
"equals"
jParseInt :: String
jParseInt = String
jInteger String -> String -> String
`access` String
"parseInt"
jParseDbl :: String
jParseDbl = String
CP.doubleRender String -> String -> String
`access` String
"parseDouble"
jParseFloat :: String
jParseFloat = String
CP.floatRender String -> String -> String
`access` String
"parseFloat"
jIndex :: String
jIndex = String
"indexOf"
jListAdd :: String
jListAdd = String
"add"
jListRemove :: String
jListRemove = String
"remove"
jListUnion :: String
jListUnion = String
"addAll"
jListAccess :: String
jListAccess = String
"get"
jListSet :: String
jListSet = String
"set"
jClose :: String
jClose = String
"close"
jNext :: String
jNext = String
"next"
jNextLine :: String
jNextLine = String
"nextLine"
jNextBool :: String
jNextBool = String
"nextBoolean"
jHasNextLine :: String
jHasNextLine = String
"hasNextLine"
jCharAt :: String
jCharAt = String
"charAt"
jSplit :: String
jSplit = String
"split"
io :: String
io = String
"io"
util :: String
util = String
"util"

javaImport, ioImport, utilImport :: String -> String
javaImport :: String -> String
javaImport = String -> String -> String
access String
"java"
ioImport :: String -> String
ioImport = String -> String
javaImport (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
access String
io
utilImport :: String -> String
utilImport = String -> String
javaImport (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
access String
util

jSystem :: String -> Doc
jSystem :: String -> Doc
jSystem = String -> Doc
text (String -> Doc) -> (String -> String) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
access String
"System"

jUnaryMath :: (Monad r) => String -> VSOp r
jUnaryMath :: forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath = String -> VSOp r
forall (r :: * -> *). Monad r => String -> VSOp r
unOpPrec (String -> VSOp r) -> (String -> String) -> String -> VSOp r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
mathFunc

jListType :: (TypeElim r, UnRepr r TypeData, Monad r) =>
  VS (r TypeData) -> VS (r TypeData)
jListType :: forall (r :: * -> *).
(TypeElim r, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jListType VS (r TypeData)
t = do
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
arrayList)
  VS (r TypeData)
t VS (r TypeData)
-> (r TypeData -> VS (r TypeData)) -> VS (r TypeData)
forall a b.
StateT ValueState Identity a
-> (a -> StateT ValueState Identity b)
-> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (CodeType -> VS (r TypeData)
jListType' (CodeType -> VS (r TypeData))
-> (r TypeData -> CodeType) -> r TypeData -> VS (r TypeData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType)
  where jListType' :: CodeType -> VS (r TypeData)
jListType' CodeType
Integer = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
List CodeType
Integer)
          String
lstInt (String -> Doc
text String
lstInt)
        jListType' CodeType
Float = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
arrayList VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.float
        jListType' CodeType
Double = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
arrayList VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.double
        jListType' CodeType
Boolean = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
List CodeType
Boolean) String
lstBool (String -> Doc
text String
lstBool)
        jListType' CodeType
_ = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
arrayList VS (r TypeData)
t
        lstInt :: String
lstInt = String
arrayList String -> String -> String
`containing` String
jInteger
        lstBool :: String
lstBool = String
arrayList String -> String -> String
`containing` String
jBool'

jSetType :: (TypeElim r, UnRepr r TypeData, Monad r) =>
  VS (r TypeData) -> VS (r TypeData)
jSetType :: forall (r :: * -> *).
(TypeElim r, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jSetType VS (r TypeData)
t = do
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
"Set")
  VS (r TypeData)
t VS (r TypeData)
-> (r TypeData -> VS (r TypeData)) -> VS (r TypeData)
forall a b.
StateT ValueState Identity a
-> (a -> StateT ValueState Identity b)
-> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (CodeType -> VS (r TypeData)
jSetType' (CodeType -> VS (r TypeData))
-> (r TypeData -> CodeType) -> r TypeData -> VS (r TypeData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType)
  where jSetType' :: CodeType -> VS (r TypeData)
jSetType' CodeType
Integer = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
Set CodeType
Integer)
          String
stInt (String -> Doc
text String
stInt)
        jSetType' CodeType
Float = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
"Set" VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.float
        jSetType' CodeType
Double = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
"Set" VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.double
        jSetType' CodeType
Boolean = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
Set CodeType
Boolean) String
stBool (String -> Doc
text String
stBool)
        jSetType' CodeType
_ = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
"Set" VS (r TypeData)
t
        stInt :: String
stInt = String
"Set" String -> String -> String
`containing` String
jInteger
        stBool :: String
stBool = String
"Set" String -> String -> String
`containing` String
jBool'

jArrayType :: VS (JavaCode TypeData)
jArrayType :: VS (JavaCode TypeData)
jArrayType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
arrayType (String -> VS (JavaCode TypeData)
forall (r :: * -> *). OOTypeSym r => String -> VS (r TypeData)
obj String
jObject)

jLitArray :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jLitArray :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jLitArray VS (JavaCode TypeData)
t' [SValue JavaCode]
es' = do
  [JavaCode Value]
es <- [SValue JavaCode] -> StateT ValueState Identity [JavaCode Value]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [SValue JavaCode]
es'
  JavaCode TypeData
lt <- VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
arrayType VS (JavaCode TypeData)
t'
  JavaCode TypeData -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
r TypeData -> Doc -> SValue r
mkVal JavaCode TypeData
lt (Doc
new' Doc -> Doc -> Doc
<+> JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType JavaCode TypeData
lt
    Doc -> Doc -> Doc
<+> Doc -> Doc
braces ([JavaCode Value] -> Doc
forall (r :: * -> *). ValueElim r => [r Value] -> Doc
valueList [JavaCode Value]
es))

jFileType :: (OOTypeSym r) => VS (r TypeData)
jFileType :: forall (r :: * -> *). OOTypeSym r => VS (r TypeData)
jFileType = do
  r TypeData
tpf <- String -> VS (r TypeData)
forall (r :: * -> *). OOTypeSym r => String -> VS (r TypeData)
obj String
jFile
  (ValueState -> ValueState) -> r TypeData -> VS (r TypeData)
forall s a. (s -> s) -> a -> State s a
modifyReturn (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
ioImport String
jFile) r TypeData
tpf

jFileWriterType :: (OOTypeSym r) => VS (r TypeData)
jFileWriterType :: forall (r :: * -> *). OOTypeSym r => VS (r TypeData)
jFileWriterType = do
  r TypeData
tpf <- String -> VS (r TypeData)
forall (r :: * -> *). OOTypeSym r => String -> VS (r TypeData)
obj String
jFileWriter
  (ValueState -> ValueState) -> r TypeData -> VS (r TypeData)
forall s a. (s -> s) -> a -> State s a
modifyReturn (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
ioImport String
jFileWriter) r TypeData
tpf

jAsListFunc :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jAsListFunc :: VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
jAsListFunc VS (JavaCode TypeData)
t = String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp String
jAsList (VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
listType VS (JavaCode TypeData)
t)

jEqualsFunc :: SValue JavaCode -> VS (JavaCode FuncData)
jEqualsFunc :: SValue JavaCode -> VS (JavaCode FuncData)
jEqualsFunc SValue JavaCode
v = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jEquals VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool [SValue JavaCode
v]

jParseIntFunc :: SValue JavaCode -> SValue JavaCode
jParseIntFunc :: SValue JavaCode -> SValue JavaCode
jParseIntFunc SValue JavaCode
v = String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp String
jParseInt VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
int [SValue JavaCode
v]

jParseDblFunc :: SValue JavaCode -> SValue JavaCode
jParseDblFunc :: SValue JavaCode -> SValue JavaCode
jParseDblFunc SValue JavaCode
v = String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp String
jParseDbl VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
double [SValue JavaCode
v]

jParseFloatFunc :: SValue JavaCode -> SValue JavaCode
jParseFloatFunc :: SValue JavaCode -> SValue JavaCode
jParseFloatFunc SValue JavaCode
v = String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp String
jParseFloat VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
float [SValue JavaCode
v]

jNextFunc :: VS (JavaCode FuncData)
jNextFunc :: VS (JavaCode FuncData)
jNextFunc = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jNext VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string []

jNextLineFunc :: VS (JavaCode FuncData)
jNextLineFunc :: VS (JavaCode FuncData)
jNextLineFunc = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jNextLine VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string []

jNextBoolFunc :: VS (JavaCode FuncData)
jNextBoolFunc :: VS (JavaCode FuncData)
jNextBoolFunc = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jNextBool VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool []

jHasNextLineFunc :: VS (JavaCode FuncData)
jHasNextLineFunc :: VS (JavaCode FuncData)
jHasNextLineFunc = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jHasNextLine VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool []

jCharAtFunc :: VS (JavaCode FuncData)
jCharAtFunc :: VS (JavaCode FuncData)
jCharAtFunc = String
-> VS (JavaCode TypeData)
-> [SValue JavaCode]
-> VS (JavaCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jCharAt VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
char [Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
0]

jSplitFunc :: (Literal r, OOFunctionSym r) => Char -> VS (r FuncData)
jSplitFunc :: forall (r :: * -> *).
(Literal r, OOFunctionSym r) =>
Char -> VS (r FuncData)
jSplitFunc Char
d = String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
jSplit (VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
listType VS (r TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string) [String -> SValue r
forall (r :: * -> *). Literal r => String -> SValue r
litString [Char
d]]

jEquality :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
jEquality :: SValue JavaCode -> SValue JavaCode -> SValue JavaCode
jEquality SValue JavaCode
v1 SValue JavaCode
v2 = SValue JavaCode
v2 SValue JavaCode
-> (JavaCode Value -> SValue JavaCode) -> SValue JavaCode
forall a b.
StateT ValueState Identity a
-> (a -> StateT ValueState Identity b)
-> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CodeType -> SValue JavaCode
jEquality' (CodeType -> SValue JavaCode)
-> (JavaCode Value -> CodeType)
-> JavaCode Value
-> SValue JavaCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType (JavaCode TypeData -> CodeType)
-> (JavaCode Value -> JavaCode TypeData)
-> JavaCode Value
-> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Value -> JavaCode TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType
  where jEquality' :: CodeType -> SValue JavaCode
jEquality' CodeType
String = SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
objAccess SValue JavaCode
v1 (SValue JavaCode -> VS (JavaCode FuncData)
jEqualsFunc SValue JavaCode
v2)
        jEquality' CodeType
_ = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
-> SValue JavaCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
equalOp VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool SValue JavaCode
v1 SValue JavaCode
v2

jLambda :: [r BinderD] -> r Value -> Doc
jLambda :: forall (r :: * -> *). [r BinderD] -> r Value -> Doc
jLambda = String -> [r BinderD] -> r Value -> Doc
forall a. HasCallStack => String -> a
error String
"Lambdas not supported in Java (yet). See #4956 for updates." -- \ps ex -> parens (binderList ps) <+> jLambdaSep <+> RC.value ex

jCast :: VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
jCast :: VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
jCast = StateT ValueState Identity (SValue JavaCode) -> SValue JavaCode
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (StateT ValueState Identity (SValue JavaCode) -> SValue JavaCode)
-> (VS (JavaCode TypeData)
    -> SValue JavaCode -> StateT ValueState Identity (SValue JavaCode))
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> SValue JavaCode
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (JavaCode TypeData -> JavaCode Value -> SValue JavaCode)
-> VS (JavaCode TypeData)
-> SValue JavaCode
-> StateT ValueState Identity (SValue JavaCode)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues
  (\JavaCode TypeData
t JavaCode Value
v -> CodeType
-> CodeType
-> JavaCode TypeData
-> JavaCode Value
-> SValue JavaCode
jCast' (JavaCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType JavaCode TypeData
t) (JavaCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType (JavaCode TypeData -> CodeType) -> JavaCode TypeData -> CodeType
forall a b. (a -> b) -> a -> b
$ JavaCode Value -> JavaCode TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType JavaCode Value
v) JavaCode TypeData
t JavaCode Value
v)
  where jCast' :: CodeType
-> CodeType
-> JavaCode TypeData
-> JavaCode Value
-> SValue JavaCode
jCast' CodeType
Double CodeType
String JavaCode TypeData
_ JavaCode Value
v = SValue JavaCode -> SValue JavaCode
jParseDblFunc (JavaCode Value -> SValue JavaCode
forall a s. a -> State s a
toState JavaCode Value
v)
        jCast' CodeType
Float CodeType
String JavaCode TypeData
_ JavaCode Value
v = SValue JavaCode -> SValue JavaCode
jParseFloatFunc (JavaCode Value -> SValue JavaCode
forall a s. a -> State s a
toState JavaCode Value
v)
        jCast' CodeType
_ CodeType
_ JavaCode TypeData
t JavaCode Value
v = VS (JavaCode TypeData) -> Doc -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal (JavaCode TypeData -> VS (JavaCode TypeData)
forall a s. a -> State s a
toState JavaCode TypeData
t) (Doc -> Doc -> Doc
R.castObj (Doc -> Doc
R.cast (JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType JavaCode TypeData
t))
          (JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value JavaCode Value
v))

jConstDecDef :: SVariable JavaCode -> JavaCode ScopeData -> SValue JavaCode ->
  MS (JavaCode (Doc, Terminator))
jConstDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
jConstDecDef SVariable JavaCode
v' JavaCode ScopeData
scp SValue JavaCode
def' = do
  JavaCode Variable
v <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> SVariable JavaCode
-> StateT MethodState Identity (JavaCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable JavaCode
v'
  JavaCode Value
def <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Value))
  MethodState
  ValueState
-> SValue JavaCode -> StateT MethodState Identity (JavaCode Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Value) ValueState)
-> MethodState -> Focusing Identity (JavaCode Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue JavaCode
def'
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((MethodState -> MethodState) -> StateT MethodState Identity ())
-> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ String -> MethodState -> MethodState
useVarName (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ JavaCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName JavaCode Variable
v
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((MethodState -> MethodState) -> StateT MethodState Identity ())
-> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ String -> ScopeData -> MethodState -> MethodState
setVarScope (JavaCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName JavaCode Variable
v) (JavaCode ScopeData -> ScopeData
forall (r :: * -> *). ScopeElim r => r ScopeData -> ScopeData
scopeData JavaCode ScopeData
scp)
  Doc -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt (Doc -> MS (JavaCode (Doc, Terminator)))
-> Doc -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ Doc
jFinal Doc -> Doc -> Doc
<+> JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType JavaCode Variable
v) Doc -> Doc -> Doc
<+>
    JavaCode Variable -> Doc
forall (r :: * -> *). InternalVarElim r => r Variable -> Doc
RC.variable JavaCode Variable
v Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<+> JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value JavaCode Value
def

jFuncDecDef :: SVariable JavaCode -> JavaCode ScopeData ->
  [SVariable JavaCode] -> MS (JavaCode Body) -> MS (JavaCode (Doc, Terminator))
jFuncDecDef :: SVariable JavaCode
-> JavaCode ScopeData
-> [SVariable JavaCode]
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
jFuncDecDef SVariable JavaCode
v JavaCode ScopeData
scp [SVariable JavaCode]
ps MS (JavaCode Doc)
bod = do
  JavaCode Variable
vr <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> SVariable JavaCode
-> StateT MethodState Identity (JavaCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable JavaCode
v
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((MethodState -> MethodState) -> StateT MethodState Identity ())
-> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ String -> MethodState -> MethodState
useVarName (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ JavaCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName JavaCode Variable
vr
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((MethodState -> MethodState) -> StateT MethodState Identity ())
-> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ String -> ScopeData -> MethodState -> MethodState
setVarScope (JavaCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName JavaCode Variable
vr) (JavaCode ScopeData -> ScopeData
forall (r :: * -> *). ScopeElim r => r ScopeData -> ScopeData
scopeData JavaCode ScopeData
scp)
  [JavaCode Variable]
pms <- (SVariable JavaCode
 -> StateT MethodState Identity (JavaCode Variable))
-> [SVariable JavaCode]
-> StateT MethodState Identity [JavaCode Variable]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> SVariable JavaCode
-> StateT MethodState Identity (JavaCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS) [SVariable JavaCode]
ps
  JavaCode Doc
b <- MS (JavaCode Doc)
bod
  Doc -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt (Doc -> MS (JavaCode (Doc, Terminator)))
-> Doc -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType JavaCode Variable
vr) Doc -> Doc -> Doc
<+> JavaCode Variable -> Doc
forall (r :: * -> *). InternalVarElim r => r Variable -> Doc
RC.variable JavaCode Variable
vr Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<+>
    Doc -> Doc
parens ([JavaCode Variable] -> Doc
forall (r :: * -> *). InternalVarElim r => [r Variable] -> Doc
variableList [JavaCode Variable]
pms) Doc -> Doc -> Doc
<+> Doc
jLambdaSep Doc -> Doc -> Doc
<+> Doc
bodyStart Doc -> Doc -> Doc
$$ Doc -> Doc
indent (JavaCode Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body JavaCode Doc
b)
    Doc -> Doc -> Doc
$$ Doc
bodyEnd

jThrowDoc :: (ValueElim r) => r Value -> Doc
jThrowDoc :: forall (r :: * -> *). ValueElim r => r Value -> Doc
jThrowDoc r Value
errMsg = Doc
throwLabel Doc -> Doc -> Doc
<+> Doc
new' Doc -> Doc -> Doc
<+> Doc
exceptionObj' Doc -> Doc -> Doc
<>
  Doc -> Doc
parens (r Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value r Value
errMsg)

jTryCatch :: (BodyElim r) => r Body -> r Body -> Doc
jTryCatch :: forall (r :: * -> *). BodyElim r => r Doc -> r Doc -> Doc
jTryCatch r Doc
tb r Doc
cb = [Doc] -> Doc
vcat [
  Doc
tryLabel Doc -> Doc -> Doc
<+> Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ r Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body r Doc
tb,
  Doc
rbrace Doc -> Doc -> Doc
<+> Doc
catchLabel Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Doc
exceptionObj' Doc -> Doc -> Doc
<+> String -> Doc
text String
"exc") Doc -> Doc -> Doc
<+>
    Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ r Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body r Doc
cb,
  Doc
rbrace]

jAssert :: (ValueElim r) => r Value -> r Value -> Doc
jAssert :: forall (r :: * -> *). ValueElim r => r Value -> r Value -> Doc
jAssert r Value
condition r Value
errorMessage = [Doc] -> Doc
vcat [
  String -> Doc
text String
"assert" Doc -> Doc -> Doc
<+> r Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value r Value
condition Doc -> Doc -> Doc
<+> Doc
colon Doc -> Doc -> Doc
<+> r Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value r Value
errorMessage
  ]

jOut
  :: (InternalIOStmt r smt, SharedStatement r smt, TypeElim r)
  => Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut :: forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
jOut Bool
newLn Maybe (SValue r)
f SValue r
printFn SValue r
v = LensLike'
  (Zoomed (StateT ValueState Identity) (r Value))
  MethodState
  ValueState
-> SValue r -> StateT MethodState Identity (r Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (r Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (r Value) ValueState)
-> MethodState -> Focusing Identity (r Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue r
v StateT MethodState Identity (r Value)
-> (r Value -> StateT MethodState Identity (r smt))
-> StateT MethodState Identity (r smt)
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CodeType -> StateT MethodState Identity (r smt)
jOut' (CodeType -> StateT MethodState Identity (r smt))
-> (r Value -> CodeType)
-> r Value
-> StateT MethodState Identity (r smt)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType (r TypeData -> CodeType)
-> (r Value -> r TypeData) -> r Value -> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r Value -> r TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType
  where jOut' :: CodeType -> StateT MethodState Identity (r smt)
jOut' (List (Object String
_)) = Bool
-> Maybe (SValue r)
-> SValue r
-> SValue r
-> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
G.print Bool
newLn Maybe (SValue r)
f SValue r
printFn SValue r
v
        jOut' (List CodeType
_) = Bool
-> Maybe (SValue r)
-> SValue r
-> SValue r
-> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
InternalIOStmt r smt =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
printSt Bool
newLn Maybe (SValue r)
f SValue r
printFn SValue r
v
        jOut' (Array CodeType
_) = do
          LensLike'
  (Zoomed (StateT ValueState Identity) ()) MethodState ValueState
-> StateT ValueState Identity () -> StateT MethodState Identity ()
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) ()) MethodState ValueState
Lens' MethodState ValueState
lensMStoVS (StateT ValueState Identity () -> StateT MethodState Identity ())
-> StateT ValueState Identity () -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jArrays)
          Bool
-> Maybe (SValue r)
-> SValue r
-> SValue r
-> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
InternalIOStmt r smt =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
printSt Bool
newLn Maybe (SValue r)
f SValue r
printFn (String -> PosCall r
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
jArrays String
"toString" VS (r TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string [SValue r
v])
        jOut' CodeType
_ = Bool
-> Maybe (SValue r)
-> SValue r
-> SValue r
-> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
G.print Bool
newLn Maybe (SValue r)
f SValue r
printFn SValue r
v

jDiscardInput :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
jDiscardInput :: SValue JavaCode -> MS (JavaCode (Doc, Terminator))
jDiscardInput SValue JavaCode
inFn = SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
SValue r -> MS (r smt)
valStmt (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextFunc

jInput :: SVariable JavaCode -> SValue JavaCode -> SValue JavaCode
jInput :: SVariable JavaCode -> SValue JavaCode -> SValue JavaCode
jInput SVariable JavaCode
vr SValue JavaCode
inFn = do
  JavaCode Variable
v <- SVariable JavaCode
vr
  let jInput' :: CodeType -> SValue JavaCode
jInput' CodeType
Integer = SValue JavaCode -> SValue JavaCode
jParseIntFunc (SValue JavaCode -> SValue JavaCode)
-> SValue JavaCode -> SValue JavaCode
forall a b. (a -> b) -> a -> b
$ SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Float = SValue JavaCode -> SValue JavaCode
jParseFloatFunc (SValue JavaCode -> SValue JavaCode)
-> SValue JavaCode -> SValue JavaCode
forall a b. (a -> b) -> a -> b
$ SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Double = SValue JavaCode -> SValue JavaCode
jParseDblFunc (SValue JavaCode -> SValue JavaCode)
-> SValue JavaCode -> SValue JavaCode
forall a b. (a -> b) -> a -> b
$ SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Boolean = SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextBoolFunc
      jInput' CodeType
String = SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Char = (SValue JavaCode
inFn SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jNextFunc) SValue JavaCode -> VS (JavaCode FuncData) -> SValue JavaCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. VS (JavaCode FuncData)
jCharAtFunc
      jInput' CodeType
_ = String -> SValue JavaCode
forall a. HasCallStack => String -> a
error String
"Attempt to read value of unreadable type"
  CodeType -> SValue JavaCode
jInput' (JavaCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType (JavaCode TypeData -> CodeType) -> JavaCode TypeData -> CodeType
forall a b. (a -> b) -> a -> b
$ JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType JavaCode Variable
v)

jOpenFileR :: (OOValueExpression r) => SValue r -> VS (r TypeData) -> SValue r
jOpenFileR :: forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r
jOpenFileR SValue r
n VS (r TypeData)
t = PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
t [PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
forall (r :: * -> *). OOTypeSym r => VS (r TypeData)
jFileType [SValue r
n]]

jOpenFileWorA :: (OOValueExpression r) => SValue r -> VS (r TypeData) ->
  SValue r -> SValue r
jOpenFileWorA :: forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r -> SValue r
jOpenFileWorA SValue r
n VS (r TypeData)
t SValue r
wa = PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
t
  [PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
forall (r :: * -> *). OOTypeSym r => VS (r TypeData)
jFileWriterType [PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
forall (r :: * -> *). OOTypeSym r => VS (r TypeData)
jFileType [SValue r
n], SValue r
wa]]

jStringSplit :: SVariable JavaCode -> SValue JavaCode -> VS Doc
jStringSplit :: SVariable JavaCode
-> SValue JavaCode -> StateT ValueState Identity Doc
jStringSplit = (JavaCode Variable -> JavaCode Value -> Doc)
-> SVariable JavaCode
-> SValue JavaCode
-> StateT ValueState Identity Doc
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues (\JavaCode Variable
vnew JavaCode Value
s -> JavaCode Variable -> Doc
forall (r :: * -> *). InternalVarElim r => r Variable -> Doc
RC.variable JavaCode Variable
vnew Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<+>
  Doc
new' Doc -> Doc -> Doc
<+> JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType JavaCode Variable
vnew) Doc -> Doc -> Doc
<> Doc -> Doc
parens (JavaCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value JavaCode Value
s))

jMethod :: Label -> [String] -> JavaCode Doc ->
  JavaCode Doc -> JavaCode TypeData ->
  [JavaCode ParamData] -> JavaCode Body -> Doc
jMethod :: String
-> [String]
-> JavaCode Doc
-> JavaCode Doc
-> JavaCode TypeData
-> [JavaCode ParamData]
-> JavaCode Doc
-> Doc
jMethod String
n [String]
es JavaCode Doc
s JavaCode Doc
p JavaCode TypeData
t [JavaCode ParamData]
ps JavaCode Doc
b = [Doc] -> Doc
vcat [
  JavaCode Doc -> Doc
forall (r :: * -> *) vis. VisibilityElim r vis => r vis -> Doc
RC.visibility JavaCode Doc
s Doc -> Doc -> Doc
<+> JavaCode Doc -> Doc
forall (r :: * -> *) att. PermElim r att => r att -> Doc
RC.perm JavaCode Doc
p Doc -> Doc -> Doc
<+> JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType JavaCode TypeData
t Doc -> Doc -> Doc
<+> String -> Doc
text String
n Doc -> Doc -> Doc
<>
    Doc -> Doc
parens ([JavaCode ParamData] -> Doc
forall (r :: * -> *). ParamElim r => [r ParamData] -> Doc
parameterList [JavaCode ParamData]
ps) Doc -> Doc -> Doc
<+> [String] -> Doc -> Doc
forall a. [a] -> Doc -> Doc
emptyIfNull [String]
es (Doc
throwsLabel Doc -> Doc -> Doc
<+>
    String -> Doc
text (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
listSep ([String] -> [String]
forall a. Ord a => [a] -> [a]
sort [String]
es))) Doc -> Doc -> Doc
<+> Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ JavaCode Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body JavaCode Doc
b,
  Doc
rbrace]

outputs :: SVariable JavaCode
outputs :: SVariable JavaCode
outputs = String -> VS (JavaCode TypeData) -> SVariable JavaCode
forall (r :: * -> *).
VariableSym r =>
String -> VS (r TypeData) -> SVariable r
var String
"outputs" VS (JavaCode TypeData)
jArrayType

jAssignFromArray :: Integer -> [SVariable JavaCode] -> [MS (JavaCode (Doc, Terminator))]
jAssignFromArray :: Integer
-> [SVariable JavaCode] -> [MS (JavaCode (Doc, Terminator))]
jAssignFromArray Integer
_ [] = []
jAssignFromArray Integer
c (SVariable JavaCode
v:[SVariable JavaCode]
vs) = (SVariable JavaCode
v SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= VS (JavaCode TypeData) -> SValue JavaCode -> SValue JavaCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> SValue r -> SValue r
cast ((JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
v)
  (SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf (SVariable JavaCode -> SValue JavaCode)
-> SVariable JavaCode -> SValue JavaCode
forall a b. (a -> b) -> a -> b
$ SValue JavaCode -> SValue JavaCode -> SVariable JavaCode
forall (r :: * -> *).
Array r =>
SValue r -> SValue r -> SVariable r
arrayElem (SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
outputs) (Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
c))) MS (JavaCode (Doc, Terminator))
-> [MS (JavaCode (Doc, Terminator))]
-> [MS (JavaCode (Doc, Terminator))]
forall a. a -> [a] -> [a]
: Integer
-> [SVariable JavaCode] -> [MS (JavaCode (Doc, Terminator))]
jAssignFromArray (Integer
cInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1) [SVariable JavaCode]
vs

jInOutCall :: (Label -> VS (JavaCode TypeData) -> [SValue JavaCode] ->
  SValue JavaCode) -> Label -> [SValue JavaCode] -> [SVariable JavaCode] ->
  [SVariable JavaCode] -> MS (JavaCode (Doc, Terminator))
jInOutCall :: (String
 -> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode)
-> InOutCall JavaCode (Doc, Terminator)
jInOutCall String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n [SValue JavaCode]
ins [] [] = SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
SValue r -> MS (r smt)
valStmt (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void [SValue JavaCode]
ins
jInOutCall String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n [SValue JavaCode]
ins [SVariable JavaCode
out] [] = SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign SVariable JavaCode
out (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n ((JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
out)
  [SValue JavaCode]
ins
jInOutCall String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n [SValue JavaCode]
ins [] [SVariable JavaCode
out] = SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign SVariable JavaCode
out (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n ((JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
out)
  (SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
out SValue JavaCode -> [SValue JavaCode] -> [SValue JavaCode]
forall a. a -> [a] -> [a]
: [SValue JavaCode]
ins)
jInOutCall String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n [SValue JavaCode]
ins [SVariable JavaCode]
outs [SVariable JavaCode]
both = [SVariable JavaCode] -> MS (JavaCode (Doc, Terminator))
fCall [SVariable JavaCode]
rets
  where rets :: [SVariable JavaCode]
rets = [SVariable JavaCode]
both [SVariable JavaCode]
-> [SVariable JavaCode] -> [SVariable JavaCode]
forall a. [a] -> [a] -> [a]
++ [SVariable JavaCode]
outs
        fCall :: [SVariable JavaCode] -> MS (JavaCode (Doc, Terminator))
fCall [SVariable JavaCode
x] = SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign SVariable JavaCode
x (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n ((JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
x)
          ((SVariable JavaCode -> SValue JavaCode)
-> [SVariable JavaCode] -> [SValue JavaCode]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf [SVariable JavaCode]
both [SValue JavaCode] -> [SValue JavaCode] -> [SValue JavaCode]
forall a. [a] -> [a] -> [a]
++ [SValue JavaCode]
ins)
        fCall [SVariable JavaCode]
xs = MS Bool
isOutputsDeclared MS Bool
-> (Bool -> MS (JavaCode (Doc, Terminator)))
-> MS (JavaCode (Doc, Terminator))
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Bool
odec -> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify MethodState -> MethodState
setOutputsDeclared StateT MethodState Identity ()
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode (Doc, Terminator))
forall a b.
StateT MethodState Identity a
-> StateT MethodState Identity b -> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
          [MS (JavaCode (Doc, Terminator))]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
[MS (r smt)] -> MS (r smt)
multi ((if Bool
odec then SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign else (SVariable JavaCode
-> JavaCode ScopeData
-> SValue JavaCode
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> SValue r -> MS (r smt)
`varDecDef` JavaCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local)) SVariable JavaCode
outputs
          (String
-> VS (JavaCode TypeData) -> [SValue JavaCode] -> SValue JavaCode
f String
n VS (JavaCode TypeData)
jArrayType ((SVariable JavaCode -> SValue JavaCode)
-> [SVariable JavaCode] -> [SValue JavaCode]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf [SVariable JavaCode]
both [SValue JavaCode] -> [SValue JavaCode] -> [SValue JavaCode]
forall a. [a] -> [a] -> [a]
++ [SValue JavaCode]
ins)) MS (JavaCode (Doc, Terminator))
-> [MS (JavaCode (Doc, Terminator))]
-> [MS (JavaCode (Doc, Terminator))]
forall a. a -> [a] -> [a]
: Integer
-> [SVariable JavaCode] -> [MS (JavaCode (Doc, Terminator))]
jAssignFromArray Integer
0 [SVariable JavaCode]
xs))

jInOut :: (VS (JavaCode TypeData) -> [MS (JavaCode ParamData)] ->
  MS (JavaCode Body) -> MS (JavaCode md)) -> [SVariable JavaCode] ->
  [SVariable JavaCode] -> [SVariable JavaCode] -> MS (JavaCode Body) ->
  MS (JavaCode md)
jInOut :: forall md.
(VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode md))
-> [SVariable JavaCode]
-> [SVariable JavaCode]
-> [SVariable JavaCode]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f [SVariable JavaCode]
ins [] [] MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f VS (JavaCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void ((SVariable JavaCode -> MS (JavaCode ParamData))
-> [SVariable JavaCode] -> [MS (JavaCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> MS (JavaCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param [SVariable JavaCode]
ins) MS (JavaCode Doc)
b
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f [SVariable JavaCode]
ins [SVariable JavaCode
v] [] MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f ((JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
v) ((SVariable JavaCode -> MS (JavaCode ParamData))
-> [SVariable JavaCode] -> [MS (JavaCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> MS (JavaCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param [SVariable JavaCode]
ins)
  ((JavaCode (Doc, Terminator)
 -> JavaCode Doc -> JavaCode (Doc, Terminator) -> JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
forall a b c d s.
(a -> b -> c -> d)
-> State s a -> State s b -> State s c -> State s d
on3StateValues (((Doc, Terminator) -> Doc -> (Doc, Terminator) -> Doc)
-> JavaCode (Doc, Terminator)
-> JavaCode Doc
-> JavaCode (Doc, Terminator)
-> JavaCode Doc
forall (r :: * -> *) a b c d.
Applicative r =>
(a -> b -> c -> d) -> r a -> r b -> r c -> r d
on3CodeValues (Doc, Terminator) -> Doc -> (Doc, Terminator) -> Doc
surroundBody) (SVariable JavaCode
-> JavaCode ScopeData -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> MS (r smt)
varDec SVariable JavaCode
v JavaCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local) MS (JavaCode Doc)
b (SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r smt)
returnStmt (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$
  SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
v))
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f [SVariable JavaCode]
ins [] [SVariable JavaCode
v] MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f ((JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
v)
  ((SVariable JavaCode -> MS (JavaCode ParamData))
-> [SVariable JavaCode] -> [MS (JavaCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> MS (JavaCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param ([SVariable JavaCode] -> [MS (JavaCode ParamData)])
-> [SVariable JavaCode] -> [MS (JavaCode ParamData)]
forall a b. (a -> b) -> a -> b
$ SVariable JavaCode
v SVariable JavaCode -> [SVariable JavaCode] -> [SVariable JavaCode]
forall a. a -> [a] -> [a]
: [SVariable JavaCode]
ins) ((JavaCode Doc -> JavaCode (Doc, Terminator) -> JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((Doc -> (Doc, Terminator) -> Doc)
-> JavaCode Doc -> JavaCode (Doc, Terminator) -> JavaCode Doc
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues Doc -> (Doc, Terminator) -> Doc
appendToBody) MS (JavaCode Doc)
b
  (SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r smt)
returnStmt (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
v))
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f [SVariable JavaCode]
ins [SVariable JavaCode]
outs [SVariable JavaCode]
both MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode md)
f ([SVariable JavaCode] -> VS (JavaCode TypeData)
returnTp [SVariable JavaCode]
rets)
  ((SVariable JavaCode -> MS (JavaCode ParamData))
-> [SVariable JavaCode] -> [MS (JavaCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> MS (JavaCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param ([SVariable JavaCode] -> [MS (JavaCode ParamData)])
-> [SVariable JavaCode] -> [MS (JavaCode ParamData)]
forall a b. (a -> b) -> a -> b
$ [SVariable JavaCode]
both [SVariable JavaCode]
-> [SVariable JavaCode] -> [SVariable JavaCode]
forall a. [a] -> [a] -> [a]
++ [SVariable JavaCode]
ins) ((JavaCode (Doc, Terminator)
 -> JavaCode Doc -> JavaCode (Doc, Terminator) -> JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
-> MS (JavaCode (Doc, Terminator))
-> MS (JavaCode Doc)
forall a b c d s.
(a -> b -> c -> d)
-> State s a -> State s b -> State s c -> State s d
on3StateValues (((Doc, Terminator) -> Doc -> (Doc, Terminator) -> Doc)
-> JavaCode (Doc, Terminator)
-> JavaCode Doc
-> JavaCode (Doc, Terminator)
-> JavaCode Doc
forall (r :: * -> *) a b c d.
Applicative r =>
(a -> b -> c -> d) -> r a -> r b -> r c -> r d
on3CodeValues (Doc, Terminator) -> Doc -> (Doc, Terminator) -> Doc
surroundBody) MS (JavaCode (Doc, Terminator))
decls
  MS (JavaCode Doc)
b ([SVariable JavaCode] -> MS (JavaCode (Doc, Terminator))
returnSt [SVariable JavaCode]
rets))
  where returnTp :: [SVariable JavaCode] -> VS (JavaCode TypeData)
returnTp [SVariable JavaCode
x] = (JavaCode Variable -> JavaCode TypeData)
-> SVariable JavaCode -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable JavaCode
x
        returnTp [SVariable JavaCode]
_ = VS (JavaCode TypeData)
jArrayType
        returnSt :: [SVariable JavaCode] -> MS (JavaCode (Doc, Terminator))
returnSt [SVariable JavaCode
x] = SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r smt)
returnStmt (SValue JavaCode -> MS (JavaCode (Doc, Terminator)))
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
x
        returnSt [SVariable JavaCode]
_ = [MS (JavaCode (Doc, Terminator))]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
[MS (r smt)] -> MS (r smt)
multi (Integer
-> SValue JavaCode
-> SVariable JavaCode
-> JavaCode ScopeData
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
Integer -> SValue r -> SVariable r -> r ScopeData -> MS (r smt)
arrayDec (Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ [SVariable JavaCode] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [SVariable JavaCode]
rets) SValue JavaCode
forall a. HasCallStack => a
undefined SVariable JavaCode
outputs JavaCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local
          MS (JavaCode (Doc, Terminator))
-> [MS (JavaCode (Doc, Terminator))]
-> [MS (JavaCode (Doc, Terminator))]
forall a. a -> [a] -> [a]
: Integer -> [SValue JavaCode] -> [MS (JavaCode (Doc, Terminator))]
assignArray Integer
0 ((SVariable JavaCode -> SValue JavaCode)
-> [SVariable JavaCode] -> [SValue JavaCode]
forall a b. (a -> b) -> [a] -> [b]
map SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf [SVariable JavaCode]
rets)
          [MS (JavaCode (Doc, Terminator))]
-> [MS (JavaCode (Doc, Terminator))]
-> [MS (JavaCode (Doc, Terminator))]
forall a. [a] -> [a] -> [a]
++ [SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r smt)
returnStmt (SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
outputs)])
        assignArray :: Integer -> [SValue JavaCode] -> [MS (JavaCode (Doc, Terminator))]
        assignArray :: Integer -> [SValue JavaCode] -> [MS (JavaCode (Doc, Terminator))]
assignArray Integer
_ [] = []
        assignArray Integer
c (SValue JavaCode
v:[SValue JavaCode]
vs) =
          (SValue JavaCode -> SValue JavaCode -> SVariable JavaCode
forall (r :: * -> *).
Array r =>
SValue r -> SValue r -> SVariable r
arrayElem (SVariable JavaCode -> SValue JavaCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable JavaCode
outputs) (Integer -> SValue JavaCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
c) SVariable JavaCode
-> SValue JavaCode -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= SValue JavaCode
v)
          MS (JavaCode (Doc, Terminator))
-> [MS (JavaCode (Doc, Terminator))]
-> [MS (JavaCode (Doc, Terminator))]
forall a. a -> [a] -> [a]
: Integer -> [SValue JavaCode] -> [MS (JavaCode (Doc, Terminator))]
assignArray (Integer
cInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1) [SValue JavaCode]
vs
        decls :: MS (JavaCode (Doc, Terminator))
decls = [MS (JavaCode (Doc, Terminator))]
-> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
[MS (r smt)] -> MS (r smt)
multi ([MS (JavaCode (Doc, Terminator))]
 -> MS (JavaCode (Doc, Terminator)))
-> [MS (JavaCode (Doc, Terminator))]
-> MS (JavaCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ (SVariable JavaCode -> MS (JavaCode (Doc, Terminator)))
-> [SVariable JavaCode] -> [MS (JavaCode (Doc, Terminator))]
forall a b. (a -> b) -> [a] -> [b]
map (SVariable JavaCode
-> JavaCode ScopeData -> MS (JavaCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> MS (r smt)
`varDec` JavaCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local) [SVariable JavaCode]
outs
        rets :: [SVariable JavaCode]
rets = [SVariable JavaCode]
both [SVariable JavaCode]
-> [SVariable JavaCode] -> [SVariable JavaCode]
forall a. [a] -> [a] -> [a]
++ [SVariable JavaCode]
outs

jDocInOut :: (RenderMethod r md) => ([SVariable r] ->
  [SVariable r] -> [SVariable r] -> MS (r Body) -> MS (r md)) -> String ->
  [(String, SVariable r)] -> [(String, SVariable r)] ->
  [(String, SVariable r)] -> MS (r Body) -> MS (r md)
jDocInOut :: forall (r :: * -> *) md.
RenderMethod r md =>
([SVariable r]
 -> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md))
-> String
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> MS (r Doc)
-> MS (r md)
jDocInOut [SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f String
desc [(String, SVariable r)]
is [] [] MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
forall (r :: * -> *) md.
RenderMethod r md =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
docFuncRepr FuncDocRenderer
functionDox String
desc (((String, SVariable r) -> String)
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> String
forall a b. (a, b) -> a
fst [(String, SVariable r)]
is) []
  ([SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f (((String, SVariable r) -> SVariable r)
-> [(String, SVariable r)] -> [SVariable r]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd [(String, SVariable r)]
is) [] [] MS (r Doc)
b)
jDocInOut [SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f String
desc [(String, SVariable r)]
is [(String, SVariable r)
o] [] MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
forall (r :: * -> *) md.
RenderMethod r md =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
docFuncRepr FuncDocRenderer
functionDox String
desc (((String, SVariable r) -> String)
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> String
forall a b. (a, b) -> a
fst [(String, SVariable r)]
is)
  [(String, SVariable r) -> String
forall a b. (a, b) -> a
fst (String, SVariable r)
o] ([SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f (((String, SVariable r) -> SVariable r)
-> [(String, SVariable r)] -> [SVariable r]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd [(String, SVariable r)]
is) [(String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd (String, SVariable r)
o] [] MS (r Doc)
b)
jDocInOut [SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f String
desc [(String, SVariable r)]
is [] [(String, SVariable r)
both] MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
forall (r :: * -> *) md.
RenderMethod r md =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
docFuncRepr FuncDocRenderer
functionDox String
desc (((String, SVariable r) -> String)
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> String
forall a b. (a, b) -> a
fst ((String, SVariable r)
both (String, SVariable r)
-> [(String, SVariable r)] -> [(String, SVariable r)]
forall a. a -> [a] -> [a]
:
  [(String, SVariable r)]
is)) [(String, SVariable r) -> String
forall a b. (a, b) -> a
fst (String, SVariable r)
both] ([SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f (((String, SVariable r) -> SVariable r)
-> [(String, SVariable r)] -> [SVariable r]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd [(String, SVariable r)]
is) [] [(String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd (String, SVariable r)
both] MS (r Doc)
b)
jDocInOut [SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f String
desc [(String, SVariable r)]
is [(String, SVariable r)]
os [(String, SVariable r)]
bs MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
forall (r :: * -> *) md.
RenderMethod r md =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r md) -> MS (r md)
docFuncRepr  FuncDocRenderer
functionDox String
desc (((String, SVariable r) -> String)
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> String
forall a b. (a, b) -> a
fst ([(String, SVariable r)] -> [String])
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> a -> b
$ [(String, SVariable r)]
bs [(String, SVariable r)]
-> [(String, SVariable r)] -> [(String, SVariable r)]
forall a. [a] -> [a] -> [a]
++ [(String, SVariable r)]
is)
  [String]
rets ([SVariable r]
-> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md)
f (((String, SVariable r) -> SVariable r)
-> [(String, SVariable r)] -> [SVariable r]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd [(String, SVariable r)]
is) (((String, SVariable r) -> SVariable r)
-> [(String, SVariable r)] -> [SVariable r]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd [(String, SVariable r)]
os) (((String, SVariable r) -> SVariable r)
-> [(String, SVariable r)] -> [SVariable r]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> SVariable r
forall a b. (a, b) -> b
snd [(String, SVariable r)]
bs) MS (r Doc)
b)
  where rets :: [String]
rets = String
"array containing the following values:" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ((String, SVariable r) -> String)
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> String
forall a b. (a, b) -> a
fst [(String, SVariable r)]
bs [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
          ((String, SVariable r) -> String)
-> [(String, SVariable r)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, SVariable r) -> String
forall a b. (a, b) -> a
fst [(String, SVariable r)]
os

jExtraClass
  :: (RenderClass r vis md svr, RenderVisibility r vis)
  => Label -> Maybe Label -> [CSStateVar r svr] -> [MS (r md)] -> [MS (r md)] -> CS (r Class)
jExtraClass :: forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, RenderVisibility r vis) =>
String
-> Maybe String
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
jExtraClass String
n = String
-> r vis
-> r Doc
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
forall (r :: * -> *) vis md svr.
RenderClass r vis md svr =>
String
-> r vis
-> r Doc
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
intClass String
n (VisibilityTag -> Doc -> r vis
forall (r :: * -> *) vis.
RenderVisibility r vis =>
VisibilityTag -> Doc -> r vis
visibilityFromData VisibilityTag
Priv Doc
empty) (r Doc
 -> [CSStateVar r svr] -> [MS (r md)] -> [MS (r md)] -> CS (r Doc))
-> (Maybe String -> r Doc)
-> Maybe String
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe String -> r Doc
forall (r :: * -> *) vis md svr.
RenderClass r vis md svr =>
Maybe String -> r Doc
inherit

addCallExcsCurrMod :: String -> VS ()
addCallExcsCurrMod :: String -> StateT ValueState Identity ()
addCallExcsCurrMod String
n = do
  String
cm <- LensLike'
  (Zoomed (StateT FileState Identity) String) ValueState FileState
-> StateT FileState Identity String
-> StateT ValueState Identity String
forall c.
LensLike'
  (Zoomed (StateT FileState Identity) c) ValueState FileState
-> StateT FileState Identity c -> StateT ValueState Identity c
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) String) ValueState FileState
(FileState -> Focusing Identity String FileState)
-> ValueState -> Focusing Identity String ValueState
Lens' ValueState FileState
lensVStoFS StateT FileState Identity String
getModuleName
  Map QualifiedName [ExceptionType]
mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ValueState -> ValueState)
-> ([ExceptionType] -> ValueState -> ValueState)
-> Maybe [ExceptionType]
-> ValueState
-> ValueState
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ValueState -> ValueState
forall a. a -> a
id [ExceptionType] -> ValueState -> ValueState
addExceptions (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
cm String
n) Map QualifiedName [ExceptionType]
mem))

addConstructorCallExcsCurrMod :: (UnRepr r TypeData) =>
  VS (r TypeData) -> (VS (r TypeData) -> SValue r) -> SValue r
addConstructorCallExcsCurrMod :: forall (r :: * -> *).
UnRepr r TypeData =>
VS (r TypeData) -> (VS (r TypeData) -> SValue r) -> SValue r
addConstructorCallExcsCurrMod VS (r TypeData)
ot VS (r TypeData) -> SValue r
f = do
  r TypeData
t <- VS (r TypeData)
ot
  String
cm <- LensLike'
  (Zoomed (StateT FileState Identity) String) ValueState FileState
-> StateT FileState Identity String
-> StateT ValueState Identity String
forall c.
LensLike'
  (Zoomed (StateT FileState Identity) c) ValueState FileState
-> StateT FileState Identity c -> StateT ValueState Identity c
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) String) ValueState FileState
(FileState -> Focusing Identity String FileState)
-> ValueState -> Focusing Identity String ValueState
Lens' ValueState FileState
lensVStoFS StateT FileState Identity String
getModuleName
  Map QualifiedName [ExceptionType]
mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
  let tp :: String
tp = r TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString r TypeData
t
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ValueState -> ValueState)
-> ([ExceptionType] -> ValueState -> ValueState)
-> Maybe [ExceptionType]
-> ValueState
-> ValueState
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ValueState -> ValueState
forall a. a -> a
id [ExceptionType] -> ValueState -> ValueState
addExceptions (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
cm String
tp) Map QualifiedName [ExceptionType]
mem))
  VS (r TypeData) -> SValue r
f (r TypeData -> VS (r TypeData)
forall a. a -> StateT ValueState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure r TypeData
t)