-
Notifications
You must be signed in to change notification settings - Fork 696
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This commit reworks how GenericPackageDescription is parsed from `[Field Position]` and pretty-printed to `Doc`. This also fixes few issues: - Fix #4697: `cabal format` doesn't output custom-setup stanza (nor foreign-lib stanzas) - Fix #4719: `parse . pretty . parse = parse` for all Hackage cabal files. - `parser-hackage-tests roundtrip` is the test program. The handling of `license-file` and `license-files` is changed. Now they behave the same.
- Loading branch information
Showing
81 changed files
with
3,619 additions
and
2,019 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
{-# LANGUAGE FlexibleContexts #-} | ||
{-# LANGUAGE FlexibleInstances #-} | ||
{-# LANGUAGE ScopedTypeVariables #-} | ||
-- | This module provides a way to specify a grammar of @.cabal@ -like files. | ||
module Distribution.FieldGrammar ( | ||
-- * Field grammar type | ||
FieldGrammar (..), | ||
uniqueField, | ||
optionalField, | ||
optionalFieldDef, | ||
optionalFieldDefAla, | ||
monoidalField, | ||
deprecatedField', | ||
-- * Concrete grammar implementations | ||
ParsecFieldGrammar, | ||
ParsecFieldGrammar', | ||
parseFieldGrammar, | ||
fieldGrammarKnownFieldList, | ||
PrettyFieldGrammar, | ||
PrettyFieldGrammar', | ||
prettyFieldGrammar, | ||
-- * Auxlilary | ||
(^^^), | ||
Section(..), | ||
Fields, | ||
partitionFields, | ||
takeFields, | ||
runFieldParser, | ||
runFieldParser', | ||
) where | ||
|
||
import Distribution.Compat.Prelude | ||
import Prelude () | ||
|
||
import qualified Distribution.Compat.Map.Strict as Map | ||
|
||
import Distribution.FieldGrammar.Class | ||
import Distribution.FieldGrammar.Parsec | ||
import Distribution.FieldGrammar.Pretty | ||
import Distribution.Parsec.Field | ||
import Distribution.Utils.Generic (spanMaybe) | ||
|
||
type ParsecFieldGrammar' a = ParsecFieldGrammar a a | ||
type PrettyFieldGrammar' a = PrettyFieldGrammar a a | ||
|
||
infixl 5 ^^^ | ||
|
||
-- | Reverse function application which binds tighter than '<$>' and '<*>'. | ||
-- Useful for refining grammar specification. | ||
-- | ||
-- @ | ||
-- \<*\> 'monoidalFieldAla' "extensions" (alaList' FSep MQuoted) oldExtensions | ||
-- ^^^ 'deprecatedSince' [1,12] "Please use 'default-extensions' or 'other-extensions' fields." | ||
-- @ | ||
(^^^) :: a -> (a -> b) -> b | ||
x ^^^ f = f x | ||
|
||
-- | Partitionin state | ||
data PS ann = PS (Fields ann) [Section ann] [[Section ann]] | ||
|
||
-- | Partition field list into field map and groups of sections. | ||
partitionFields :: [Field ann] -> (Fields ann, [[Section ann]]) | ||
partitionFields = finalize . foldl' f (PS mempty mempty mempty) | ||
where | ||
finalize :: PS ann -> (Fields ann, [[Section ann]]) | ||
finalize (PS fs s ss) | ||
| null s = (fs, reverse ss) | ||
| otherwise = (fs, reverse (reverse s : ss)) | ||
|
||
f :: PS ann -> Field ann -> PS ann | ||
f (PS fs s ss) (Field (Name ann name) fss) = | ||
PS (Map.insertWith (flip (++)) name [MkNamelessField ann fss] fs) [] ss' | ||
where | ||
ss' | null s = ss | ||
| otherwise = reverse s : ss | ||
f (PS fs s ss) (Section name sargs sfields) = | ||
PS fs (MkSection name sargs sfields : s) ss | ||
|
||
-- | Take all fields from the front. | ||
takeFields :: [Field ann] -> (Fields ann, [Field ann]) | ||
takeFields = finalize . spanMaybe match | ||
where | ||
finalize (fs, rest) = (Map.fromListWith (flip (++)) fs, rest) | ||
|
||
match (Field (Name ann name) fs) = Just (name, [MkNamelessField ann fs]) | ||
match _ = Nothing |
Oops, something went wrong.