{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RecordWildCards #-}
module Ormolu.Config
( Config (..),
ColorMode (..),
RegionIndices (..),
RegionDeltas (..),
SourceType (..),
defaultConfig,
overapproximatedDependencies,
regionIndicesToDeltas,
DynOption (..),
dynOptionToLocatedStr,
)
where
import Data.Map.Strict qualified as Map
import Data.Set (Set)
import Data.Set qualified as Set
import Distribution.Types.PackageName (PackageName)
import GHC.Generics (Generic)
import GHC.Types.SrcLoc qualified as GHC
import Ormolu.Fixity
import Ormolu.Terminal (ColorMode (..))
data SourceType
=
ModuleSource
|
SignatureSource
deriving (SourceType -> SourceType -> Bool
(SourceType -> SourceType -> Bool)
-> (SourceType -> SourceType -> Bool) -> Eq SourceType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SourceType -> SourceType -> Bool
== :: SourceType -> SourceType -> Bool
$c/= :: SourceType -> SourceType -> Bool
/= :: SourceType -> SourceType -> Bool
Eq, Int -> SourceType -> ShowS
[SourceType] -> ShowS
SourceType -> String
(Int -> SourceType -> ShowS)
-> (SourceType -> String)
-> ([SourceType] -> ShowS)
-> Show SourceType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SourceType -> ShowS
showsPrec :: Int -> SourceType -> ShowS
$cshow :: SourceType -> String
show :: SourceType -> String
$cshowList :: [SourceType] -> ShowS
showList :: [SourceType] -> ShowS
Show)
data Config region = Config
{
forall region. Config region -> [DynOption]
cfgDynOptions :: ![DynOption],
forall region. Config region -> FixityOverrides
cfgFixityOverrides :: !FixityOverrides,
forall region. Config region -> ModuleReexports
cfgModuleReexports :: !ModuleReexports,
forall region. Config region -> Set PackageName
cfgDependencies :: !(Set PackageName),
forall region. Config region -> Bool
cfgUnsafe :: !Bool,
forall region. Config region -> Bool
cfgDebug :: !Bool,
forall region. Config region -> Bool
cfgCheckIdempotence :: !Bool,
forall region. Config region -> SourceType
cfgSourceType :: !SourceType,
forall region. Config region -> ColorMode
cfgColorMode :: !ColorMode,
forall region. Config region -> region
cfgRegion :: !region
}
deriving (Config region -> Config region -> Bool
(Config region -> Config region -> Bool)
-> (Config region -> Config region -> Bool) -> Eq (Config region)
forall region. Eq region => Config region -> Config region -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall region. Eq region => Config region -> Config region -> Bool
== :: Config region -> Config region -> Bool
$c/= :: forall region. Eq region => Config region -> Config region -> Bool
/= :: Config region -> Config region -> Bool
Eq, Int -> Config region -> ShowS
[Config region] -> ShowS
Config region -> String
(Int -> Config region -> ShowS)
-> (Config region -> String)
-> ([Config region] -> ShowS)
-> Show (Config region)
forall region. Show region => Int -> Config region -> ShowS
forall region. Show region => [Config region] -> ShowS
forall region. Show region => Config region -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall region. Show region => Int -> Config region -> ShowS
showsPrec :: Int -> Config region -> ShowS
$cshow :: forall region. Show region => Config region -> String
show :: Config region -> String
$cshowList :: forall region. Show region => [Config region] -> ShowS
showList :: [Config region] -> ShowS
Show, (forall a b. (a -> b) -> Config a -> Config b)
-> (forall a b. a -> Config b -> Config a) -> Functor Config
forall a b. a -> Config b -> Config a
forall a b. (a -> b) -> Config a -> Config b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Config a -> Config b
fmap :: forall a b. (a -> b) -> Config a -> Config b
$c<$ :: forall a b. a -> Config b -> Config a
<$ :: forall a b. a -> Config b -> Config a
Functor, (forall x. Config region -> Rep (Config region) x)
-> (forall x. Rep (Config region) x -> Config region)
-> Generic (Config region)
forall x. Rep (Config region) x -> Config region
forall x. Config region -> Rep (Config region) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall region x. Rep (Config region) x -> Config region
forall region x. Config region -> Rep (Config region) x
$cfrom :: forall region x. Config region -> Rep (Config region) x
from :: forall x. Config region -> Rep (Config region) x
$cto :: forall region x. Rep (Config region) x -> Config region
to :: forall x. Rep (Config region) x -> Config region
Generic)
data RegionIndices = RegionIndices
{
RegionIndices -> Maybe Int
regionStartLine :: !(Maybe Int),
RegionIndices -> Maybe Int
regionEndLine :: !(Maybe Int)
}
deriving (RegionIndices -> RegionIndices -> Bool
(RegionIndices -> RegionIndices -> Bool)
-> (RegionIndices -> RegionIndices -> Bool) -> Eq RegionIndices
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RegionIndices -> RegionIndices -> Bool
== :: RegionIndices -> RegionIndices -> Bool
$c/= :: RegionIndices -> RegionIndices -> Bool
/= :: RegionIndices -> RegionIndices -> Bool
Eq, Int -> RegionIndices -> ShowS
[RegionIndices] -> ShowS
RegionIndices -> String
(Int -> RegionIndices -> ShowS)
-> (RegionIndices -> String)
-> ([RegionIndices] -> ShowS)
-> Show RegionIndices
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RegionIndices -> ShowS
showsPrec :: Int -> RegionIndices -> ShowS
$cshow :: RegionIndices -> String
show :: RegionIndices -> String
$cshowList :: [RegionIndices] -> ShowS
showList :: [RegionIndices] -> ShowS
Show)
data RegionDeltas = RegionDeltas
{
RegionDeltas -> Int
regionPrefixLength :: !Int,
RegionDeltas -> Int
regionSuffixLength :: !Int
}
deriving (RegionDeltas -> RegionDeltas -> Bool
(RegionDeltas -> RegionDeltas -> Bool)
-> (RegionDeltas -> RegionDeltas -> Bool) -> Eq RegionDeltas
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RegionDeltas -> RegionDeltas -> Bool
== :: RegionDeltas -> RegionDeltas -> Bool
$c/= :: RegionDeltas -> RegionDeltas -> Bool
/= :: RegionDeltas -> RegionDeltas -> Bool
Eq, Int -> RegionDeltas -> ShowS
[RegionDeltas] -> ShowS
RegionDeltas -> String
(Int -> RegionDeltas -> ShowS)
-> (RegionDeltas -> String)
-> ([RegionDeltas] -> ShowS)
-> Show RegionDeltas
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RegionDeltas -> ShowS
showsPrec :: Int -> RegionDeltas -> ShowS
$cshow :: RegionDeltas -> String
show :: RegionDeltas -> String
$cshowList :: [RegionDeltas] -> ShowS
showList :: [RegionDeltas] -> ShowS
Show)
defaultConfig :: Config RegionIndices
defaultConfig :: Config RegionIndices
defaultConfig =
Config
{ cfgDynOptions :: [DynOption]
cfgDynOptions = [],
cfgFixityOverrides :: FixityOverrides
cfgFixityOverrides = FixityOverrides
defaultFixityOverrides,
cfgModuleReexports :: ModuleReexports
cfgModuleReexports = ModuleReexports
defaultModuleReexports,
cfgDependencies :: Set PackageName
cfgDependencies = Set PackageName
forall a. Set a
Set.empty,
cfgUnsafe :: Bool
cfgUnsafe = Bool
False,
cfgDebug :: Bool
cfgDebug = Bool
False,
cfgCheckIdempotence :: Bool
cfgCheckIdempotence = Bool
False,
cfgSourceType :: SourceType
cfgSourceType = SourceType
ModuleSource,
cfgColorMode :: ColorMode
cfgColorMode = ColorMode
Auto,
cfgRegion :: RegionIndices
cfgRegion =
RegionIndices
{ regionStartLine :: Maybe Int
regionStartLine = Maybe Int
forall a. Maybe a
Nothing,
regionEndLine :: Maybe Int
regionEndLine = Maybe Int
forall a. Maybe a
Nothing
}
}
overapproximatedDependencies :: Config region -> Set PackageName
overapproximatedDependencies :: forall region. Config region -> Set PackageName
overapproximatedDependencies Config {region
Bool
[DynOption]
Set PackageName
ColorMode
ModuleReexports
FixityOverrides
SourceType
cfgDynOptions :: forall region. Config region -> [DynOption]
cfgFixityOverrides :: forall region. Config region -> FixityOverrides
cfgModuleReexports :: forall region. Config region -> ModuleReexports
cfgDependencies :: forall region. Config region -> Set PackageName
cfgUnsafe :: forall region. Config region -> Bool
cfgDebug :: forall region. Config region -> Bool
cfgCheckIdempotence :: forall region. Config region -> Bool
cfgSourceType :: forall region. Config region -> SourceType
cfgColorMode :: forall region. Config region -> ColorMode
cfgRegion :: forall region. Config region -> region
cfgDynOptions :: [DynOption]
cfgFixityOverrides :: FixityOverrides
cfgModuleReexports :: ModuleReexports
cfgDependencies :: Set PackageName
cfgUnsafe :: Bool
cfgDebug :: Bool
cfgCheckIdempotence :: Bool
cfgSourceType :: SourceType
cfgColorMode :: ColorMode
cfgRegion :: region
..} =
Set PackageName -> Set PackageName -> Set PackageName
forall a. Ord a => Set a -> Set a -> Set a
Set.union Set PackageName
cfgDependencies Set PackageName
potentialReexportTargets
where
potentialReexportTargets :: Set PackageName
potentialReexportTargets =
[PackageName] -> Set PackageName
forall a. Ord a => [a] -> Set a
Set.fromList
([PackageName] -> Set PackageName)
-> ([NonEmpty (Maybe PackageName, ModuleName)] -> [PackageName])
-> [NonEmpty (Maybe PackageName, ModuleName)]
-> Set PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NonEmpty (Maybe PackageName, ModuleName) -> [PackageName])
-> [NonEmpty (Maybe PackageName, ModuleName)] -> [PackageName]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap NonEmpty (Maybe PackageName, ModuleName) -> [PackageName]
forall {b} {b}. NonEmpty (Maybe b, b) -> [b]
toTargetPackages
([NonEmpty (Maybe PackageName, ModuleName)] -> Set PackageName)
-> [NonEmpty (Maybe PackageName, ModuleName)] -> Set PackageName
forall a b. (a -> b) -> a -> b
$ Map ModuleName (NonEmpty (Maybe PackageName, ModuleName))
-> [NonEmpty (Maybe PackageName, ModuleName)]
forall k a. Map k a -> [a]
Map.elems (ModuleReexports
-> Map ModuleName (NonEmpty (Maybe PackageName, ModuleName))
unModuleReexports ModuleReexports
cfgModuleReexports)
toTargetPackages :: NonEmpty (Maybe b, b) -> [b]
toTargetPackages = ((Maybe b, b) -> [b]) -> NonEmpty (Maybe b, b) -> [b]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (((Maybe b, b) -> [b]) -> NonEmpty (Maybe b, b) -> [b])
-> ((Maybe b, b) -> [b]) -> NonEmpty (Maybe b, b) -> [b]
forall a b. (a -> b) -> a -> b
$ \case
(Maybe b
Nothing, b
_) -> []
(Just b
x, b
_) -> [b
x]
regionIndicesToDeltas ::
Int ->
RegionIndices ->
RegionDeltas
regionIndicesToDeltas :: Int -> RegionIndices -> RegionDeltas
regionIndicesToDeltas Int
total RegionIndices {Maybe Int
regionStartLine :: RegionIndices -> Maybe Int
regionEndLine :: RegionIndices -> Maybe Int
regionStartLine :: Maybe Int
regionEndLine :: Maybe Int
..} =
RegionDeltas
{ regionPrefixLength :: Int
regionPrefixLength = Int -> (Int -> Int) -> Maybe Int -> Int
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
1) Maybe Int
regionStartLine,
regionSuffixLength :: Int
regionSuffixLength = Int -> (Int -> Int) -> Maybe Int -> Int
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (Int
total -) Maybe Int
regionEndLine
}
newtype DynOption = DynOption
{ DynOption -> String
unDynOption :: String
}
deriving (DynOption -> DynOption -> Bool
(DynOption -> DynOption -> Bool)
-> (DynOption -> DynOption -> Bool) -> Eq DynOption
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DynOption -> DynOption -> Bool
== :: DynOption -> DynOption -> Bool
$c/= :: DynOption -> DynOption -> Bool
/= :: DynOption -> DynOption -> Bool
Eq, Eq DynOption
Eq DynOption =>
(DynOption -> DynOption -> Ordering)
-> (DynOption -> DynOption -> Bool)
-> (DynOption -> DynOption -> Bool)
-> (DynOption -> DynOption -> Bool)
-> (DynOption -> DynOption -> Bool)
-> (DynOption -> DynOption -> DynOption)
-> (DynOption -> DynOption -> DynOption)
-> Ord DynOption
DynOption -> DynOption -> Bool
DynOption -> DynOption -> Ordering
DynOption -> DynOption -> DynOption
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DynOption -> DynOption -> Ordering
compare :: DynOption -> DynOption -> Ordering
$c< :: DynOption -> DynOption -> Bool
< :: DynOption -> DynOption -> Bool
$c<= :: DynOption -> DynOption -> Bool
<= :: DynOption -> DynOption -> Bool
$c> :: DynOption -> DynOption -> Bool
> :: DynOption -> DynOption -> Bool
$c>= :: DynOption -> DynOption -> Bool
>= :: DynOption -> DynOption -> Bool
$cmax :: DynOption -> DynOption -> DynOption
max :: DynOption -> DynOption -> DynOption
$cmin :: DynOption -> DynOption -> DynOption
min :: DynOption -> DynOption -> DynOption
Ord, Int -> DynOption -> ShowS
[DynOption] -> ShowS
DynOption -> String
(Int -> DynOption -> ShowS)
-> (DynOption -> String)
-> ([DynOption] -> ShowS)
-> Show DynOption
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DynOption -> ShowS
showsPrec :: Int -> DynOption -> ShowS
$cshow :: DynOption -> String
show :: DynOption -> String
$cshowList :: [DynOption] -> ShowS
showList :: [DynOption] -> ShowS
Show)
dynOptionToLocatedStr :: DynOption -> GHC.Located String
dynOptionToLocatedStr :: DynOption -> Located String
dynOptionToLocatedStr (DynOption String
o) = SrcSpan -> String -> Located String
forall l e. l -> e -> GenLocated l e
GHC.L SrcSpan
GHC.noSrcSpan String
o