-- Copyright 2019 Google LLC
--
-- Use of this source code is governed by a BSD-style
-- license that can be found in the LICENSE file or at
-- https://developers.google.com/open-source/licenses/bsd

{-# LANGUAGE CPP #-}
module GHC.SourceGen.Expr.Internal where

import GHC.Hs.Expr
import SrcLoc (Located, unLoc)

import GHC.SourceGen.Lit.Internal
import GHC.SourceGen.Syntax.Internal

parenthesizeExprForApp, parenthesizeExprForOp
    :: Located HsExpr' -> Located HsExpr'
parenthesizeExprForApp :: Located HsExpr' -> Located HsExpr'
parenthesizeExprForApp Located HsExpr'
e 
    | HsExpr' -> Bool
needsExprForApp (Located HsExpr' -> SrcSpanLess (Located HsExpr')
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located HsExpr'
e) = Located HsExpr' -> Located HsExpr'
parExpr Located HsExpr'
e
    | Bool
otherwise = Located HsExpr'
e
parenthesizeExprForOp :: Located HsExpr' -> Located HsExpr'
parenthesizeExprForOp Located HsExpr'
e
    | HsExpr' -> Bool
needsExprForOp (Located HsExpr' -> SrcSpanLess (Located HsExpr')
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located HsExpr'
e) = Located HsExpr' -> Located HsExpr'
parExpr Located HsExpr'
e
    | Bool
otherwise = Located HsExpr'
e

parExpr :: Located HsExpr' -> Located HsExpr'
parExpr :: Located HsExpr' -> Located HsExpr'
parExpr = HsExpr' -> Located HsExpr'
forall e. e -> Located e
builtLoc (HsExpr' -> Located HsExpr')
-> (Located HsExpr' -> HsExpr')
-> Located HsExpr'
-> Located HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NoExtField -> Located HsExpr' -> HsExpr')
-> Located HsExpr' -> HsExpr'
forall a. (NoExtField -> a) -> a
noExt NoExtField -> Located HsExpr' -> HsExpr'
forall p. XPar p -> LHsExpr p -> HsExpr p
HsPar

#if MIN_VERSION_ghc(8,6,0)
#define WILD_EXT _
#else
#define WILD_EXT
#endif

needsExprForApp, needsExprForOp :: HsExpr' -> Bool
needsExprForOp :: HsExpr' -> Bool
needsExprForOp HsExpr'
e = case HsExpr'
e of
    -- TODO: more care for literals; only needed for negative numbers?
    HsLit WILD_EXT l -> litNeedsParen l
    HsOverLit WILD_EXT l -> overLitNeedsParen l
    HsLam{} -> Bool
True
    HsLamCase{} -> Bool
True
    OpApp{} -> Bool
True
    NegApp{} -> Bool
True
    HsCase{} -> Bool
True
    HsIf{} -> Bool
True
    HsMultiIf{} -> Bool
True
    HsLet{} -> Bool
True
    HsDo{} -> Bool
True
    ExprWithTySig{} -> Bool
True
    HsExpr'
_ -> Bool
False
needsExprForApp :: HsExpr' -> Bool
needsExprForApp HsExpr'
e = case HsExpr'
e of
    HsApp{} -> Bool
True
    HsAppType{} -> Bool
True
    HsStatic{} -> Bool
True
    HsExpr'
_ -> HsExpr' -> Bool
needsExprForOp HsExpr'
e