{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ViewPatterns, ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Hint.Bracket(bracketHint) where
import Hint.Type(DeclHint,Idea(..),rawIdea,warn,suggest,Severity(..),toRefactSrcSpan,toSSA)
import Data.Data
import Data.List.Extra
import Data.Generics.Uniplate.DataOnly
import Refact.Types
import GHC.Hs
import GHC.Utils.Outputable
import GHC.Types.SrcLoc
import GHC.Util
import Language.Haskell.GhclibParserEx.GHC.Hs.Expr
import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
import Language.Haskell.GhclibParserEx.GHC.Hs.Pat
bracketHint :: DeclHint
bracketHint :: DeclHint
bracketHint Scope
_ ModuleEx
_ LHsDecl GhcPs
x =
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x -> forall a.
(Data a, Outputable a, Brackets (LocatedA a)) =>
(LocatedA a -> String)
-> (Maybe (LocatedA a) -> LocatedA a -> Bool)
-> Bool
-> LocatedA a
-> [Idea]
bracket LHsExpr GhcPs -> String
prettyExpr Maybe (LHsExpr GhcPs) -> LHsExpr GhcPs -> Bool
isPartialAtom Bool
True GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x forall a. [a] -> [a] -> [a]
++ LHsExpr GhcPs -> [Idea]
dollar GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) (forall from to. Biplate from to => from -> [to]
childrenBi (forall from to. Biplate from to => (to -> to) -> from -> from
descendBi HsDecl GhcPs -> HsDecl GhcPs
splices forall a b. (a -> b) -> a -> b
$ forall from to. Biplate from to => (to -> to) -> from -> from
descendBi AnnDecl GhcPs -> AnnDecl GhcPs
annotations LHsDecl GhcPs
x) :: [LHsExpr GhcPs]) forall a. [a] -> [a] -> [a]
++
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (forall a.
(Data a, Outputable a, Brackets (LocatedA a)) =>
(LocatedA a -> String)
-> (Maybe (LocatedA a) -> LocatedA a -> Bool)
-> Bool
-> LocatedA a
-> [Idea]
bracket forall a. Outputable a => a -> String
unsafePrettyPrint (\Maybe (LocatedA (BangType GhcPs))
_ LocatedA (BangType GhcPs)
_ -> Bool
False) Bool
False) (forall from to. Biplate from to => from -> [to]
childrenBi (GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsDecl GhcPs)
-> GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsDecl GhcPs)
preprocess LHsDecl GhcPs
x) :: [LHsType GhcPs]) forall a. [a] -> [a] -> [a]
++
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (forall a.
(Data a, Outputable a, Brackets (LocatedA a)) =>
(LocatedA a -> String)
-> (Maybe (LocatedA a) -> LocatedA a -> Bool)
-> Bool
-> LocatedA a
-> [Idea]
bracket forall a. Outputable a => a -> String
unsafePrettyPrint (\Maybe (LocatedA (Pat GhcPs))
_ LocatedA (Pat GhcPs)
_ -> Bool
False) Bool
False) (forall from to. Biplate from to => from -> [to]
childrenBi LHsDecl GhcPs
x :: [LPat GhcPs]) forall a. [a] -> [a] -> [a]
++
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap LConDeclField GhcPs -> [Idea]
fieldDecl (forall from to. Biplate from to => from -> [to]
childrenBi LHsDecl GhcPs
x)
where
preprocess :: GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsDecl GhcPs)
-> GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsDecl GhcPs)
preprocess = forall from to. Biplate from to => (to -> to) -> from -> from
transformBi LHsContext GhcPs -> LHsContext GhcPs
removeSingleAtomConstrCtxs
where
removeSingleAtomConstrCtxs :: LHsContext GhcPs -> LHsContext GhcPs
removeSingleAtomConstrCtxs :: LHsContext GhcPs -> LHsContext GhcPs
removeSingleAtomConstrCtxs = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a -> b) -> a -> b
$ \case
[LocatedA (BangType GhcPs)
ty] | forall a. Brackets a => a -> Bool
isAtom LocatedA (BangType GhcPs)
ty -> []
[LocatedA (BangType GhcPs)]
tys -> [LocatedA (BangType GhcPs)]
tys
annotations :: AnnDecl GhcPs -> AnnDecl GhcPs
annotations :: AnnDecl GhcPs -> AnnDecl GhcPs
annotations= forall from to. Biplate from to => (to -> to) -> from -> from
descendBi forall a b. (a -> b) -> a -> b
$ \GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x -> case (GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x :: LHsExpr GhcPs) of
L SrcSpanAnn' (EpAnn AnnListItem)
_ (HsPar XPar GhcPs
_ LHsToken "(" GhcPs
_ LHsExpr GhcPs
x LHsToken ")" GhcPs
_) -> LHsExpr GhcPs
x
LHsExpr GhcPs
x -> LHsExpr GhcPs
x
splices :: HsDecl GhcPs -> HsDecl GhcPs
splices :: HsDecl GhcPs -> HsDecl GhcPs
splices (SpliceD XSpliceD GhcPs
a SpliceDecl GhcPs
x) = forall p. XSpliceD p -> SpliceDecl p -> HsDecl p
SpliceD XSpliceD GhcPs
a forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> b -> a -> c
flip forall from to. Biplate from to => (to -> to) -> from -> from
descendBi SpliceDecl GhcPs
x forall a b. (a -> b) -> a -> b
$ \GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x -> case (GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x :: LHsExpr GhcPs) of
L SrcSpanAnn' (EpAnn AnnListItem)
_ (HsPar XPar GhcPs
_ LHsToken "(" GhcPs
_ LHsExpr GhcPs
x LHsToken ")" GhcPs
_) -> LHsExpr GhcPs
x
LHsExpr GhcPs
x -> LHsExpr GhcPs
x
splices HsDecl GhcPs
x = HsDecl GhcPs
x
prettyExpr :: LHsExpr GhcPs -> String
prettyExpr :: LHsExpr GhcPs -> String
prettyExpr s :: LHsExpr GhcPs
s@(L SrcSpanAnn' (EpAnn AnnListItem)
_ SectionL{}) = forall a. Outputable a => a -> String
unsafePrettyPrint (forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar LHsExpr GhcPs
s :: LHsExpr GhcPs)
prettyExpr s :: LHsExpr GhcPs
s@(L SrcSpanAnn' (EpAnn AnnListItem)
_ SectionR{}) = forall a. Outputable a => a -> String
unsafePrettyPrint (forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar LHsExpr GhcPs
s :: LHsExpr GhcPs)
prettyExpr LHsExpr GhcPs
x = forall a. Outputable a => a -> String
unsafePrettyPrint LHsExpr GhcPs
x
remParens' :: Brackets (LocatedA a) => LocatedA a -> Maybe (LocatedA a)
remParens' :: forall a. Brackets (LocatedA a) => LocatedA a -> Maybe (LocatedA a)
remParens' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a}. Brackets a => a -> a
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Brackets a => a -> Maybe a
remParen
where
go :: a -> a
go a
e = forall b a. b -> (a -> b) -> Maybe a -> b
maybe a
e a -> a
go (forall a. Brackets a => a -> Maybe a
remParen a
e)
isPartialAtom :: Maybe (LHsExpr GhcPs) -> LHsExpr GhcPs -> Bool
isPartialAtom :: Maybe (LHsExpr GhcPs) -> LHsExpr GhcPs -> Bool
isPartialAtom Maybe (LHsExpr GhcPs)
_ (L SrcSpanAnn' (EpAnn AnnListItem)
_ (HsUntypedSplice XUntypedSplice GhcPs
_ HsUntypedSpliceExpr{})) = Bool
True
isPartialAtom (Just (L SrcSpanAnn' (EpAnn AnnListItem)
_ HsUntypedSplice{})) LHsExpr GhcPs
_ = Bool
True
isPartialAtom Maybe (LHsExpr GhcPs)
_ LHsExpr GhcPs
x = LHsExpr GhcPs -> Bool
isRecConstr LHsExpr GhcPs
x Bool -> Bool -> Bool
|| LHsExpr GhcPs -> Bool
isRecUpdate LHsExpr GhcPs
x
bracket :: forall a . (Data a, Outputable a, Brackets (LocatedA a)) => (LocatedA a -> String) -> (Maybe (LocatedA a) -> LocatedA a -> Bool) -> Bool -> LocatedA a -> [Idea]
bracket :: forall a.
(Data a, Outputable a, Brackets (LocatedA a)) =>
(LocatedA a -> String)
-> (Maybe (LocatedA a) -> LocatedA a -> Bool)
-> Bool
-> LocatedA a
-> [Idea]
bracket LocatedA a -> String
pretty Maybe (LocatedA a) -> LocatedA a -> Bool
isPartialAtom Bool
root = (Data a, Outputable a, Brackets (LocatedA a)) =>
Maybe (Int, LocatedA a, LocatedA a -> LocatedA a)
-> LocatedA a -> [Idea]
f forall a. Maybe a
Nothing
where
msg :: String
msg = String
"Redundant bracket"
f :: (Data a, Outputable a, Brackets (LocatedA a)) => Maybe (Int, LocatedA a , LocatedA a -> LocatedA a) -> LocatedA a -> [Idea]
f :: (Data a, Outputable a, Brackets (LocatedA a)) =>
Maybe (Int, LocatedA a, LocatedA a -> LocatedA a)
-> LocatedA a -> [Idea]
f Maybe (Int, LocatedA a, LocatedA a -> LocatedA a)
Nothing o :: LocatedA a
o@(forall a. Brackets (LocatedA a) => LocatedA a -> Maybe (LocatedA a)
remParens' -> Just LocatedA a
x)
| Bool
root Bool -> Bool -> Bool
|| forall a. Brackets a => a -> Bool
isAtom LocatedA a
x
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ Maybe (LocatedA a) -> LocatedA a -> Bool
isPartialAtom forall a. Maybe a
Nothing LocatedA a
x =
(if forall a. Brackets a => a -> Bool
isAtom LocatedA a
x then forall a b.
(Outputable a, Outputable b, Brackets (LocatedA b)) =>
String -> LocatedA a -> LocatedA b -> Idea
bracketError else forall {e} {e} {a} {a}.
(Outputable e, Outputable e, Brackets (LocatedAn a e)) =>
String -> LocatedAn a e -> LocatedAn a e -> Idea
bracketWarning) String
msg LocatedA a
o LocatedA a
x forall a. a -> [a] -> [a]
: (Data a, Outputable a, Brackets (LocatedA a)) =>
LocatedA a -> [Idea]
g LocatedA a
x
f (Just (Int
_, LocatedA a
p, LocatedA a -> LocatedA a
_)) o :: LocatedA a
o@(forall a. Brackets (LocatedA a) => LocatedA a -> Maybe (LocatedA a)
remParens' -> Just LocatedA a
x)
| forall a. Brackets a => a -> Bool
isAtom LocatedA a
x
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ Maybe (LocatedA a) -> LocatedA a -> Bool
isPartialAtom (forall a. a -> Maybe a
Just LocatedA a
p) LocatedA a
x =
forall a b.
(Outputable a, Outputable b, Brackets (LocatedA b)) =>
String -> LocatedA a -> LocatedA b -> Idea
bracketError String
msg LocatedA a
o LocatedA a
x forall a. a -> [a] -> [a]
: (Data a, Outputable a, Brackets (LocatedA a)) =>
LocatedA a -> [Idea]
g LocatedA a
x
f (Just (Int
i, LocatedA a
o, LocatedA a -> LocatedA a
gen)) v :: LocatedA a
v@(forall a. Brackets (LocatedA a) => LocatedA a -> Maybe (LocatedA a)
remParens' -> Just LocatedA a
x)
| Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Brackets a => Int -> a -> a -> Bool
needBracket Int
i LocatedA a
o LocatedA a
x
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ Maybe (LocatedA a) -> LocatedA a -> Bool
isPartialAtom (forall a. a -> Maybe a
Just LocatedA a
o) LocatedA a
x
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any LPat GhcPs -> Bool
isSplicePat forall a b. (a -> b) -> a -> b
$ forall from to. Biplate from to => from -> [to]
universeBi LocatedA a
o
= Severity
-> String
-> SrcSpan
-> String
-> Maybe String
-> [Note]
-> [Refactoring SrcSpan]
-> Idea
rawIdea Severity
Suggestion String
msg (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
getLocA LocatedA a
v) (LocatedA a -> String
pretty LocatedA a
o) (forall a. a -> Maybe a
Just (LocatedA a -> String
pretty (LocatedA a -> LocatedA a
gen LocatedA a
x))) [] [Refactoring SrcSpan
r] forall a. a -> [a] -> [a]
: (Data a, Outputable a, Brackets (LocatedA a)) =>
LocatedA a -> [Idea]
g LocatedA a
x
where
typ :: RType
typ = forall a. Brackets a => a -> RType
findType LocatedA a
v
r :: Refactoring SrcSpan
r = forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace RType
typ (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LocatedA a
v) [(String
"x", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LocatedA a
x)] String
"x"
f Maybe (Int, LocatedA a, LocatedA a -> LocatedA a)
_ LocatedA a
x = (Data a, Outputable a, Brackets (LocatedA a)) =>
LocatedA a -> [Idea]
g LocatedA a
x
g :: (Data a, Outputable a, Brackets (LocatedA a)) => LocatedA a -> [Idea]
g :: (Data a, Outputable a, Brackets (LocatedA a)) =>
LocatedA a -> [Idea]
g LocatedA a
o = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [(Data a, Outputable a, Brackets (LocatedA a)) =>
Maybe (Int, LocatedA a, LocatedA a -> LocatedA a)
-> LocatedA a -> [Idea]
f (forall a. a -> Maybe a
Just (Int
i, LocatedA a
o, LocatedA a -> LocatedA a
gen)) LocatedA a
x | (Int
i, (LocatedA a
x, LocatedA a -> LocatedA a
gen)) <- forall a b. Enum a => a -> [b] -> [(a, b)]
zipFrom Int
0 forall a b. (a -> b) -> a -> b
$ forall on. Uniplate on => on -> [(on, on -> on)]
holes LocatedA a
o]
bracketWarning :: String -> LocatedAn a e -> LocatedAn a e -> Idea
bracketWarning String
msg LocatedAn a e
o LocatedAn a e
x =
forall a b.
(Outputable a, Outputable b) =>
String -> Located a -> Located b -> [Refactoring SrcSpan] -> Idea
suggest String
msg (forall a e. LocatedAn a e -> Located e
reLoc LocatedAn a e
o) (forall a e. LocatedAn a e -> Located e
reLoc LocatedAn a e
x) [forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace (forall a. Brackets a => a -> RType
findType LocatedAn a e
x) (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LocatedAn a e
o) [(String
"x", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LocatedAn a e
x)] String
"x"]
bracketError :: (Outputable a, Outputable b, Brackets (LocatedA b)) => String -> LocatedA a -> LocatedA b -> Idea
bracketError :: forall a b.
(Outputable a, Outputable b, Brackets (LocatedA b)) =>
String -> LocatedA a -> LocatedA b -> Idea
bracketError String
msg LocatedA a
o LocatedA b
x =
forall a b.
(Outputable a, Outputable b) =>
String -> Located a -> Located b -> [Refactoring SrcSpan] -> Idea
warn String
msg (forall a e. LocatedAn a e -> Located e
reLoc LocatedA a
o) (forall a e. LocatedAn a e -> Located e
reLoc LocatedA b
x) [forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace (forall a. Brackets a => a -> RType
findType LocatedA b
x) (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LocatedA a
o) [(String
"x", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LocatedA b
x)] String
"x"]
fieldDecl :: LConDeclField GhcPs -> [Idea]
fieldDecl :: LConDeclField GhcPs -> [Idea]
fieldDecl o :: LConDeclField GhcPs
o@(L SrcSpanAnn' (EpAnn AnnListItem)
loc f :: ConDeclField GhcPs
f@ConDeclField{cd_fld_type :: forall pass. ConDeclField pass -> LBangType pass
cd_fld_type=v :: XRec GhcPs (BangType GhcPs)
v@(L SrcSpanAnn' (EpAnn AnnListItem)
l (HsParTy XParTy GhcPs
_ XRec GhcPs (BangType GhcPs)
c))}) =
let r :: LConDeclField GhcPs
r = forall l e. l -> e -> GenLocated l e
L SrcSpanAnn' (EpAnn AnnListItem)
loc (ConDeclField GhcPs
f{cd_fld_type :: XRec GhcPs (BangType GhcPs)
cd_fld_type=XRec GhcPs (BangType GhcPs)
c}) :: LConDeclField GhcPs in
[Severity
-> String
-> SrcSpan
-> String
-> Maybe String
-> [Note]
-> [Refactoring SrcSpan]
-> Idea
rawIdea Severity
Suggestion String
"Redundant bracket" (forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' (EpAnn AnnListItem)
l)
(SDoc -> String
showSDocUnsafe forall a b. (a -> b) -> a -> b
$ forall {name} {l}.
(Outputable (XRec name (FieldOcc name)),
Outputable (XRec name (BangType name)),
Outputable (XXConDeclField name)) =>
GenLocated l (ConDeclField name) -> SDoc
ppr_fld LConDeclField GhcPs
o)
(forall a. a -> Maybe a
Just (SDoc -> String
showSDocUnsafe forall a b. (a -> b) -> a -> b
$ forall {name} {l}.
(Outputable (XRec name (FieldOcc name)),
Outputable (XRec name (BangType name)),
Outputable (XXConDeclField name)) =>
GenLocated l (ConDeclField name) -> SDoc
ppr_fld LConDeclField GhcPs
r))
[]
[forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace RType
Type (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA XRec GhcPs (BangType GhcPs)
v) [(String
"x", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA XRec GhcPs (BangType GhcPs)
c)] String
"x"]]
where
ppr_fld :: GenLocated l (ConDeclField name) -> SDoc
ppr_fld (L l
_ ConDeclField { cd_fld_names :: forall pass. ConDeclField pass -> [LFieldOcc pass]
cd_fld_names = [XRec name (FieldOcc name)]
ns, cd_fld_type :: forall pass. ConDeclField pass -> LBangType pass
cd_fld_type = XRec name (BangType name)
ty, cd_fld_doc :: forall pass. ConDeclField pass -> Maybe (LHsDoc pass)
cd_fld_doc = Maybe (LHsDoc name)
doc })
= forall name. Maybe (LHsDoc name) -> SDoc -> SDoc
pprMaybeWithDoc Maybe (LHsDoc name)
doc (forall {a}. Outputable a => [a] -> SDoc
ppr_names [XRec name (FieldOcc name)]
ns forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc
dcolon forall doc. IsLine doc => doc -> doc -> doc
<+> forall a. Outputable a => a -> SDoc
ppr XRec name (BangType name)
ty)
ppr_fld (L l
_ (XConDeclField XXConDeclField name
x)) = forall a. Outputable a => a -> SDoc
ppr XXConDeclField name
x
ppr_names :: [a] -> SDoc
ppr_names [a
n] = forall a. Outputable a => a -> SDoc
ppr a
n
ppr_names [a]
ns = forall doc. IsLine doc => [doc] -> doc
sep (forall doc. IsLine doc => doc -> [doc] -> [doc]
punctuate forall doc. IsLine doc => doc
comma (forall a b. (a -> b) -> [a] -> [b]
map forall a. Outputable a => a -> SDoc
ppr [a]
ns))
fieldDecl LConDeclField GhcPs
_ = []
dollar :: LHsExpr GhcPs -> [Idea]
dollar :: LHsExpr GhcPs -> [Idea]
dollar = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
-> [Idea]
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall on. Uniplate on => on -> [on]
universe
where
f :: GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
-> [Idea]
f GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x = [ (forall a b.
(Outputable a, Outputable b) =>
String -> Located a -> Located b -> [Refactoring SrcSpan] -> Idea
suggest String
"Redundant $" (forall a e. LocatedAn a e -> Located e
reLoc GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) (forall a e. LocatedAn a e -> Located e
reLoc LHsExpr GhcPs
y) [Refactoring SrcSpan
r]){ideaSpan :: SrcSpan
ideaSpan = forall a. SrcSpanAnn' a -> SrcSpan
locA (forall l e. GenLocated l e -> l
getLoc LHsExpr GhcPs
d)} | L SrcSpanAnn' (EpAnn AnnListItem)
_ (OpApp XOpApp GhcPs
_ LHsExpr GhcPs
a LHsExpr GhcPs
d LHsExpr GhcPs
b) <- [GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x], LHsExpr GhcPs -> Bool
isDol LHsExpr GhcPs
d
, let y :: LHsExpr GhcPs
y = forall a an. a -> LocatedAn an a
noLocA (forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp forall ann. EpAnn ann
EpAnnNotUsed LHsExpr GhcPs
a LHsExpr GhcPs
b) :: LHsExpr GhcPs
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Brackets a => Int -> a -> a -> Bool
needBracket Int
0 LHsExpr GhcPs
y LHsExpr GhcPs
a
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Brackets a => Int -> a -> a -> Bool
needBracket Int
1 LHsExpr GhcPs
y LHsExpr GhcPs
b
, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ Maybe (LHsExpr GhcPs) -> LHsExpr GhcPs -> Bool
isPartialAtom (forall a. a -> Maybe a
Just GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) LHsExpr GhcPs
b
, let r :: Refactoring SrcSpan
r = forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace RType
Expr (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) [(String
"a", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
a), (String
"b", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
b)] String
"a b"]
forall a. [a] -> [a] -> [a]
++
[ forall a b.
(Outputable a, Outputable b) =>
String -> Located a -> Located b -> [Refactoring SrcSpan] -> Idea
suggest String
"Move brackets to avoid $" (forall a e. LocatedAn a e -> Located e
reLoc GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) (forall a e. LocatedAn a e -> Located e
reLoc (GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
-> GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
t GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
y)) [Refactoring SrcSpan
r]
|(GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
-> GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
t, e :: GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
e@(L SrcSpanAnn' (EpAnn AnnListItem)
_ (HsPar XPar GhcPs
_ LHsToken "(" GhcPs
_ (L SrcSpanAnn' (EpAnn AnnListItem)
_ (OpApp XOpApp GhcPs
_ LHsExpr GhcPs
a1 LHsExpr GhcPs
op1 LHsExpr GhcPs
a2)) LHsToken ")" GhcPs
_))) <- LHsExpr GhcPs -> [(LHsExpr GhcPs -> LHsExpr GhcPs, LHsExpr GhcPs)]
splitInfix GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x
, LHsExpr GhcPs -> Bool
isDol LHsExpr GhcPs
op1
, LHsExpr GhcPs -> Bool
isVar LHsExpr GhcPs
a1 Bool -> Bool -> Bool
|| LHsExpr GhcPs -> Bool
isApp LHsExpr GhcPs
a1 Bool -> Bool -> Bool
|| LHsExpr GhcPs -> Bool
isPar LHsExpr GhcPs
a1, Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Brackets a => a -> Bool
isAtom LHsExpr GhcPs
a2
, LHsExpr GhcPs -> String
varToStr LHsExpr GhcPs
a1 forall a. Eq a => a -> a -> Bool
/= String
"select"
, let y :: GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
y = forall a an. a -> LocatedAn an a
noLocA forall a b. (a -> b) -> a -> b
$ forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp forall ann. EpAnn ann
EpAnnNotUsed LHsExpr GhcPs
a1 (forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar LHsExpr GhcPs
a2)
, let r :: Refactoring SrcSpan
r = forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace RType
Expr (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
e) [(String
"a", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
a1), (String
"b", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
a2)] String
"a (b)" ]
forall a. [a] -> [a] -> [a]
++
[ (forall a b.
(Outputable a, Outputable b) =>
String -> Located a -> Located b -> [Refactoring SrcSpan] -> Idea
suggest String
"Redundant bracket" (forall a e. LocatedAn a e -> Located e
reLoc GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) (forall a e. LocatedAn a e -> Located e
reLoc LHsExpr GhcPs
y) [Refactoring SrcSpan
r]){ideaSpan :: SrcSpan
ideaSpan = forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' (EpAnn AnnListItem)
locPar}
| L SrcSpanAnn' (EpAnn AnnListItem)
_ (OpApp XOpApp GhcPs
_ (L SrcSpanAnn' (EpAnn AnnListItem)
locPar (HsPar XPar GhcPs
_ LHsToken "(" GhcPs
_ o1 :: LHsExpr GhcPs
o1@(L SrcSpanAnn' (EpAnn AnnListItem)
locNoPar (OpApp XOpApp GhcPs
_ LHsExpr GhcPs
_ (LHsExpr GhcPs -> Bool
isDot -> Bool
True) LHsExpr GhcPs
_)) LHsToken ")" GhcPs
_)) LHsExpr GhcPs
o2 LHsExpr GhcPs
v3) <- [GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x], LHsExpr GhcPs -> String
varToStr LHsExpr GhcPs
o2 forall a. Eq a => a -> a -> Bool
== String
"<$>"
, let y :: LHsExpr GhcPs
y = forall a an. a -> LocatedAn an a
noLocA (forall p.
XOpApp p -> LHsExpr p -> LHsExpr p -> LHsExpr p -> HsExpr p
OpApp forall ann. EpAnn ann
EpAnnNotUsed LHsExpr GhcPs
o1 LHsExpr GhcPs
o2 LHsExpr GhcPs
v3) :: LHsExpr GhcPs
, let r :: Refactoring SrcSpan
r = forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace RType
Expr (SrcSpan -> SrcSpan
toRefactSrcSpan (forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' (EpAnn AnnListItem)
locPar)) [(String
"a", SrcSpan -> SrcSpan
toRefactSrcSpan (forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' (EpAnn AnnListItem)
locNoPar))] String
"a"]
forall a. [a] -> [a] -> [a]
++
[ forall a b.
(Outputable a, Outputable b) =>
String -> Located a -> Located b -> [Refactoring SrcSpan] -> Idea
suggest String
"Redundant section" (forall a e. LocatedAn a e -> Located e
reLoc GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) (forall a e. LocatedAn a e -> Located e
reLoc LHsExpr GhcPs
y) [Refactoring SrcSpan
r]
| L SrcSpanAnn' (EpAnn AnnListItem)
_ (HsApp XApp GhcPs
_ (L SrcSpanAnn' (EpAnn AnnListItem)
_ (HsPar XPar GhcPs
_ LHsToken "(" GhcPs
_ (L SrcSpanAnn' (EpAnn AnnListItem)
_ (SectionL XSectionL GhcPs
_ LHsExpr GhcPs
a LHsExpr GhcPs
b)) LHsToken ")" GhcPs
_)) LHsExpr GhcPs
c) <- [GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x]
, let y :: LHsExpr GhcPs
y = forall a an. a -> LocatedAn an a
noLocA forall a b. (a -> b) -> a -> b
$ forall p.
XOpApp p -> LHsExpr p -> LHsExpr p -> LHsExpr p -> HsExpr p
OpApp forall ann. EpAnn ann
EpAnnNotUsed LHsExpr GhcPs
a LHsExpr GhcPs
b LHsExpr GhcPs
c :: LHsExpr GhcPs
, let r :: Refactoring SrcSpan
r = forall a. RType -> a -> [(String, a)] -> String -> Refactoring a
Replace RType
Expr (forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA GenLocated (SrcSpanAnn' (EpAnn AnnListItem)) (HsExpr GhcPs)
x) [(String
"x", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
a), (String
"op", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
b), (String
"y", forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
toSSA LHsExpr GhcPs
c)] String
"x op y"]
splitInfix :: LHsExpr GhcPs -> [(LHsExpr GhcPs -> LHsExpr GhcPs, LHsExpr GhcPs)]
splitInfix :: LHsExpr GhcPs -> [(LHsExpr GhcPs -> LHsExpr GhcPs, LHsExpr GhcPs)]
splitInfix (L SrcSpanAnn' (EpAnn AnnListItem)
l (OpApp XOpApp GhcPs
_ LHsExpr GhcPs
lhs LHsExpr GhcPs
op LHsExpr GhcPs
rhs)) =
[(forall l e. l -> e -> GenLocated l e
L SrcSpanAnn' (EpAnn AnnListItem)
l forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall p.
XOpApp p -> LHsExpr p -> LHsExpr p -> LHsExpr p -> HsExpr p
OpApp forall ann. EpAnn ann
EpAnnNotUsed LHsExpr GhcPs
lhs LHsExpr GhcPs
op, LHsExpr GhcPs
rhs), (\LHsExpr GhcPs
lhs -> forall l e. l -> e -> GenLocated l e
L SrcSpanAnn' (EpAnn AnnListItem)
l (forall p.
XOpApp p -> LHsExpr p -> LHsExpr p -> LHsExpr p -> HsExpr p
OpApp forall ann. EpAnn ann
EpAnnNotUsed LHsExpr GhcPs
lhs LHsExpr GhcPs
op LHsExpr GhcPs
rhs), LHsExpr GhcPs
lhs)]
splitInfix LHsExpr GhcPs
_ = []