packages feed

stylish-cabal-0.2.0.0: tests/roundtrip/SortedDesc.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# Language CPP #-}
{-# Language NamedFieldPuns #-}
{-# Language RecordWildCards #-}
{-# Language StandaloneDeriving #-}
{-# Language TypeFamilies #-}

module SortedDesc
    ( from
    , SGenericPackageDescription
    ) where

import Data.Set (Set)
import qualified Data.Set as S
import Distribution.Compiler
import Distribution.License
import Distribution.ModuleName
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Types.LegacyExeDependency
import Distribution.Types.Mixin
import Distribution.Types.PkgconfigDependency
import Distribution.Types.UnqualComponentName
import Distribution.Version
import Language.Haskell.Extension
#if !MIN_VERSION_base(4,8,0)
import Data.Functor ((<$>))
#endif

data SGenericPackageDescription = SGenericPackageDescription
    { packageDescription :: SPackageDescription
    , genPackageFlags :: Set Flag
    -- , sCondLibrary :: Maybe (SCondTree SConfVar (Set SDependency) SLibrary)
    -- , SCondExecutables :: Set (String, SCondTree SConfVar (Set SDependency) SExecutable)
    } deriving (Eq, Show)

data SPackageDescription = SPackageDescription
    { package :: PackageIdentifier
    , license :: License
    , licenseFiles :: Set FilePath
    , copyright :: String
    , maintainer :: String
    , author :: String
    , stability :: String
    , testedWith :: Set (CompilerFlavor, VersionRange)
    , homepage :: String
    , pkgUrl :: String
    , bugReports :: String
    , sourceRepos :: Set SourceRepo
    , synopsis :: String
    , description :: String
    , category :: String
    , customFieldsPD :: Set (String, String)
    , specVersionRaw :: Either Version VersionRange
    , buildType :: Maybe BuildType
    , setupBuildInfo :: Maybe SSetupBuildInfo
    , library :: Maybe SLibrary
    , executables :: Set SExecutable
    , testSuites :: Set STestSuite
    , benchmarks :: Set SBenchmark
    , dataFiles :: Set FilePath
    , dataDir :: FilePath
    , extraSrcFiles :: Set FilePath
    , extraTmpFiles :: Set FilePath
    , extraDocFiles :: Set FilePath
    } deriving (Show, Eq)

data SLibrary = SLibrary
    { exposedModules :: Set ModuleName
    , reexportedModules :: Set ModuleReexport
    , signatures :: Set ModuleName
    , libExposed :: Bool
    , libBuildInfo :: SBuildInfo
    } deriving (Show, Eq)

data SExecutable = SExecutable
    { exeName :: UnqualComponentName
    , modulePath :: FilePath
    , buildInfo :: SBuildInfo
    } deriving (Show, Eq, Ord)

data STestSuite = STestSuite
    { testName :: UnqualComponentName
    , testInterface :: TestSuiteInterface
    , testBuildInfo :: SBuildInfo
    } deriving (Show, Eq, Ord)

data SBenchmark = SBenchmark
    { benchmarkName :: UnqualComponentName
    , benchmarkInterface :: BenchmarkInterface
    , benchmarkBuildInfo :: SBuildInfo
    } deriving (Show, Eq, Ord)

data SSetupBuildInfo = SSetupBuildInfo
    { setupDepends :: Set Dependency
    , defaultSetupDepends :: Bool
    } deriving (Show, Eq)

data SBuildInfo = SBuildInfo
    { buildable :: Bool
    , buildTools :: Set LegacyExeDependency
    , cppOptions :: Set String
    , ccOptions :: Set String
    , ldOptions :: Set String
    , pkgconfigDepends :: Set PkgconfigDependency
    , frameworks :: Set String
    , extraFrameworkDirs :: Set String
    , cSources :: Set FilePath
    , jsSources :: Set FilePath
    , hsSourceDirs :: Set FilePath
    , otherModules :: Set ModuleName
    , defaultLanguage :: Maybe Language
    , otherLanguages :: Set Language
    , defaultExtensions :: Set Extension
    , otherExtensions :: Set Extension
    , oldExtensions :: Set Extension
    , extraLibs :: Set String
    , extraGHCiLibs :: Set String
    , extraLibDirs :: Set String
    , includeDirs :: Set FilePath
    , includes :: Set FilePath
    , installIncludes :: Set FilePath
    , options :: Set (CompilerFlavor, Set String)
    , profOptions :: Set (CompilerFlavor, Set String)
    , sharedOptions :: Set (CompilerFlavor, Set String)
    , customFieldsBI :: Set (String, String)
    , targetBuildDepends :: Set Dependency
    , mixins :: Set Mixin
    } deriving (Show, Eq, Ord)

class Convert a where
    type From a
    from :: From a -> a

instance Convert SGenericPackageDescription where
    type From SGenericPackageDescription = GenericPackageDescription
    from GenericPackageDescription {..} =
        SGenericPackageDescription
            { packageDescription = from packageDescription
            , genPackageFlags =
                  S.fromList $ map (\f -> f {flagDescription = ""}) genPackageFlags
            }

instance Convert SPackageDescription where
    type From SPackageDescription = PackageDescription
    from PackageDescription {..} =
        SPackageDescription
            { package
            , license
            , licenseFiles = S.fromList licenseFiles
            , copyright
            , maintainer
            , author
            , stability
            , testedWith = S.fromList testedWith
            , homepage
            , pkgUrl
            , bugReports
            , sourceRepos = S.fromList sourceRepos
            , synopsis
            , description = "" -- discard, matching formatting in tests is too much work
            , category
            , customFieldsPD = S.fromList customFieldsPD
            , specVersionRaw = Right anyVersion -- discard, cabal replaces * with >= 0 || <= 0
            , buildType
            , setupBuildInfo = from <$> setupBuildInfo
            , library = from <$> library
            , executables = S.fromList $ map from executables
            , testSuites = S.fromList $ map from testSuites
            , benchmarks = S.fromList $ map from benchmarks
            , dataFiles = S.fromList dataFiles
            , dataDir
            , extraSrcFiles = S.fromList extraSrcFiles
            , extraTmpFiles = S.fromList extraTmpFiles
            , extraDocFiles = S.fromList extraDocFiles
            }

instance Convert SSetupBuildInfo where
    type From SSetupBuildInfo = SetupBuildInfo
    from SetupBuildInfo {..} =
        SSetupBuildInfo {setupDepends = S.fromList setupDepends, defaultSetupDepends}

instance Convert SLibrary where
    type From SLibrary = Library
    from Library {..} =
        SLibrary
            { exposedModules = S.fromList exposedModules
            , reexportedModules = S.fromList reexportedModules
            , signatures = S.fromList signatures
            , libExposed
            , libBuildInfo = from libBuildInfo
            }

instance Convert SExecutable where
    type From SExecutable = Executable
    from Executable {..} = SExecutable {exeName, modulePath, buildInfo = from buildInfo}

instance Convert STestSuite where
    type From STestSuite = TestSuite
    from TestSuite {..} =
        STestSuite {testName, testInterface, testBuildInfo = from testBuildInfo}

instance Convert SBenchmark where
    type From SBenchmark = Benchmark
    from Benchmark {..} =
        SBenchmark
            { benchmarkName
            , benchmarkInterface
            , benchmarkBuildInfo = from benchmarkBuildInfo
            }

instance Convert SBuildInfo where
    type From SBuildInfo = BuildInfo
    from BuildInfo {..} =
        SBuildInfo
            { buildable
            , buildTools = S.fromList buildTools
            , cppOptions = S.fromList cppOptions
            , ccOptions = S.fromList ccOptions
            , ldOptions = S.fromList ldOptions
            , pkgconfigDepends = S.fromList pkgconfigDepends
            , frameworks = S.fromList frameworks
            , extraFrameworkDirs = S.fromList extraFrameworkDirs
            , cSources = S.fromList cSources
            , jsSources = S.fromList jsSources
            , hsSourceDirs = S.fromList hsSourceDirs
            , otherModules = S.fromList otherModules
            , defaultLanguage
            , otherLanguages = S.fromList otherLanguages
            , defaultExtensions = S.fromList defaultExtensions
            , otherExtensions = S.fromList otherExtensions
            , oldExtensions = S.fromList oldExtensions
            , extraLibs = S.fromList extraLibs
            , extraGHCiLibs = S.fromList extraGHCiLibs
            , extraLibDirs = S.fromList extraLibDirs
            , includeDirs = S.fromList includeDirs
            , includes = S.fromList includes
            , installIncludes = S.fromList installIncludes
            , options = S.fromList $ map (fmap S.fromList) options
            , profOptions = S.fromList $ map (fmap S.fromList) profOptions
            , sharedOptions = S.fromList $ map (fmap S.fromList) sharedOptions
            , customFieldsBI = S.fromList customFieldsBI
            , targetBuildDepends = S.fromList targetBuildDepends
            , mixins = S.fromList mixins
            }

deriving instance Ord Flag

deriving instance Ord VersionRange

deriving instance Ord SourceRepo

deriving instance Ord Dependency

deriving instance Ord Language

deriving instance Ord ModuleReexport

deriving instance Ord TestSuiteInterface

deriving instance Ord TestType

deriving instance Ord BenchmarkInterface

deriving instance Ord BenchmarkType

deriving instance Ord PkgconfigDependency

deriving instance Ord LegacyExeDependency