Skip to content

Commit 5a3308a

Browse files
committed
RFC: patchLegacy
1 parent f46fa98 commit 5a3308a

File tree

6 files changed

+37
-27
lines changed

6 files changed

+37
-27
lines changed

Cabal/Cabal.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ library
271271
Distribution.Compat.Parsec
272272
Distribution.PackageDescription.Parsec
273273
Distribution.PackageDescription.Parsec.FieldDescr
274+
Distribution.PackageDescription.Parsec.Legacy
274275
Distribution.Parsec.Class
275276
Distribution.Parsec.ConfVar
276277
Distribution.Parsec.Lexer
@@ -411,7 +412,7 @@ test-suite parser-hackage-tests
411412

412413
if flag(parsec-struct-diff)
413414
build-depends:
414-
generics-sop ==0.2.*,
415+
generics-sop >= 0.2.5 && <0.3,
415416
these >=0.7.1 && <0.8,
416417
singleton-bool >=0.1.1.0 && <0.2,
417418
keys

Cabal/Distribution/PackageDescription/Parsec.hs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import qualified Data.Map as Map
3838
import qualified Distribution.Compat.SnocList as SnocList
3939
import Distribution.PackageDescription
4040
import Distribution.PackageDescription.Parsec.FieldDescr
41+
import Distribution.PackageDescription.Parsec.Legacy (patchLegacy)
4142
import Distribution.Parsec.Class (parsec)
4243
import Distribution.Parsec.ConfVar
4344
(parseConditionConfVar)
@@ -103,10 +104,15 @@ readGenericPackageDescription = readAndParseFile parseGenericPackageDescription
103104
--
104105
-- TODO: add lex warnings
105106
parseGenericPackageDescription :: BS.ByteString -> ParseResult GenericPackageDescription
106-
parseGenericPackageDescription bs = case readFields' bs of
107-
Right (fs, lexWarnings) -> parseGenericPackageDescription' lexWarnings fs
107+
parseGenericPackageDescription bs = case readFields' bs' of
108+
Right (fs, lexWarnings) -> do
109+
when patched $
110+
parseWarning zeroPos PWTLegacyCabalFile "Legacy cabal file"
111+
parseGenericPackageDescription' lexWarnings fs
108112
-- TODO: better marshalling of errors
109-
Left perr -> parseFatalFailure (Position 0 0) (show perr)
113+
Left perr -> parseFatalFailure zeroPos (show perr)
114+
where
115+
(patched, bs') = patchLegacy bs
110116

111117
-- | 'Maybe' variant of 'parseGenericPackageDescription'
112118
parseGenericPackageDescriptionMaybe :: BS.ByteString -> Maybe GenericPackageDescription

Cabal/Distribution/Parsec/Types/Common.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module Distribution.Parsec.Types.Common (
1313
incPos,
1414
retPos,
1515
showPos,
16+
zeroPos,
1617
) where
1718

1819
import Prelude ()
@@ -45,6 +46,7 @@ data PWarnType
4546
| PWTExtraBenchmarkModule -- ^ extra benchmark-module field
4647
| PWTLexNBSP
4748
| PWTLexBOM
49+
| PWTLegacyCabalFile -- ^ legacy cabal file that we know how to patch
4850
deriving (Eq, Ord, Show, Enum, Bounded)
4951

5052
-- | Parser warning.
@@ -87,3 +89,6 @@ retPos (Position row _col) = Position (row + 1) 1
8789

8890
showPos :: Position -> String
8991
showPos (Position row col) = show row ++ ":" ++ show col
92+
93+
zeroPos :: Position
94+
zeroPos = Position 0 0

Cabal/tests/DiffInstances.hs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@ import Distribution.Package
1717
import Distribution.Types.ForeignLib
1818
import Distribution.Types.ForeignLibOption
1919
import Distribution.Types.ForeignLibType
20+
import Distribution.Types.IncludeRenaming (IncludeRenaming)
2021
import Distribution.PackageDescription
21-
(Benchmark, BenchmarkInterface, BenchmarkType, BuildInfo,
22-
BuildType, CondTree, Condition, Executable, Flag, FlagName,
23-
GenericPackageDescription, Library, ModuleReexport,
24-
ModuleRenaming, PackageDescription, RepoKind, RepoType,
25-
SetupBuildInfo, SourceRepo, TestSuite, TestSuiteInterface,
26-
TestType)
27-
import Distribution.Types.IncludeRenaming (IncludeRenaming)
22+
import Distribution.Types.CondTree
23+
import Distribution.Types.ExeDependency
24+
import Distribution.Types.ExecutableScope
25+
import Distribution.Types.LegacyExeDependency
26+
import Distribution.Types.Mixin
27+
import Distribution.Types.PkgconfigDependency
28+
import Distribution.Types.UnqualComponentName
2829
import Distribution.Version (Version, VersionRange)
2930
import Language.Haskell.Extension
3031
(Extension, KnownExtension, Language)
@@ -39,6 +40,7 @@ deriveGeneric ''BenchmarkType
3940
deriveGeneric ''BuildInfo
4041
deriveGeneric ''BuildType
4142
deriveGeneric ''CompilerFlavor
43+
deriveGeneric ''CondBranch
4244
deriveGeneric ''CondTree
4345
deriveGeneric ''Dependency
4446
deriveGeneric ''Executable
@@ -48,6 +50,7 @@ deriveGeneric ''ForeignLib
4850
deriveGeneric ''ForeignLibOption
4951
deriveGeneric ''ForeignLibType
5052
deriveGeneric ''GenericPackageDescription
53+
deriveGeneric ''IncludeRenaming
5154
deriveGeneric ''KnownExtension
5255
deriveGeneric ''Language
5356
deriveGeneric ''Library
@@ -65,10 +68,10 @@ deriveGeneric ''TestSuite
6568
deriveGeneric ''TestSuiteInterface
6669
deriveGeneric ''TestType
6770
deriveGeneric ''VersionRange
68-
deriveGeneric ''IncludeRenaming
6971

7072
instance (Eq a, Show a) => Diff (Condition a) where diff = eqDiff
7173
instance (Show a, Diff b, Diff c, Show b, Show c, Eq a, Eq c, Eq b) => Diff (CondTree a b c)
74+
instance (Show a, Diff b, Diff c, Show b, Show c, Eq a, Eq c, Eq b) => Diff (CondBranch a b c)
7275

7376
instance Diff Benchmark
7477
instance Diff BenchmarkInterface
@@ -77,31 +80,38 @@ instance Diff BuildInfo
7780
instance Diff BuildType
7881
instance Diff CompilerFlavor
7982
instance Diff Dependency
83+
instance Diff ExeDependency where diff = eqDiff
8084
instance Diff Executable
85+
instance Diff ExecutableScope where diff = eqDiff
8186
instance Diff Extension
8287
instance Diff Flag
8388
instance Diff FlagName where diff = eqDiff
8489
instance Diff ForeignLib
85-
instance Diff ForeignLibType
8690
instance Diff ForeignLibOption
91+
instance Diff ForeignLibType
8792
instance Diff GenericPackageDescription
93+
instance Diff IncludeRenaming
8894
instance Diff KnownExtension
8995
instance Diff Language
96+
instance Diff LegacyExeDependency where diff = eqDiff
97+
instance Diff LibVersionInfo where diff = eqDiff
9098
instance Diff Library
9199
instance Diff License
100+
instance Diff Mixin where diff = eqDiff
92101
instance Diff ModuleName where diff = eqDiff
93102
instance Diff ModuleReexport
94103
instance Diff ModuleRenaming
95104
instance Diff PackageDescription
96105
instance Diff PackageIdentifier
97106
instance Diff PackageName where diff = eqDiff
107+
instance Diff PkgconfigDependency where diff = eqDiff
98108
instance Diff RepoKind
99109
instance Diff RepoType
100110
instance Diff SetupBuildInfo
101111
instance Diff SourceRepo
102112
instance Diff TestSuite
103113
instance Diff TestSuiteInterface
104114
instance Diff TestType
115+
instance Diff UnqualComponentName where diff = eqDiff
105116
instance Diff Version where diff = eqDiff
106117
instance Diff VersionRange
107-
instance Diff IncludeRenaming

Cabal/tests/ParserHackageTests.hs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,6 @@ problematicFiles =
197197
, eq "ixset/1.0.4/ixset.cabal"
198198
-- comments in braces
199199
, isPrefixOf "hint/"
200-
-- other-modules:\n .
201-
, eq "unicode-transforms/0.3.3/unicode-transforms.cabal"
202200
]
203201
where
204202
eq = (==)

