language-ocaml-0.1.31: lib/Language/OCaml/PrettyPrinter/ExpressionDesc.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UndecidableInstances #-}
module Language.OCaml.PrettyPrinter.ExpressionDesc
( expressionDescPP
) where
import Data.Text.Prettyprint.Doc
import Language.OCaml.Definitions.Parsing.ParseTree
import Language.OCaml.PrettyPrinter.ArgLabel ()
import Language.OCaml.PrettyPrinter.Case ()
import Language.OCaml.PrettyPrinter.Constant ()
import Language.OCaml.PrettyPrinter.Loc ()
import Language.OCaml.PrettyPrinter.Longident ()
import Language.OCaml.PrettyPrinter.RecFlag ()
import Language.OCaml.PrettyPrinter.ValueBinding ()
expressionDescPP :: (Pretty Case, Pretty Expression) => ExpressionDesc -> Doc a
expressionDescPP = \case
PexpApply e l ->
encloseSep "" "" " " $ pretty e : map (\ (_lbl, expr) -> prettyExpr expr) l -- FIXME: lbl
where
prettyExpr expr@(Expression { pexpDesc }) = case pexpDesc of
PexpApply _ _ -> parens $ pretty expr
_ -> pretty expr
PexpArray _ -> error "TODO"
PexpAssert _ -> error "TODO"
PexpCoerce _ _ _ -> error "TODO"
PexpConstant c -> pretty c
PexpConstraint _ _ -> error "TODO"
PexpConstruct i e ->
-- NOTE: adding space so as to print `Some x` rather than `Somex` when parentheses are omitted
fillCat [ pretty i, space, pretty e ]
PexpExtension _e -> error "TODO"
PexpField _e _i -> error "TODO"
PexpFor _ _ _ _ _ -> error "TODO"
PexpFun _argLabel _ patt expr -> fillCat [ "fun ", pretty patt, " -> ", pretty expr ]
PexpFunction l -> case l of
[] -> error "TODO"
[x] -> fillSep [ "function", pretty x ]
_ -> fillSep [ "function", nest 2 $ line <> (vcat $ map pretty l) ]
PexpIdent i -> pretty i
PexpIfThenElse _e1 _e2 _e3 -> error "TODO"
PexpLazy _ -> error "TODO"
PexpLet r l e -> case l of
[] -> error "TODO"
[x] -> fillCat [ "let ", pretty r, pretty x, " in ", pretty e ]
_ -> error "TODO"
PexpLetException _ _ -> error "TODO"
PexpLetModule _ _ _ -> error "TODO"
PexpMatch discriminee branches -> vcat $ pretty discriminee : map pretty branches
PexpNew _ -> error "TODO"
PexpNewType _ _ -> error "TODO"
PexpObject _ -> error "TODO"
PexpOpen _ _ _ -> error "TODO"
PexpOverride _ -> error "TODO"
PexpPack _ -> error "TODO"
PexpPoly _ _ -> error "TODO"
PexpRecord _ _ -> error "TODO"
PexpSend _ _ -> error "TODO"
PexpSequence _e1 _e2 -> error "TODO"
PexpSetField _ _ _ -> error "TODO"
PexpSetInstVar _ _ -> error "TODO"
PexpTry _ _ -> error "TODO"
PexpTuple l -> encloseSep "(" ")" ", " (map pretty l)
PexpUnreachable -> error "TODO"
PexpVariant _ _ -> error "TODO"
PexpWhile _ _ -> error "TODO"
instance Pretty Expression => Pretty ExpressionDesc where
pretty = expressionDescPP