diff --git a/Cabal-syntax/src/Distribution/FieldGrammar/Class.hs b/Cabal-syntax/src/Distribution/FieldGrammar/Class.hs index fa815a49a5e..85d0204e51d 100644 --- a/Cabal-syntax/src/Distribution/FieldGrammar/Class.hs +++ b/Cabal-syntax/src/Distribution/FieldGrammar/Class.hs @@ -1,5 +1,7 @@ {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FunctionalDependencies #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE UndecidableSuperClasses #-} @@ -13,6 +15,7 @@ module Distribution.FieldGrammar.Class , defaultFreeTextFieldDefST ) where +import Data.Kind (Constraint, Type) import Distribution.Compat.Lens import Distribution.Compat.Prelude import Prelude () @@ -23,14 +26,12 @@ import Distribution.FieldGrammar.Newtypes import Distribution.Fields.Field import Distribution.Utils.ShortText --- | 'FieldGrammar' is parametrised by +-- | @g@ is parametrised by -- -- * @s@ which is a structure we are parsing. We need this to provide prettyprinter -- functionality -- -- * @a@ type of the field. --- --- /Note:/ We'd like to have @forall s. Applicative (f s)@ context. class ( c SpecVersion , c TestedWith @@ -38,8 +39,9 @@ class , c Token , c Token' , c FilePathNT + , forall s. Applicative (g s) ) => - FieldGrammar c g + FieldGrammar (c :: Type -> Constraint) (g :: Type -> Type -> Type) | g -> c where -- | Unfocus, zoom out, /blur/ 'FieldGrammar'. @@ -209,7 +211,7 @@ optionalField fn l = optionalFieldAla fn Identity l -- | Optional field with default value. optionalFieldDef - :: (FieldGrammar c g, Functor (g s), c (Identity a), Eq a) + :: (FieldGrammar c g, c (Identity a), Eq a) => FieldName -- ^ field name -> ALens' s a @@ -231,7 +233,7 @@ monoidalField fn l = monoidalFieldAla fn Identity l -- | Default implementation for 'freeTextFieldDefST'. defaultFreeTextFieldDefST - :: (Functor (g s), FieldGrammar c g) + :: FieldGrammar c g => FieldName -> ALens' s ShortText -- ^ lens into the field diff --git a/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs b/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs index e9081256a2a..788625b94c9 100644 --- a/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs +++ b/Cabal-syntax/src/Distribution/PackageDescription/FieldGrammar.hs @@ -95,8 +95,6 @@ import qualified Distribution.Types.Lens as L packageDescriptionFieldGrammar :: ( FieldGrammar c g - , Applicative (g PackageDescription) - , Applicative (g PackageIdentifier) , c (Identity BuildType) , c (Identity PackageName) , c (Identity Version) @@ -166,8 +164,6 @@ packageDescriptionFieldGrammar = libraryFieldGrammar :: ( FieldGrammar c g - , Applicative (g Library) - , Applicative (g BuildInfo) , c (Identity LibraryVisibility) , c (List CommaFSep (Identity ExeDependency) ExeDependency) , c (List CommaFSep (Identity LegacyExeDependency) LegacyExeDependency) @@ -220,8 +216,6 @@ libraryFieldGrammar n = foreignLibFieldGrammar :: ( FieldGrammar c g - , Applicative (g ForeignLib) - , Applicative (g BuildInfo) , c (Identity ForeignLibType) , c (Identity LibVersionInfo) , c (Identity Version) @@ -267,8 +261,6 @@ foreignLibFieldGrammar n = executableFieldGrammar :: ( FieldGrammar c g - , Applicative (g Executable) - , Applicative (g BuildInfo) , c (Identity ExecutableScope) , c (List CommaFSep (Identity ExeDependency) ExeDependency) , c (List CommaFSep (Identity LegacyExeDependency) LegacyExeDependency) @@ -343,8 +335,6 @@ testStanzaCodeGenerators f s = fmap (\x -> s{_testStanzaCodeGenerators = x}) (f testSuiteFieldGrammar :: ( FieldGrammar c g - , Applicative (g TestSuiteStanza) - , Applicative (g BuildInfo) , c (Identity ModuleName) , c (Identity TestType) , c (List CommaFSep (Identity ExeDependency) ExeDependency) @@ -493,8 +483,6 @@ benchmarkStanzaBuildInfo f s = fmap (\x -> s{_benchmarkStanzaBuildInfo = x}) (f benchmarkFieldGrammar :: ( FieldGrammar c g - , Applicative (g BenchmarkStanza) - , Applicative (g BuildInfo) , c (Identity BenchmarkType) , c (Identity ModuleName) , c (List CommaFSep (Identity ExeDependency) ExeDependency) @@ -603,7 +591,6 @@ unvalidateBenchmark b = buildInfoFieldGrammar :: ( FieldGrammar c g - , Applicative (g BuildInfo) , c (List CommaFSep (Identity ExeDependency) ExeDependency) , c (List CommaFSep (Identity LegacyExeDependency) LegacyExeDependency) , c (List CommaFSep (Identity PkgconfigDependency) PkgconfigDependency) @@ -717,7 +704,6 @@ buildInfoFieldGrammar = hsSourceDirsGrammar :: ( FieldGrammar c g - , Applicative (g BuildInfo) , c (List FSep (SymbolicPathNT Pkg (Dir Source)) (SymbolicPath Pkg (Dir Source))) ) => g BuildInfo [SymbolicPath Pkg (Dir Source)] @@ -734,7 +720,7 @@ hsSourceDirsGrammar = wrongLens f bi = (\fps -> set L.hsSourceDirs fps bi) <$> f [] optionsFieldGrammar - :: (FieldGrammar c g, Applicative (g BuildInfo), c (List NoCommaFSep Token' String)) + :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) => g BuildInfo (PerCompilerFlavor [String]) optionsFieldGrammar = PerCompilerFlavor @@ -751,7 +737,7 @@ optionsFieldGrammar = extract flavor = L.options . lookupLens flavor profOptionsFieldGrammar - :: (FieldGrammar c g, Applicative (g BuildInfo), c (List NoCommaFSep Token' String)) + :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) => g BuildInfo (PerCompilerFlavor [String]) profOptionsFieldGrammar = PerCompilerFlavor @@ -762,7 +748,7 @@ profOptionsFieldGrammar = extract flavor = L.profOptions . lookupLens flavor sharedOptionsFieldGrammar - :: (FieldGrammar c g, Applicative (g BuildInfo), c (List NoCommaFSep Token' String)) + :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) => g BuildInfo (PerCompilerFlavor [String]) sharedOptionsFieldGrammar = PerCompilerFlavor @@ -773,7 +759,7 @@ sharedOptionsFieldGrammar = extract flavor = L.sharedOptions . lookupLens flavor profSharedOptionsFieldGrammar - :: (FieldGrammar c g, Applicative (g BuildInfo), c (List NoCommaFSep Token' String)) + :: (FieldGrammar c g, c (List NoCommaFSep Token' String)) => g BuildInfo (PerCompilerFlavor [String]) profSharedOptionsFieldGrammar = PerCompilerFlavor @@ -796,7 +782,7 @@ lookupLens k f p@(PerCompilerFlavor ghc ghcjs) ------------------------------------------------------------------------------- flagFieldGrammar - :: (FieldGrammar c g, Applicative (g PackageFlag)) + :: FieldGrammar c g => FlagName -> g PackageFlag PackageFlag flagFieldGrammar name = @@ -812,7 +798,7 @@ flagFieldGrammar name = ------------------------------------------------------------------------------- sourceRepoFieldGrammar - :: (FieldGrammar c g, Applicative (g SourceRepo), c (Identity RepoType), c Token, c FilePathNT) + :: (FieldGrammar c g, c (Identity RepoType), c Token, c FilePathNT) => RepoKind -> g SourceRepo SourceRepo sourceRepoFieldGrammar kind = @@ -831,7 +817,7 @@ sourceRepoFieldGrammar kind = ------------------------------------------------------------------------------- setupBInfoFieldGrammar - :: (FieldGrammar c g, Functor (g SetupBuildInfo), c (List CommaVCat (Identity Dependency) Dependency)) + :: (FieldGrammar c g, c (List CommaVCat (Identity Dependency) Dependency)) => Bool -> g SetupBuildInfo SetupBuildInfo setupBInfoFieldGrammar def = diff --git a/Cabal-syntax/src/Distribution/Types/InstalledPackageInfo/FieldGrammar.hs b/Cabal-syntax/src/Distribution/Types/InstalledPackageInfo/FieldGrammar.hs index 6d2849c5142..fe4d435b8ed 100644 --- a/Cabal-syntax/src/Distribution/Types/InstalledPackageInfo/FieldGrammar.hs +++ b/Cabal-syntax/src/Distribution/Types/InstalledPackageInfo/FieldGrammar.hs @@ -55,8 +55,6 @@ f <@> x = f <*> x ipiFieldGrammar :: ( FieldGrammar c g - , Applicative (g InstalledPackageInfo) - , Applicative (g Basic) , c (Identity AbiHash) , c (Identity LibraryVisibility) , c (Identity PackageName) @@ -301,7 +299,6 @@ basicLibVisibility f b = basicFieldGrammar :: ( FieldGrammar c g - , Applicative (g Basic) , c (Identity LibraryVisibility) , c (Identity PackageName) , c (Identity UnqualComponentName) diff --git a/cabal-install/src/Distribution/Client/BuildReports/Anonymous.hs b/cabal-install/src/Distribution/Client/BuildReports/Anonymous.hs index 5a274dd42c1..bc6c0fa170a 100644 --- a/cabal-install/src/Distribution/Client/BuildReports/Anonymous.hs +++ b/cabal-install/src/Distribution/Client/BuildReports/Anonymous.hs @@ -111,8 +111,7 @@ cabalInstallID = ------------------------------------------------------------------------------- fieldDescrs - :: ( Applicative (g BuildReport) - , FieldGrammar c g + :: ( FieldGrammar c g , c (Identity Arch) , c (Identity CompilerId) , c (Identity FlagAssignment) diff --git a/cabal-install/src/Distribution/Client/CmdInstall/ClientInstallFlags.hs b/cabal-install/src/Distribution/Client/CmdInstall/ClientInstallFlags.hs index a19e7b38fcd..81e3b72eed5 100644 --- a/cabal-install/src/Distribution/Client/CmdInstall/ClientInstallFlags.hs +++ b/cabal-install/src/Distribution/Client/CmdInstall/ClientInstallFlags.hs @@ -123,7 +123,6 @@ clientInstallOptions _ = clientInstallFlagsGrammar :: ( FieldGrammar c g - , Applicative (g ClientInstallFlags) , c (Identity (Flag Bool)) , c (Flag' FilePathNT FilePath) , c (Identity (Flag OverwritePolicy)) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs index fc4faa6a64a..755cedd087b 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -1805,7 +1805,6 @@ legacyPackageConfigFieldDescrs = legacyPackageConfigFGSectionDescrs :: ( FieldGrammar c g - , Applicative (g SourceRepoList) , c (Identity RepoType) , c (List NoCommaFSep FilePathNT String) , c (NonEmpty' NoCommaFSep Token String) @@ -1837,7 +1836,6 @@ legacyPackageConfigSectionDescrs = packageRepoSectionDescr :: ( FieldGrammar c g - , Applicative (g SourceRepoList) , c (Identity RepoType) , c (List NoCommaFSep FilePathNT String) , c (NonEmpty' NoCommaFSep Token String) diff --git a/cabal-install/src/Distribution/Client/Types/SourceRepo.hs b/cabal-install/src/Distribution/Client/Types/SourceRepo.hs index 69767645cfc..3e30ed20bd0 100644 --- a/cabal-install/src/Distribution/Client/Types/SourceRepo.hs +++ b/cabal-install/src/Distribution/Client/Types/SourceRepo.hs @@ -102,7 +102,6 @@ srpCommandLensNE f s = fmap (\x -> s{srpCommand = maybe [] toList x}) (f (nonEmp sourceRepositoryPackageGrammar :: ( FieldGrammar c g - , Applicative (g SourceRepoList) , c (Identity RepoType) , c (List NoCommaFSep FilePathNT String) , c (NonEmpty' NoCommaFSep Token String) diff --git a/changelog.d/pr-11821.md b/changelog.d/pr-11821.md new file mode 100644 index 00000000000..1851112e955 --- /dev/null +++ b/changelog.d/pr-11821.md @@ -0,0 +1,7 @@ +--- +synopsis: Require `Applicative (g s)` as a superclass of `FieldGrammar` +packages: [Cabal-syntax,cabal-install] +prs: 11821 +--- + +This allows us to scrap a bit of boilerplate.