Cabal/tests/StructDiff.hs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class Diff a where
8585

8686
-- | And generic implementation!
8787
gdiff :: forall a. (Generic a, HasDatatypeInfo a, All2 Diff (Code a)) => a -> a -> DiffResult
88-
gdiff x y = gdiffS (constructorInfo (P :: P a)) (unSOP $ from x) (unSOP $ from y)
88+
gdiff x y = gdiffS (constructorInfo (datatypeInfo (P :: P a))) (unSOP $ from x) (unSOP $ from y)
8989

9090
gdiffS :: All2 Diff xss => NP ConstructorInfo xss -> NS (NP I) xss -> NS (NP I) xss -> DiffResult
9191
gdiffS (c :* _) (Z xs) (Z ys) = mconcat $ hcollapse $ hczipWith3 (P :: P Diff) f (fieldNames c) xs ys
@@ -138,23 +138,13 @@ instance (Ord k, Show k, Diff v, Show v) => Diff (Map k v) where diff = alignDif
138138
-- SOP helpers
139139
-------------------------------------------------------------------------------
140140

141-
constructorInfo :: (HasDatatypeInfo a, xss ~ Code a) => proxy a -> NP ConstructorInfo xss
142-
constructorInfo p = case datatypeInfo p of
143-
ADT _ _ cs -> cs
144-
Newtype _ _ c -> c :* Nil
145-
146141
constructorNameOf :: NP ConstructorInfo xss -> NS f xss -> ConstructorName
147142
constructorNameOf (c :* _) (Z _) = constructorName c
148143
constructorNameOf (_ :* cs) (S xs) = constructorNameOf cs xs
149144
#if __GLASGOW_HASKELL__ < 800
150145
constructorNameOf _ _ = error "Should never happen"
151146
#endif
152147

153-
constructorName :: ConstructorInfo xs -> ConstructorName
154-
constructorName (Constructor name) = name
155-
constructorName (Infix name _ _) = "(" ++ name ++ ")"
156-
constructorName (Record name _) = name
157-
158148
-- | This is a little lie.
159149
fieldNames :: ConstructorInfo xs -> NP (K FieldName) xs
160150
fieldNames (Constructor name) = hpure (K name) -- TODO: add .1 .2 etc.

0 commit comments

Comments
 (0)