{-# LANGUAGE LambdaCase, NamedFieldPuns #-}
module Hint.Extensions(extensionsHint) where
import Hint.Type(ModuHint, rawIdea,Severity(Warning),Note(..),toSS,ghcAnnotations,ghcModule)
import Extension
import Data.Generics.Uniplate.DataOnly
import Control.Monad.Extra
import Data.Maybe
import Data.List.Extra
import Data.Data
import Refact.Types
import qualified Data.Set as Set
import qualified Data.Map as Map
import SrcLoc
import GHC.Hs
import BasicTypes
import Class
import RdrName
import ForeignCall
import GHC.Util
import GHC.LanguageExtensions.Type
import Language.Haskell.GhclibParserEx.GHC.Hs.Pat
import Language.Haskell.GhclibParserEx.GHC.Hs.Expr
import Language.Haskell.GhclibParserEx.GHC.Hs.Types
import Language.Haskell.GhclibParserEx.GHC.Hs.Decls
import Language.Haskell.GhclibParserEx.GHC.Hs.Binds
import Language.Haskell.GhclibParserEx.GHC.Hs.ImpExp
import Language.Haskell.GhclibParserEx.GHC.Driver.Session
import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
extensionsHint :: ModuHint
extensionsHint :: ModuHint
extensionsHint _ x :: ModuleEx
x =
[ Severity
-> String
-> SrcSpan
-> String
-> Maybe String
-> [Note]
-> [Refactoring SrcSpan]
-> Idea
rawIdea Severity
Hint.Type.Warning "Unused LANGUAGE pragma"
SrcSpan
sl
(Located AnnotationComment -> String
comment (SrcSpan -> [String] -> Located AnnotationComment
mkLanguagePragmas SrcSpan
sl [String]
exts))
(String -> Maybe String
forall a. a -> Maybe a
Just String
newPragma)
( [String -> Note
RequiresExtension (Extension -> String
forall a. Show a => a -> String
show Extension
gone) | (_, Just x :: Extension
x) <- [(String, Maybe Extension)]
before [(String, Maybe Extension)]
-> [(String, Maybe Extension)] -> [(String, Maybe Extension)]
forall a. Eq a => [a] -> [a] -> [a]
\\ [(String, Maybe Extension)]
after, Extension
gone <- [Extension]
-> Extension -> Map Extension [Extension] -> [Extension]
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault [] Extension
x Map Extension [Extension]
disappear] [Note] -> [Note] -> [Note]
forall a. [a] -> [a] -> [a]
++
[ String -> Note
Note (String -> Note) -> String -> Note
forall a b. (a -> b) -> a -> b
$ "Extension " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Extension -> String
forall a. Show a => a -> String
show Extension
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ " is " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Extension -> String
reason Extension
x
| (_, Just x :: Extension
x) <- [(String, Maybe Extension)]
explainedRemovals])
[SrcSpan -> String -> Refactoring SrcSpan
forall a. a -> String -> Refactoring a
ModifyComment (Located AnnotationComment -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
toSS (SrcSpan -> [String] -> Located AnnotationComment
mkLanguagePragmas SrcSpan
sl [String]
exts)) String
newPragma]
| (L sl :: SrcSpan
sl _, exts :: [String]
exts) <- [(Located AnnotationComment, String)]
-> [(Located AnnotationComment, [String])]
languagePragmas ([(Located AnnotationComment, String)]
-> [(Located AnnotationComment, [String])])
-> [(Located AnnotationComment, String)]
-> [(Located AnnotationComment, [String])]
forall a b. (a -> b) -> a -> b
$ ApiAnns -> [(Located AnnotationComment, String)]
pragmas (ModuleEx -> ApiAnns
ghcAnnotations ModuleEx
x)
, let before :: [(String, Maybe Extension)]
before = [(String
x, String -> Maybe Extension
readExtension String
x) | String
x <- [String]
exts]
, let after :: [(String, Maybe Extension)]
after = ((String, Maybe Extension) -> Bool)
-> [(String, Maybe Extension)] -> [(String, Maybe Extension)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> (Extension -> Bool) -> Maybe Extension -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
True (Extension -> Set Extension -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set Extension
keep) (Maybe Extension -> Bool)
-> ((String, Maybe Extension) -> Maybe Extension)
-> (String, Maybe Extension)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, Maybe Extension) -> Maybe Extension
forall a b. (a, b) -> b
snd) [(String, Maybe Extension)]
before
, [(String, Maybe Extension)]
before [(String, Maybe Extension)] -> [(String, Maybe Extension)] -> Bool
forall a. Eq a => a -> a -> Bool
/= [(String, Maybe Extension)]
after
, let explainedRemovals :: [(String, Maybe Extension)]
explainedRemovals
| [(String, Maybe Extension)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(String, Maybe Extension)]
after Bool -> Bool -> Bool
&& Bool -> Bool
not ((Extension -> Bool) -> [Extension] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Extension -> Map Extension Extension -> Bool
forall k a. Ord k => k -> Map k a -> Bool
`Map.member` Map Extension Extension
implied) ([Extension] -> Bool) -> [Extension] -> Bool
forall a b. (a -> b) -> a -> b
$ ((String, Maybe Extension) -> Maybe Extension)
-> [(String, Maybe Extension)] -> [Extension]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (String, Maybe Extension) -> Maybe Extension
forall a b. (a, b) -> b
snd [(String, Maybe Extension)]
before) = []
| Bool
otherwise = [(String, Maybe Extension)]
before [(String, Maybe Extension)]
-> [(String, Maybe Extension)] -> [(String, Maybe Extension)]
forall a. Eq a => [a] -> [a] -> [a]
\\ [(String, Maybe Extension)]
after
, let newPragma :: String
newPragma =
if [(String, Maybe Extension)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(String, Maybe Extension)]
after then "" else Located AnnotationComment -> String
comment (SrcSpan -> [String] -> Located AnnotationComment
mkLanguagePragmas SrcSpan
sl ([String] -> Located AnnotationComment)
-> [String] -> Located AnnotationComment
forall a b. (a -> b) -> a -> b
$ ((String, Maybe Extension) -> String)
-> [(String, Maybe Extension)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Maybe Extension) -> String
forall a b. (a, b) -> a
fst [(String, Maybe Extension)]
after)
]
where
usedTH :: Bool
usedTH :: Bool
usedTH = Extension -> Located (HsModule GhcPs) -> Bool
used Extension
TemplateHaskell (ModuleEx -> Located (HsModule GhcPs)
ghcModule ModuleEx
x) Bool -> Bool -> Bool
|| Extension -> Located (HsModule GhcPs) -> Bool
used Extension
QuasiQuotes (ModuleEx -> Located (HsModule GhcPs)
ghcModule ModuleEx
x)
extensions :: Set.Set Extension
extensions :: Set Extension
extensions = [Extension] -> Set Extension
forall a. Ord a => [a] -> Set a
Set.fromList ([Extension] -> Set Extension) -> [Extension] -> Set Extension
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Extension) -> [String] -> [Extension]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe String -> Maybe Extension
readExtension ([String] -> [Extension]) -> [String] -> [Extension]
forall a b. (a -> b) -> a -> b
$
((Located AnnotationComment, [String]) -> [String])
-> [(Located AnnotationComment, [String])] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Located AnnotationComment, [String]) -> [String]
forall a b. (a, b) -> b
snd ([(Located AnnotationComment, [String])] -> [String])
-> [(Located AnnotationComment, [String])] -> [String]
forall a b. (a -> b) -> a -> b
$ [(Located AnnotationComment, String)]
-> [(Located AnnotationComment, [String])]
languagePragmas (ApiAnns -> [(Located AnnotationComment, String)]
pragmas (ModuleEx -> ApiAnns
ghcAnnotations ModuleEx
x))
useful :: Set.Set Extension
useful :: Set Extension
useful = if Bool
usedTH then Set Extension
extensions else (Extension -> Bool) -> Set Extension -> Set Extension
forall a. (a -> Bool) -> Set a -> Set a
Set.filter (Extension -> Located (HsModule GhcPs) -> Bool
`usedExt` ModuleEx -> Located (HsModule GhcPs)
ghcModule ModuleEx
x) Set Extension
extensions
implied :: Map.Map Extension Extension
implied :: Map Extension Extension
implied = [(Extension, Extension)] -> Map Extension Extension
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (Extension
e, Extension
a)
| Extension
e <- Set Extension -> [Extension]
forall a. Set a -> [a]
Set.toList Set Extension
useful
, a :: Extension
a:_ <- [(Extension -> Bool) -> [Extension] -> [Extension]
forall a. (a -> Bool) -> [a] -> [a]
filter (Extension -> Set Extension -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set Extension
useful) ([Extension] -> [Extension]) -> [Extension] -> [Extension]
forall a b. (a -> b) -> a -> b
$ Extension -> [Extension]
extensionImpliedEnabledBy Extension
e]
]
keep :: Set.Set Extension
keep :: Set Extension
keep = Set Extension
useful Set Extension -> Set Extension -> Set Extension
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Map Extension Extension -> Set Extension
forall k a. Map k a -> Set k
Map.keysSet Map Extension Extension
implied
disappear :: Map.Map Extension [Extension]
disappear :: Map Extension [Extension]
disappear =
([Extension] -> [Extension] -> [Extension])
-> [(Extension, [Extension])] -> Map Extension [Extension]
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith [Extension] -> [Extension] -> [Extension]
forall a. [a] -> [a] -> [a]
(++) ([(Extension, [Extension])] -> Map Extension [Extension])
-> [(Extension, [Extension])] -> Map Extension [Extension]
forall a b. (a -> b) -> a -> b
$
((Extension, [Extension]) -> [Extension])
-> [(Extension, [Extension])] -> [(Extension, [Extension])]
forall b a. Ord b => (a -> b) -> [a] -> [a]
nubOrdOn (Extension, [Extension]) -> [Extension]
forall a b. (a, b) -> b
snd
[ (Extension
e, [Extension
a])
| Extension
e <- Set Extension -> [Extension]
forall a. Set a -> [a]
Set.toList (Set Extension -> [Extension]) -> Set Extension -> [Extension]
forall a b. (a -> b) -> a -> b
$ Set Extension
extensions Set Extension -> Set Extension -> Set Extension
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set Extension
keep
, Extension
a <- ([Extension], [Extension]) -> [Extension]
forall a b. (a, b) -> a
fst (([Extension], [Extension]) -> [Extension])
-> ([Extension], [Extension]) -> [Extension]
forall a b. (a -> b) -> a -> b
$ Extension -> ([Extension], [Extension])
extensionImplies Extension
e
, Extension
a Extension -> Set Extension -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.notMember` Set Extension
useful
, Bool
usedTH Bool -> Bool -> Bool
|| Extension -> Located (HsModule GhcPs) -> Bool
usedExt Extension
a (ModuleEx -> Located (HsModule GhcPs)
ghcModule ModuleEx
x)
]
reason :: Extension -> String
reason :: Extension -> String
reason x :: Extension
x =
case Extension -> Map Extension Extension -> Maybe Extension
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Extension
x Map Extension Extension
implied of
Just a :: Extension
a -> "implied by " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Extension -> String
forall a. Show a => a -> String
show Extension
a
Nothing -> "not used"
deriveHaskell :: [String]
deriveHaskell = ["Eq","Ord","Enum","Ix","Bounded","Read","Show"]
deriveGenerics :: [String]
deriveGenerics = ["Data","Typeable","Generic","Generic1","Lift"]
deriveCategory :: [String]
deriveCategory = ["Functor","Foldable","Traversable"]
noDeriveNewtype :: [String]
noDeriveNewtype =
String -> [String] -> [String]
forall a. Eq a => a -> [a] -> [a]
delete "Enum" [String]
deriveHaskell [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String]
deriveGenerics
deriveStock :: [String]
deriveStock :: [String]
deriveStock = [String]
deriveHaskell [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
deriveGenerics [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
deriveCategory
usedExt :: Extension -> Located (HsModule GhcPs) -> Bool
usedExt :: Extension -> Located (HsModule GhcPs) -> Bool
usedExt NumDecimals = (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
isWholeFrac
usedExt DeriveLift = [String] -> Located (HsModule GhcPs) -> Bool
hasDerive ["Lift"]
usedExt DeriveAnyClass = Bool -> Bool
not (Bool -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([String] -> Bool)
-> (Located (HsModule GhcPs) -> [String])
-> Located (HsModule GhcPs)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Derives -> [String]
derivesAnyclass (Derives -> [String])
-> (Located (HsModule GhcPs) -> Derives)
-> Located (HsModule GhcPs)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (HsModule GhcPs) -> Derives
derives
usedExt x :: Extension
x = Extension -> Located (HsModule GhcPs) -> Bool
used Extension
x
used :: Extension -> Located (HsModule GhcPs) -> Bool
used :: Extension -> Located (HsModule GhcPs) -> Bool
used RecursiveDo = (HsStmtContext Name -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsStmtContext Name -> Bool
isMDo (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (StmtLR GhcPs GhcPs (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS StmtLR GhcPs GhcPs (LHsExpr GhcPs) -> Bool
isRecStmt
used ParallelListComp = (StmtLR GhcPs GhcPs (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS StmtLR GhcPs GhcPs (LHsExpr GhcPs) -> Bool
isParComp
used FunctionalDependencies = FunDep (Located RdrName) -> Located (HsModule GhcPs) -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT (FunDep (Located RdrName)
forall a. a
un :: FunDep (Located RdrName))
used ImplicitParams = HsIPName -> Located (HsModule GhcPs) -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT (HsIPName
forall a. a
un :: HsIPName)
used TypeApplications = (LHsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsExpr GhcPs -> Bool
isTypeApp
used EmptyDataDecls = (HsDataDefn GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsDataDefn GhcPs -> Bool
f
where
f :: HsDataDefn GhcPs -> Bool
f :: HsDataDefn GhcPs -> Bool
f (HsDataDefn _ _ _ _ _ [] _) = Bool
True
f _ = Bool
False
used EmptyCase = (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
f
where
f :: HsExpr GhcPs -> Bool
f :: HsExpr GhcPs -> Bool
f (HsCase _ _ (MG _ (L _ []) _)) = Bool
True
f (HsLamCase _ (MG _ (L _ []) _)) = Bool
True
f _ = Bool
False
used KindSignatures = HsKind GhcPs -> Located (HsModule GhcPs) -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT (HsKind GhcPs
forall a. a
un :: HsKind GhcPs)
used BangPatterns = (Located (Pat GhcPs) -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LPat GhcPs -> Bool
Located (Pat GhcPs) -> Bool
isPBangPat (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsMatchContext RdrName -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsMatchContext RdrName -> Bool
isStrictMatch
used TemplateHaskell = (HsBracket GhcPs, HsSplice GhcPs)
-> Located (HsModule GhcPs) -> Bool
forall from a a.
(Data from, Data a, Data a) =>
(a, a) -> from -> Bool
hasT2' ((HsBracket GhcPs, HsSplice GhcPs)
forall a. a
un :: (HsBracket GhcPs, HsSplice GhcPs)) (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsBracket GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsBracket GhcPs -> Bool
f (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
isSpliceDecl
where
f :: HsBracket GhcPs -> Bool
f :: HsBracket GhcPs -> Bool
f VarBr{} = Bool
True
f TypBr{} = Bool
True
f _ = Bool
False
used ForeignFunctionInterface = CCallConv -> Located (HsModule GhcPs) -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT (CCallConv
forall a. a
un :: CCallConv)
used PatternGuards = (GRHS GhcPs (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS GRHS GhcPs (LHsExpr GhcPs) -> Bool
f
where
f :: GRHS GhcPs (LHsExpr GhcPs) -> Bool
f :: GRHS GhcPs (LHsExpr GhcPs) -> Bool
f (GRHS _ xs :: [GuardLStmt GhcPs]
xs _) = [GuardLStmt GhcPs] -> Bool
g [GuardLStmt GhcPs]
xs
f _ = Bool
False
g :: [GuardLStmt GhcPs] -> Bool
g :: [GuardLStmt GhcPs] -> Bool
g [] = Bool
False
g [L _ BodyStmt{}] = Bool
False
g _ = Bool
True
used StandaloneDeriving = (LHsDecl GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsDecl GhcPs -> Bool
isDerivD
used TypeOperators = (HsKind GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsKind GhcPs -> Bool
tyOpInSig (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsDecl GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsDecl GhcPs -> Bool
tyOpInDecl
where
tyOpInSig :: HsType GhcPs -> Bool
tyOpInSig :: HsKind GhcPs -> Bool
tyOpInSig = \case
HsOpTy{} -> Bool
True; _ -> Bool
False
tyOpInDecl :: HsDecl GhcPs -> Bool
tyOpInDecl :: HsDecl GhcPs -> Bool
tyOpInDecl = \case
(TyClD _ (FamDecl _ FamilyDecl{Located (IdP GhcPs)
fdLName :: forall pass. FamilyDecl pass -> Located (IdP pass)
fdLName :: Located (IdP GhcPs)
fdLName})) -> Located RdrName -> Bool
forall l. GenLocated l RdrName -> Bool
isOp Located (IdP GhcPs)
Located RdrName
fdLName
(TyClD _ SynDecl{Located (IdP GhcPs)
tcdLName :: forall pass. TyClDecl pass -> Located (IdP pass)
tcdLName :: Located (IdP GhcPs)
tcdLName}) -> Located RdrName -> Bool
forall l. GenLocated l RdrName -> Bool
isOp Located (IdP GhcPs)
Located RdrName
tcdLName
(TyClD _ DataDecl{Located (IdP GhcPs)
tcdLName :: Located (IdP GhcPs)
tcdLName :: forall pass. TyClDecl pass -> Located (IdP pass)
tcdLName}) -> Located RdrName -> Bool
forall l. GenLocated l RdrName -> Bool
isOp Located (IdP GhcPs)
Located RdrName
tcdLName
(TyClD _ ClassDecl{Located (IdP GhcPs)
tcdLName :: Located (IdP GhcPs)
tcdLName :: forall pass. TyClDecl pass -> Located (IdP pass)
tcdLName, [LFamilyDecl GhcPs]
tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
tcdATs :: [LFamilyDecl GhcPs]
tcdATs}) -> (Located RdrName -> Bool) -> [Located RdrName] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Located RdrName -> Bool
forall l. GenLocated l RdrName -> Bool
isOp (Located (IdP GhcPs)
Located RdrName
tcdLName Located RdrName -> [Located RdrName] -> [Located RdrName]
forall a. a -> [a] -> [a]
: [FamilyDecl GhcPs -> Located (IdP GhcPs)
forall pass. FamilyDecl pass -> Located (IdP pass)
fdLName FamilyDecl GhcPs
famDecl | L _ famDecl :: FamilyDecl GhcPs
famDecl <- [LFamilyDecl GhcPs]
tcdATs])
_ -> Bool
False
isOp :: GenLocated l RdrName -> Bool
isOp (L _ name :: RdrName
name) = RdrName -> Bool
isSymbolRdrName RdrName
name
used RecordWildCards = (HsRecFields GhcPs (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsRecFields GhcPs (LHsExpr GhcPs) -> Bool
hasFieldsDotDot (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsRecFields GhcPs (Located (Pat GhcPs)) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsRecFields GhcPs (LPat GhcPs) -> Bool
HsRecFields GhcPs (Located (Pat GhcPs)) -> Bool
hasPFieldsDotDot
used RecordPuns = (LHsRecField GhcPs (Located (Pat GhcPs)) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsRecField GhcPs (LPat GhcPs) -> Bool
LHsRecField GhcPs (Located (Pat GhcPs)) -> Bool
isPFieldPun (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (LHsRecField GhcPs (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsRecField GhcPs (LHsExpr GhcPs) -> Bool
isFieldPun (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsRecField' (AmbiguousFieldOcc GhcPs) (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsRecField' (AmbiguousFieldOcc GhcPs) (LHsExpr GhcPs) -> Bool
isFieldPunUpdate
used UnboxedTuples = (HsTupleSort -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsTupleSort -> Bool
isUnboxedTuple (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (Boxity -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS (Boxity -> Boxity -> Bool
forall a. Eq a => a -> a -> Bool
== Boxity
Unboxed) (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (Maybe (LDerivStrategy GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS Maybe (LDerivStrategy GhcPs) -> Bool
isDeriving
where
isDeriving :: Maybe (LDerivStrategy GhcPs) -> Bool
isDeriving :: Maybe (LDerivStrategy GhcPs) -> Bool
isDeriving _ = Bool
True
used PackageImports = (ImportDecl GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS ImportDecl GhcPs -> Bool
f
where
f :: ImportDecl GhcPs -> Bool
f :: ImportDecl GhcPs -> Bool
f ImportDecl{ideclPkgQual :: forall pass. ImportDecl pass -> Maybe StringLiteral
ideclPkgQual=Just _} = Bool
True
f _ = Bool
False
used QuasiQuotes = (LHsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsExpr GhcPs -> Bool
isQuasiQuote (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (LHsType GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsType GhcPs -> Bool
isTyQuasiQuote
used ViewPatterns = (Located (Pat GhcPs) -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LPat GhcPs -> Bool
Located (Pat GhcPs) -> Bool
isPViewPat
used InstanceSigs = (HsDecl GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsDecl GhcPs -> Bool
f
where
f :: HsDecl GhcPs -> Bool
f :: HsDecl GhcPs -> Bool
f (InstD _ decl :: InstDecl GhcPs
decl) = Sig GhcPs -> InstDecl GhcPs -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT (Sig GhcPs
forall a. a
un :: Sig GhcPs) InstDecl GhcPs
decl
f _ = Bool
False
used DefaultSignatures = (Sig GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS Sig GhcPs -> Bool
isClsDefSig
used DeriveDataTypeable = [String] -> Located (HsModule GhcPs) -> Bool
hasDerive ["Data","Typeable"]
used DeriveFunctor = [String] -> Located (HsModule GhcPs) -> Bool
hasDerive ["Functor"]
used DeriveFoldable = [String] -> Located (HsModule GhcPs) -> Bool
hasDerive ["Foldable"]
used DeriveTraversable = [String] -> Located (HsModule GhcPs) -> Bool
hasDerive ["Traversable","Foldable","Functor"]
used DeriveGeneric = [String] -> Located (HsModule GhcPs) -> Bool
hasDerive ["Generic","Generic1"]
used GeneralizedNewtypeDeriving = Bool -> Bool
not (Bool -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([String] -> Bool)
-> (Located (HsModule GhcPs) -> [String])
-> Located (HsModule GhcPs)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Derives -> [String]
derivesNewtype' (Derives -> [String])
-> (Located (HsModule GhcPs) -> Derives)
-> Located (HsModule GhcPs)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (HsModule GhcPs) -> Derives
derives
used MultiWayIf = (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
isMultiIf
used NumericUnderscores = (OverLitVal -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS OverLitVal -> Bool
f
where
f :: OverLitVal -> Bool
f :: OverLitVal -> Bool
f (HsIntegral (IL (SourceText t :: String
t) _ _)) = '_' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
t
f (HsFractional (FL (SourceText t :: String
t) _ _)) = '_' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
t
f _ = Bool
False
used LambdaCase = (LHsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS LHsExpr GhcPs -> Bool
isLCase
used TupleSections = (HsTupArg GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsTupArg GhcPs -> Bool
isTupleSection
used OverloadedStrings = (HsLit GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsLit GhcPs -> Bool
isString
used OverloadedLists = (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
isListExpr (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (Pat GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS Pat GhcPs -> Bool
isListPat
where
isListExpr :: HsExpr GhcPs -> Bool
isListExpr :: HsExpr GhcPs -> Bool
isListExpr ExplicitList{} = Bool
True
isListExpr ArithSeq{} = Bool
True
isListExpr _ = Bool
False
isListPat :: Pat GhcPs -> Bool
isListPat :: Pat GhcPs -> Bool
isListPat ListPat{} = Bool
True
isListPat _ = Bool
False
used OverloadedLabels = (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
isLabel
where
isLabel :: HsExpr GhcPs -> Bool
isLabel :: HsExpr GhcPs -> Bool
isLabel HsOverLabel{} = Bool
True
isLabel _ = Bool
False
used Arrows = (HsExpr GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsExpr GhcPs -> Bool
isProc
used TransformListComp = (StmtLR GhcPs GhcPs (LHsExpr GhcPs) -> Bool)
-> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS StmtLR GhcPs GhcPs (LHsExpr GhcPs) -> Bool
isTransStmt
used MagicHash = (RdrName -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS RdrName -> Bool
f (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (HsLit GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsLit GhcPs -> Bool
isPrimLiteral
where
f :: RdrName -> Bool
f :: RdrName -> Bool
f s :: RdrName
s = "#" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` RdrName -> String
occNameStr RdrName
s
used PatternSynonyms = (HsBind GhcPs -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS HsBind GhcPs -> Bool
isPatSynBind (Located (HsModule GhcPs) -> Bool)
-> (Located (HsModule GhcPs) -> Bool)
-> Located (HsModule GhcPs)
-> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (IEWrappedName RdrName -> Bool) -> Located (HsModule GhcPs) -> Bool
forall x a. (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS IEWrappedName RdrName -> Bool
isPatSynIE
used _= Bool -> Located (HsModule GhcPs) -> Bool
forall a b. a -> b -> a
const Bool
True
hasDerive :: [String] -> Located (HsModule GhcPs) -> Bool
hasDerive :: [String] -> Located (HsModule GhcPs) -> Bool
hasDerive want :: [String]
want = (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
want) ([String] -> Bool)
-> (Located (HsModule GhcPs) -> [String])
-> Located (HsModule GhcPs)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Derives -> [String]
derivesStock' (Derives -> [String])
-> (Located (HsModule GhcPs) -> Derives)
-> Located (HsModule GhcPs)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (HsModule GhcPs) -> Derives
derives
data Derives = Derives
{Derives -> [String]
derivesStock' :: [String]
,Derives -> [String]
derivesAnyclass :: [String]
,Derives -> [String]
derivesNewtype' :: [String]
}
instance Semigroup Derives where
Derives x1 :: [String]
x1 x2 :: [String]
x2 x3 :: [String]
x3 <> :: Derives -> Derives -> Derives
<> Derives y1 :: [String]
y1 y2 :: [String]
y2 y3 :: [String]
y3 =
[String] -> [String] -> [String] -> Derives
Derives ([String]
x1 [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
y1) ([String]
x2 [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
y2) ([String]
x3 [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
y3)
instance Monoid Derives where
mempty :: Derives
mempty = [String] -> [String] -> [String] -> Derives
Derives [] [] []
mappend :: Derives -> Derives -> Derives
mappend = Derives -> Derives -> Derives
forall a. Semigroup a => a -> a -> a
(<>)
addDerives :: Maybe NewOrData -> Maybe (DerivStrategy GhcPs) -> [String] -> Derives
addDerives :: Maybe NewOrData
-> Maybe (DerivStrategy GhcPs) -> [String] -> Derives
addDerives _ (Just s :: DerivStrategy GhcPs
s) xs :: [String]
xs = case DerivStrategy GhcPs
s of
StockStrategy -> Derives
forall a. Monoid a => a
mempty{derivesStock' :: [String]
derivesStock' = [String]
xs}
AnyclassStrategy -> Derives
forall a. Monoid a => a
mempty{derivesAnyclass :: [String]
derivesAnyclass = [String]
xs}
NewtypeStrategy -> Derives
forall a. Monoid a => a
mempty{derivesNewtype' :: [String]
derivesNewtype' = [String]
xs}
ViaStrategy{} -> Derives
forall a. Monoid a => a
mempty
addDerives nt :: Maybe NewOrData
nt _ xs :: [String]
xs = Derives
forall a. Monoid a => a
mempty
{derivesStock' :: [String]
derivesStock' = [String]
stock
,derivesAnyclass :: [String]
derivesAnyclass = [String]
other
,derivesNewtype' :: [String]
derivesNewtype' = if Bool -> (NewOrData -> Bool) -> Maybe NewOrData -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
True NewOrData -> Bool
isNewType Maybe NewOrData
nt then (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [String]
noDeriveNewtype) [String]
xs else []}
where (stock :: [String]
stock, other :: [String]
other) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
deriveStock) [String]
xs
derives :: Located (HsModule GhcPs) -> Derives
derives :: Located (HsModule GhcPs) -> Derives
derives (L _ m :: HsModule GhcPs
m) = [Derives] -> Derives
forall a. Monoid a => [a] -> a
mconcat ([Derives] -> Derives) -> [Derives] -> Derives
forall a b. (a -> b) -> a -> b
$ (LHsDecl GhcPs -> Derives) -> [LHsDecl GhcPs] -> [Derives]
forall a b. (a -> b) -> [a] -> [b]
map LHsDecl GhcPs -> Derives
decl (HsModule GhcPs -> [LHsDecl GhcPs]
forall from to. Biplate from to => from -> [to]
childrenBi HsModule GhcPs
m) [Derives] -> [Derives] -> [Derives]
forall a. [a] -> [a] -> [a]
++ (Located (DataFamInstDecl GhcPs) -> Derives)
-> [Located (DataFamInstDecl GhcPs)] -> [Derives]
forall a b. (a -> b) -> [a] -> [b]
map Located (DataFamInstDecl GhcPs) -> Derives
idecl (HsModule GhcPs -> [Located (DataFamInstDecl GhcPs)]
forall from to. Biplate from to => from -> [to]
childrenBi HsModule GhcPs
m)
where
idecl :: Located (DataFamInstDecl GhcPs) -> Derives
idecl :: Located (DataFamInstDecl GhcPs) -> Derives
idecl (L _ (DataFamInstDecl (HsIB _ FamEqn {feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
feqn_rhs=HsDataDefn {dd_ND :: forall pass. HsDataDefn pass -> NewOrData
dd_ND=NewOrData
dn, dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
dd_derivs=(L _ ds :: [LHsDerivingClause GhcPs]
ds)}}))) = NewOrData -> [LHsDerivingClause GhcPs] -> Derives
g NewOrData
dn [LHsDerivingClause GhcPs]
ds
idecl _ = Derives
forall a. Monoid a => a
mempty
decl :: LHsDecl GhcPs -> Derives
decl :: LHsDecl GhcPs -> Derives
decl (L _ (TyClD _ (DataDecl _ _ _ _ HsDataDefn {dd_ND :: forall pass. HsDataDefn pass -> NewOrData
dd_ND=NewOrData
dn, dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
dd_derivs=(L _ ds :: [LHsDerivingClause GhcPs]
ds)}))) = NewOrData -> [LHsDerivingClause GhcPs] -> Derives
g NewOrData
dn [LHsDerivingClause GhcPs]
ds
decl (L _ (DerivD _ (DerivDecl _ (HsWC _ sig :: LHsSigType GhcPs
sig) strategy :: Maybe (LDerivStrategy GhcPs)
strategy _))) = Maybe NewOrData
-> Maybe (DerivStrategy GhcPs) -> [String] -> Derives
addDerives Maybe NewOrData
forall a. Maybe a
Nothing ((LDerivStrategy GhcPs -> DerivStrategy GhcPs)
-> Maybe (LDerivStrategy GhcPs) -> Maybe (DerivStrategy GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LDerivStrategy GhcPs -> DerivStrategy GhcPs
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Maybe (LDerivStrategy GhcPs)
strategy) [LHsSigType GhcPs -> String
derivedToStr LHsSigType GhcPs
sig]
decl _ = Derives
forall a. Monoid a => a
mempty
g :: NewOrData -> [LHsDerivingClause GhcPs] -> Derives
g :: NewOrData -> [LHsDerivingClause GhcPs] -> Derives
g dn :: NewOrData
dn ds :: [LHsDerivingClause GhcPs]
ds = [Derives] -> Derives
forall a. Monoid a => [a] -> a
mconcat [Maybe NewOrData
-> Maybe (DerivStrategy GhcPs) -> [String] -> Derives
addDerives (NewOrData -> Maybe NewOrData
forall a. a -> Maybe a
Just NewOrData
dn) ((LDerivStrategy GhcPs -> DerivStrategy GhcPs)
-> Maybe (LDerivStrategy GhcPs) -> Maybe (DerivStrategy GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LDerivStrategy GhcPs -> DerivStrategy GhcPs
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Maybe (LDerivStrategy GhcPs)
strategy) ([String] -> Derives) -> [String] -> Derives
forall a b. (a -> b) -> a -> b
$ (LHsSigType GhcPs -> String) -> [LHsSigType GhcPs] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map LHsSigType GhcPs -> String
derivedToStr [LHsSigType GhcPs]
tys | L _ (HsDerivingClause _ strategy :: Maybe (LDerivStrategy GhcPs)
strategy (L _ tys :: [LHsSigType GhcPs]
tys)) <- [LHsDerivingClause GhcPs]
ds]
derivedToStr :: LHsSigType GhcPs -> String
derivedToStr :: LHsSigType GhcPs -> String
derivedToStr (HsIB _ t :: LHsType GhcPs
t) = LHsType GhcPs -> String
ih LHsType GhcPs
t
where
ih :: LHsType GhcPs -> String
ih :: LHsType GhcPs -> String
ih (L _ (HsQualTy _ _ a :: LHsType GhcPs
a)) = LHsType GhcPs -> String
ih LHsType GhcPs
a
ih (L _ (HsParTy _ a :: LHsType GhcPs
a)) = LHsType GhcPs -> String
ih LHsType GhcPs
a
ih (L _ (HsAppTy _ a :: LHsType GhcPs
a _)) = LHsType GhcPs -> String
ih LHsType GhcPs
a
ih (L _ (HsTyVar _ _ a :: Located (IdP GhcPs)
a)) = Located RdrName -> String
forall a. Outputable a => a -> String
unsafePrettyPrint (Located RdrName -> String) -> Located RdrName -> String
forall a b. (a -> b) -> a -> b
$ Located RdrName -> Located RdrName
unqual Located (IdP GhcPs)
Located RdrName
a
ih (L _ a :: HsKind GhcPs
a) = HsKind GhcPs -> String
forall a. Outputable a => a -> String
unsafePrettyPrint HsKind GhcPs
a
derivedToStr _ = ""
un :: a
un = a
forall a. HasCallStack => a
undefined
hasT :: a -> from -> Bool
hasT t :: a
t x :: from
x = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (from -> [a]
forall from to. Biplate from to => from -> [to]
universeBi from
x [a] -> [a] -> [a]
forall a. a -> a -> a
`asTypeOf` [a
t])
hasT2' :: (a, a) -> from -> Bool
hasT2' ~(t1 :: a
t1,t2 :: a
t2) = a -> from -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT a
t1 (from -> Bool) -> (from -> Bool) -> from -> Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ a -> from -> Bool
forall from a. (Data from, Data a) => a -> from -> Bool
hasT a
t2
hasS :: (Data x, Data a) => (a -> Bool) -> x -> Bool
hasS :: (a -> Bool) -> x -> Bool
hasS test :: a -> Bool
test = (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any a -> Bool
test ([a] -> Bool) -> (x -> [a]) -> x -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> [a]
forall from to. Biplate from to => from -> [to]
universeBi