language-ocaml-0.1.31: lib/Language/OCaml/Definitions/Parsing/ASTHelper/Exp.hs
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
module Language.OCaml.Definitions.Parsing.ASTHelper.Exp
( CaseOpts(..)
, MkOpts(..)
, apply
, array
, assert
, attr
, case'
, coerce
, constant
, constraint
, construct
, extension
, field
, for
, fun
, function
, ident
, ifThenElse
, lazy
, let'
, letException
, letModule
, match
, mk
, new
, newType
, object
, open
, override
, pack
, poly
, record
, send
, sequence
, setField
, setInstVar
, try
, tuple
, unreachable
, variant
, while
) where
import Data.Default
import Prelude hiding (sequence)
import Language.OCaml.Definitions.Parsing.ASTHelper.Common
import Language.OCaml.Definitions.Parsing.ASTTypes
import Language.OCaml.Definitions.Parsing.ParseTree as ParseTree
import Language.OCaml.Definitions.Parsing.Location
attr :: Expression -> Attribute -> Expression
attr d a = d { pexpAttributes = pexpAttributes d ++ [a] }
-- oops! case is a reserved Haskell lexeme
case' :: CaseOpts -> Pattern -> Expression -> Case
case' (CaseOpts {..}) lhs rhs = Case
{ pcLHS = lhs
, pcGuard = guard
, pcRHS = rhs
}
data CaseOpts = CaseOpts
{ guard :: Maybe Expression
}
instance Default CaseOpts where
def = CaseOpts
{ guard = Nothing
}
mk :: MkOpts -> ExpressionDesc -> Expression
mk (MkOpts {..}) desc =
Expression
{ pexpDesc = desc
, pexpLoc = loc
, pexpAttributes = attrs
}
data MkOpts = MkOpts
{ attrs :: [Attribute]
, loc :: Location
}
instance Default MkOpts where
def = MkOpts
{ attrs = []
, loc = defaultLoc
}
ident :: MkOpts -> Loc Longident -> Expression
ident (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpIdent a
constant :: MkOpts -> ParseTree.Constant -> Expression
constant (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpConstant a
let' :: MkOpts -> RecFlag -> [ValueBinding] -> Expression -> Expression
let' (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpLet a b c
fun :: MkOpts -> ArgLabel -> Maybe Expression -> Pattern -> Expression -> Expression
fun (MkOpts {..}) a b c d = mk (def { loc, attrs }) $ PexpFun a b c d
function :: MkOpts -> [Case] -> Expression
function (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpFunction a
apply :: MkOpts -> Expression -> [(ArgLabel, Expression)] -> Expression
apply (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpApply a b
match :: MkOpts -> Expression -> [Case]-> Expression
match (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpMatch a b
try :: MkOpts -> Expression -> [Case] -> Expression
try (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpTry a b
tuple :: MkOpts -> [Expression] -> Expression
tuple (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpTuple a
construct :: MkOpts -> Loc Longident -> Maybe Expression -> Expression
construct (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpConstruct a b
variant :: MkOpts -> Label -> Maybe Expression -> Expression
variant (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpVariant a b
record :: MkOpts -> [(Loc Longident, Expression)] -> Maybe Expression -> Expression
record (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpRecord a b
field :: MkOpts -> Expression -> Loc Longident -> Expression
field (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpField a b
setField :: MkOpts -> Expression -> Loc Longident -> Expression -> Expression
setField (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpSetField a b c
array :: MkOpts -> [Expression] -> Expression
array (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpArray a
ifThenElse :: MkOpts -> Expression -> Expression -> Maybe Expression -> Expression
ifThenElse (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpIfThenElse a b c
sequence :: MkOpts -> Expression -> Expression -> Expression
sequence (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpSequence a b
while :: MkOpts -> Expression -> Expression -> Expression
while (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpWhile a b
for :: MkOpts -> Pattern -> Expression -> Expression -> DirectionFlag -> Expression -> Expression
for (MkOpts {..}) a b c d e = mk (def { loc, attrs }) $ PexpFor a b c d e
constraint :: MkOpts -> Expression -> CoreType -> Expression
constraint (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpConstraint a b
coerce :: MkOpts -> Expression -> Maybe CoreType -> CoreType -> Expression
coerce (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpCoerce a b c
send :: MkOpts -> Expression -> Loc Label -> Expression
send (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpSend a b
new :: MkOpts -> Loc Longident -> Expression
new (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpNew a
setInstVar :: MkOpts -> Loc Label -> Expression -> Expression
setInstVar (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpSetInstVar a b
override :: MkOpts -> [(Loc Label, Expression)] -> Expression
override (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpOverride a
letModule :: MkOpts -> Loc String -> ModuleExpr -> Expression -> Expression
letModule (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpLetModule a b c
letException :: MkOpts -> ExtensionConstructor -> Expression -> Expression
letException (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpLetException a b
assert :: MkOpts -> Expression -> Expression
assert (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpAssert a
lazy :: MkOpts -> Expression -> Expression
lazy (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpLazy a
poly :: MkOpts -> Expression -> Maybe CoreType -> Expression
poly (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpPoly a b
object :: MkOpts -> ClassStructure -> Expression
object (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpObject a
newType :: MkOpts -> Loc String -> Expression -> Expression
newType (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpNewType a b
pack :: MkOpts -> ModuleExpr -> Expression
pack (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpPack a
open :: MkOpts -> OverrideFlag -> Loc Longident -> Expression -> Expression
open (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpOpen a b c
extension :: MkOpts -> Extension -> Expression
extension (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpExtension a
unreachable :: MkOpts -> () -> Expression
unreachable (MkOpts {..}) () = mk (def { loc, attrs }) PexpUnreachable