Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
36ef1b8
implement GPD Barbie
leana8959 Mar 13, 2026
fe6313c
make trivia type parameterized
leana8959 Apr 3, 2026
cdc2edf
implement model for position tracking
leana8959 Apr 3, 2026
f0eb41b
WIP: figure out how to thread position in field grammar
leana8959 Apr 3, 2026
c4dfb6a
implement example of build depends with positions
leana8959 Apr 7, 2026
be072cf
implement pretty version of field grammar
leana8959 Apr 7, 2026
08c47f5
make targetBuildDepends field hold position if needed
leana8959 Apr 7, 2026
cb2fa93
field BuildInfo type family
leana8959 Apr 7, 2026
6504cf7
simplify TargetBuildDepends type class
leana8959 Apr 7, 2026
d11f317
mini example of field grammar with position retention
leana8959 Apr 7, 2026
e6779b8
checkpoint
leana8959 Apr 7, 2026
107d01a
checkpoint
leana8959 Apr 7, 2026
eab59b9
conversion example
leana8959 Apr 7, 2026
795b04d
allow contramapping field grammar and leave some notes
leana8959 Apr 8, 2026
2e9c9d3
attepmt to make position registering also controllable in field grammar
leana8959 Apr 9, 2026
9d89ae2
attempt to parameterize field gramamr output
leana8959 Apr 9, 2026
052c9b4
implement field grammar fully generically
leana8959 Apr 9, 2026
791c661
Split out Annotate type family
leana8959 Apr 9, 2026
dd018b1
move AttachPos type family
leana8959 Apr 9, 2026
0f3bcd7
remove TargetBuildDepends type family
leana8959 Apr 9, 2026
d3a6008
rewrite with proxy
leana8959 Apr 9, 2026
9b22d85
introduce one more type argument in Field Grammar
leana8959 Apr 9, 2026
e224ce9
add a field to attepmt polymorphic monoidalFieldAla output
leana8959 Apr 9, 2026
004e9f8
reimplement minibuildinfo with generic monoidalFieldAla'
leana8959 Apr 9, 2026
22fd1fd
implement monoidalFieldAla'
leana8959 Apr 9, 2026
6ed8bff
export miniBuildInfoFieldGrammar for a demo
leana8959 Apr 9, 2026
06ef298
implement demo for miniBuildInfoDemo
leana8959 Apr 9, 2026
7779ce7
add note
leana8959 Apr 9, 2026
8c0d1af
demonstrate that NoAnn works
leana8959 Apr 9, 2026
ade8d0a
implement buildable field in BuildInfo
leana8959 Apr 9, 2026
aa0718e
implement buildable
leana8959 Apr 9, 2026
406eaf9
split AttachPos into AttachPos and PreserveGrouping
leana8959 Apr 9, 2026
5b8ba68
implement buildTools
leana8959 Apr 9, 2026
e8b0056
remove some redundant type application
leana8959 Apr 9, 2026
d789c8e
implement BuildtoolDepends
leana8959 Apr 9, 2026
30a3194
use mod to choose ListWith instance
leana8959 Apr 10, 2026
b0da442
fix buildinfo example
leana8959 Apr 10, 2026
01924fa
add cppOptions field
leana8959 Apr 10, 2026
9e6b8b9
add asmOptions field
leana8959 Apr 10, 2026
df4ffbf
add cmmOptions field
leana8959 Apr 10, 2026
7621557
inline newtypes with new helpers
leana8959 Apr 10, 2026
3e8a79e
test out specialization idea
leana8959 Apr 10, 2026
9372723
add ccOptions field
leana8959 Apr 10, 2026
7f27337
add cxxOptions field
leana8959 Apr 10, 2026
2a1d110
implement jsppOptions
leana8959 Apr 10, 2026
c999682
add ldOptions field
leana8959 Apr 10, 2026
c416dd9
add hsc2hsOptions field
leana8959 Apr 10, 2026
a72b642
add pkgConfigDependency field
leana8959 Apr 10, 2026
0334317
stuck at frameworks field
leana8959 Apr 10, 2026
74e272f
implement framework field
leana8959 Apr 10, 2026
aa59e8a
add extraFrameworkDirs field
leana8959 Apr 10, 2026
aa446b4
add asmSources field
leana8959 Apr 10, 2026
05173e8
add cmmSources field
leana8959 Apr 10, 2026
08b9326
add cSources field
leana8959 Apr 10, 2026
29e0cd7
add cxxSources field
leana8959 Apr 10, 2026
0d99f52
add jsSources field
leana8959 Apr 10, 2026
dd7149e
add hsSourceDirs field
leana8959 Apr 10, 2026
9949027
make hsSourceDirs polymorphic /and/ backward compatible
leana8959 Apr 10, 2026
9bc7f54
add other modules field
leana8959 Apr 10, 2026
20236f8
example implementation of printer monoidalFieldAla
leana8959 Apr 13, 2026
f1e811b
attach trivia to boolean
leana8959 Apr 13, 2026
2b34b03
relax pretty field grammar output type
leana8959 Apr 13, 2026
15eadb8
leave some notes
leana8959 Apr 13, 2026
2fa1fca
insert real position in cabalparsec and parsecparser
leana8959 Apr 13, 2026
835c50a
thread through real offsetted position
leana8959 Apr 13, 2026
557bc2b
remodel buildable boolean field annotation
leana8959 Apr 13, 2026
49db998
remove random comment
leana8959 Apr 13, 2026
ec5ac59
push out fieldname position
leana8959 Apr 13, 2026
349099c
run fourmolu
leana8959 Apr 13, 2026
0455a9c
distinguish AttachPositions and AttachPosition
leana8959 Apr 13, 2026
bd07788
patch pretty for now so it builds and runs most tests fine
leana8959 Apr 13, 2026
342de19
test displaying mini build info, add note about model
leana8959 Apr 13, 2026
be518bf
add parsec combinator to store position
leana8959 Apr 14, 2026
5a14696
register each element's position in list combinators
leana8959 Apr 14, 2026
cf70a75
fix minibuildinfo
leana8959 Apr 14, 2026
5eff7ac
register each field position for hsSourceDirs
leana8959 Apr 14, 2026
a69bd57
make buildinfofieldgrammar' polymorphic again
leana8959 Apr 14, 2026
584b8fb
remove unused prototype methods
leana8959 Apr 14, 2026
4602ccc
leave notes for newtype ListWith
leana8959 Apr 14, 2026
7c7f294
update comments on future direction regarding pretty
leana8959 Apr 14, 2026
bf05e44
include ExactDoc module from trivia tree attempt for full roundtrip
leana8959 Apr 16, 2026
3f7e889
reimplement prettyfield to exactdoc
leana8959 Apr 16, 2026
249709b
demonstrate roundtrip in cli
leana8959 Apr 16, 2026
11fc10c
add a small cabal file test
leana8959 Apr 17, 2026
d3e5d79
XXX tree-wide change is necessary to parse with current entrypoint
leana8959 Apr 17, 2026
5e75660
Revert "XXX tree-wide change is necessary to parse with current entry…
leana8959 Apr 17, 2026
a376ef2
update buildinfofieldgrammar' to compile again
leana8959 Apr 22, 2026
326e029
parse all fields of build info
leana8959 Apr 22, 2026
9d9cf65
rewire buildinfofieldgrammar
leana8959 Apr 22, 2026
86a5f5b
polymorphize libraryFieldGrammar
leana8959 Apr 22, 2026
8231f55
checkpoint
leana8959 Apr 22, 2026
9f1467a
fully generalize goSection && parseGenericParsecDescription
leana8959 Apr 23, 2026
fb979ae
fix test suite compilation
leana8959 Apr 27, 2026
1b449ff
run parser against hackage
leana8959 Apr 27, 2026
7d101cd
implement smallCabalFile test
leana8959 Apr 27, 2026
4b885c2
implement part of ppGenericPackageDescriptionAnn
leana8959 Apr 27, 2026
765a441
did thing
leana8959 Apr 30, 2026
a4c1fff
repair boolean field!
leana8959 Apr 30, 2026
bf05e49
Implement position preserving optionalfieldAla'
leana8959 Apr 30, 2026
792ec05
implement position preserving optionalfieldala' (printer)
leana8959 Apr 30, 2026
9d59e8f
preserve cabal-version position
leana8959 Apr 30, 2026
ea2614d
make uniqueField polymorphic
leana8959 May 4, 2026
43e77fa
use uniqueField in pkgName
leana8959 May 4, 2026
4e1bb8e
use uniqueField in pkgVersion
leana8959 May 4, 2026
3520dd1
filter out zeroPos fields for now
leana8959 May 4, 2026
fd03f54
render pretty fields with exactdoc
leana8959 May 4, 2026
a48ef86
retain section position
leana8959 May 4, 2026
ab864a5
push out section position to pretty field (WIP)
leana8959 May 4, 2026
fc01f54
float out position in pretty printer
leana8959 May 5, 2026
1a40c0a
float out positions from condtrees
leana8959 May 5, 2026
d320525
inject lens into pretty printer when running
leana8959 May 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Cabal-described/src/Distribution/Described.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Distribution.Described (
Expand Down Expand Up @@ -56,6 +58,7 @@ import Test.Tasty.QuickCheck (testProperty)
import Data.Semigroup (Semigroup (..))
import Distribution.Parsec (Parsec, eitherParsec)
import Distribution.Pretty (Pretty, prettyShow)
import qualified Distribution.Types.Modify as Mod

import qualified Distribution.Utils.CharSet as CS
import qualified RERE as RE
Expand Down Expand Up @@ -546,7 +549,7 @@ instance Described UnqualComponentName where
-- Instances: Newtypes
-------------------------------------------------------------------------------

class Sep sep => DescribeSep sep where
class Sep Mod.HasNoAnn sep => DescribeSep sep where
describeSep :: Proxy sep -> GrammarRegex a -> GrammarRegex a

instance DescribeSep CommaVCat where describeSep _ = reCommaList
Expand Down
3 changes: 3 additions & 0 deletions Cabal-syntax/Cabal-syntax.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,14 @@ library
Distribution.PackageDescription.Quirks
Distribution.PackageDescription.Utils
Distribution.Parsec
Distribution.Trivia
Distribution.Parsec.Error
Distribution.Parsec.FieldLineStream
Distribution.Parsec.Position
Distribution.Parsec.Warning
Distribution.Parsec.Source
Distribution.Pretty
Distribution.Pretty.ExactDoc
Distribution.SPDX
Distribution.SPDX.License
Distribution.SPDX.LicenseExceptionId
Expand All @@ -126,6 +128,7 @@ library
Distribution.Types.BenchmarkInterface
Distribution.Types.BenchmarkType
Distribution.Types.BuildInfo
Distribution.Types.Modify
Distribution.Types.BuildInfo.Lens
Distribution.Types.BuildType
Distribution.Types.Component
Expand Down
4 changes: 4 additions & 0 deletions Cabal-syntax/src/Distribution/Compat/CharParsing.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ module Distribution.Compat.CharParsing
oneOf -- :: CharParsing m => [Char] -> m Char
, noneOf -- :: CharParsing m => [Char] -> m Char
, spaces -- :: CharParsing m => m ()
, spaces' -- :: CharParsing m => m ()
, space -- :: CharParsing m => m Char
, newline -- :: CharParsing m => m Char
, tab -- :: CharParsing m => m Char
Expand Down Expand Up @@ -90,6 +91,9 @@ spaces :: CharParsing m => m ()
spaces = skipMany space <?> "white space"
{-# INLINE spaces #-}

spaces' :: CharParsing m => m String
spaces' = many space <?> "white space"

-- | Parses a white space character (any character which satisfies 'isSpace')
-- Returns the parsed character.
space :: CharParsing m => m Char
Expand Down
35 changes: 35 additions & 0 deletions Cabal-syntax/src/Distribution/Compat/Parsing.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}

-----------------------------------------------------------------------------
Expand Down Expand Up @@ -27,9 +29,13 @@ module Distribution.Compat.Parsing
, some -- from Control.Applicative, parsec many1
, many -- from Control.Applicative
, sepBy
, sepByAnn
, sepByNonEmpty
, sepByNonEmptyAnn
, sepEndByNonEmpty
, sepEndByNonEmptyAnn
, sepEndBy
, sepEndByAnn
, endByNonEmpty
, endBy
, count
Expand All @@ -44,6 +50,7 @@ module Distribution.Compat.Parsing
) where

import Distribution.Compat.Prelude
import Distribution.Trivia
import Prelude ()

import Control.Applicative (optional, (<**>))
Expand Down Expand Up @@ -101,18 +108,42 @@ sepBy :: Alternative m => m a -> m sep -> m [a]
sepBy p sep = toList <$> sepByNonEmpty p sep <|> pure []
{-# INLINE sepBy #-}

sepByAnn :: Alternative m => m (Ann SurroundingText a) -> m String -> m [Ann SurroundingText a]
sepByAnn p sep = toList <$> sepByNonEmptyAnn p sep <|> pure []
{-# INLINE sepByAnn #-}

-- | @sepByNonEmpty p sep@ parses /one/ or more occurrences of @p@, separated
-- by @sep@. Returns a non-empty list of values returned by @p@.
sepByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a)
sepByNonEmpty p sep = (:|) <$> p <*> many (sep *> p)
{-# INLINE sepByNonEmpty #-}

sepByNonEmptyAnn :: forall m a. Alternative m => m (Ann SurroundingText a) -> m String -> m (NonEmpty (Ann SurroundingText a))
sepByNonEmptyAnn p sep =
(:|)
<$> p
<*> many
( do
leading <- sep
x <- p
pure (mapAnn (preTrivia leading <>) x)
)

-- | @sepEndByNonEmpty p sep@ parses /one/ or more occurrences of @p@,
-- separated and optionally ended by @sep@. Returns a non-empty list of values
-- returned by @p@.
sepEndByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a)
sepEndByNonEmpty p sep = (:|) <$> p <*> ((sep *> sepEndBy p sep) <|> pure [])

sepEndByNonEmptyAnn :: Alternative m => m (Ann SurroundingText a) -> m String -> m (NonEmpty (Ann SurroundingText a))
sepEndByNonEmptyAnn p sep = do
x <- p
(trailing, xs) <-
( (,) <$> sep <*> sepEndByAnn p sep
)
<|> pure (mempty, [])
pure (mapAnn (<> postTrivia trailing) x :| xs)

-- | @sepEndBy p sep@ parses /zero/ or more occurrences of @p@,
-- separated and optionally ended by @sep@, ie. haskell style
-- statements. Returns a list of values returned by @p@.
Expand All @@ -122,6 +153,10 @@ sepEndBy :: Alternative m => m a -> m sep -> m [a]
sepEndBy p sep = toList <$> sepEndByNonEmpty p sep <|> pure []
{-# INLINE sepEndBy #-}

-- | @sepEndByAnn@ is like @sepEndBy@, but it keeps the trivia.
sepEndByAnn :: Alternative m => m (Ann SurroundingText a) -> m String -> m [Ann SurroundingText a]
sepEndByAnn p sep = toList <$> sepEndByNonEmptyAnn p sep <|> pure []

-- | @endByNonEmpty p sep@ parses /one/ or more occurrences of @p@, separated
-- and ended by @sep@. Returns a non-empty list of values returned by @p@.
endByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a)
Expand Down
7 changes: 7 additions & 0 deletions Cabal-syntax/src/Distribution/ExactParsec.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module Distribution.ExactParsec
( ExactParsec (..)
)
where

import Distribution.Parsec
import Distribution.Trivia
17 changes: 14 additions & 3 deletions Cabal-syntax/src/Distribution/FieldGrammar.hs
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# 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 (..)
FieldGrammar
, FieldGrammarWith (..)
, uniqueField
, uniqueField'
, optionalField
, optionalFieldDef
, monoidalField

-- * Concrete grammar implementations
, ParsecFieldGrammar
, ParsecFieldGrammar'
, ParsecFieldGrammarWith'
, parseFieldGrammar
, parseFieldGrammarCheckingStanzas
, fieldGrammarKnownFieldList
, PrettyFieldGrammar
, PrettyFieldGrammar'
, PrettyFieldGrammarWith'
, prettyFieldGrammar

-- * Auxiliary
Expand Down Expand Up @@ -47,8 +53,13 @@ import Distribution.FieldGrammar.Pretty
import Distribution.Fields.Field
import Distribution.Utils.Generic (spanMaybe)

type ParsecFieldGrammar' a = ParsecFieldGrammar a a
type PrettyFieldGrammar' a = PrettyFieldGrammar a a
import qualified Distribution.Types.Modify as Mod

type ParsecFieldGrammarWith' (mod :: Mod.HasAnnotation) a = ParsecFieldGrammar mod a a
type PrettyFieldGrammarWith' (mod :: Mod.HasAnnotation) a = PrettyFieldGrammar mod a a

type ParsecFieldGrammar' a = ParsecFieldGrammar Mod.HasNoAnn a a
type PrettyFieldGrammar' a = PrettyFieldGrammar Mod.HasNoAnn a a

infixl 5 ^^^

Expand Down
Loading