packages feed

extensions 0.0.0.1 → 0.1.0.0

raw patch · 10 files changed

+265/−171 lines, 10 filesdep ~Cabaldep ~basedep ~bytestringPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: Cabal, base, bytestring, colourista, ghc-boot-th, hedgehog, optparse-applicative, text

API changes (from Hackage documentation)

- Extensions.Types: instance GHC.Classes.Ord GHC.LanguageExtensions.Type.Extension

Files

CHANGELOG.md view
@@ -3,6 +3,18 @@ `extensions` uses [PVP Versioning][1]. The changelog is available [on GitHub][2]. ++## 0.1.0.0 — Oct 14, 2022++* [#74](https://github.com/kowainik/extensions/issues/74):+  Support GHC-9.2.+* [#83](https://github.com/kowainik/extensions/issues/83):+  Support GHC-9.4.+* Support `Cabal` `3.4`, `3.6` and `3.8`.+* [#70](https://github.com/kowainik/extensions/issues/70):+  Parse empty lines and spaces in before comments and pragmas in the beginning+  of the file.+ ## 0.0.0.1 — May 9, 2020 🎖️  * Handle one more parsing case.
README.md view
@@ -12,7 +12,7 @@  ## Goals -The `extensions` library provides a lighweight way to get Haskell+The `extensions` library provides a lightweight way to get Haskell LANGUAGE pragmas for Haskell modules. It has the following goals:  1. Be **lightweight**. Dependency footprint is extremely small,@@ -82,10 +82,16 @@ cabal install extensions ``` -or Stack+Stack  ``` stack install extensions+```++or the nix package manager which allows you to use it ad-hoc via `nix-shell -p haskellPackages.extensions --run extensions` or to install via++```+nix-env -iA nixpkgs.haskellPackages.extensions ```  The tool can be used to inspect language extensions in your Haskell
extensions.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.4 name:                extensions-version:             0.0.0.1+version:             0.1.0.0 synopsis:            Parse Haskell Language Extensions description:         Parse Haskell Language Extensions.                      See [README.md](https://github.com/kowainik/extensions#extensions) for more details.@@ -10,20 +10,28 @@ license-file:        LICENSE author:              Veronika Romashkina, Dmitrii Kovanikov maintainer:          Kowainik <xrom.xkov@gmail.com>-copyright:           2020 Kowainik+copyright:           2020-2022 Kowainik category:            GHC, Parsing, Haskell build-type:          Simple extra-doc-files:     README.md                      CHANGELOG.md-tested-with:         GHC == 8.8.3-                     GHC == 8.10.1+tested-with:         GHC == 8.8.4+                     GHC == 8.10.7+                     GHC == 9.0.2+                     GHC == 9.2.4+                     GHC == 9.4.2 +flag executable+  description: Build the extensions executable+  default: True+  manual: True+ source-repository head   type:                git   location:            https://github.com/kowainik/extensions.git  common common-options-  build-depends:       base >= 4.13.0.0 && < 4.15+  build-depends:       base >= 4.13.0.0 && < 4.18    ghc-options:         -Wall                        -Wcompat@@ -41,6 +49,11 @@     ghc-options:       -Wmissing-deriving-strategies   if impl(ghc >= 8.10.1)     ghc-options:       -Wunused-packages+  if impl(ghc >= 9.0)+    ghc-options:       -Winvalid-haddock+  if impl(ghc >= 9.2)+    ghc-options:       -Woperator-whitespace+                       -Wredundant-bang-patterns    default-language:    Haskell2010   default-extensions:  ConstraintKinds@@ -67,27 +80,29 @@                          Extensions.Package                          Extensions.Types -  build-depends:       bytestring ^>= 0.10-                     , Cabal >= 3.0 && < 3.3+  build-depends:       bytestring >= 0.10 && < 0.12+                     , Cabal >= 3.0 && < 3.9                      , containers ^>= 0.6                      , directory ^>= 1.3                      , filepath ^>= 1.4-                     , ghc-boot-th >= 8.8.1 && < 8.11+                     , ghc-boot-th >= 8.8.1 && < 9.5                      , parsec ^>= 3.1-                     , text ^>= 1.2.3+                     , text >= 1.2.3 && < 2.1  executable extensions   import:              common-options+  if !flag(executable)+    buildable: False   hs-source-dirs:      app   main-is:             Main.hs   other-modules:       Cli   build-depends:       extensions                      , base-                     , colourista ^>= 0.1.0.0+                     , colourista >= 0.1 && < 0.3                      , containers                      , directory                      , filepath-                     , optparse-applicative ^>= 0.15+                     , optparse-applicative >= 0.15 && < 0.18                      , text  test-suite extensions-test@@ -103,10 +118,10 @@                      , bytestring                      , containers                      , ghc-boot-th-                     , hedgehog ^>= 1.0+                     , hedgehog >= 1.0 && < 1.3                      , hspec                      , hspec-hedgehog ^>= 0.0.1-                     , text ^>= 1.2+                     , text   ghc-options:         -threaded                        -rtsopts                        -with-rtsopts=-N
src/Extensions.hs view
@@ -1,5 +1,5 @@ {- |-Copyright: (c) 2020 Kowainik+Copyright: (c) 2020-2022 Kowainik SPDX-License-Identifier: MPL-2.0 Maintainer: Kowainik <xrom.xkov@gmail.com> 
src/Extensions/Cabal.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-}  {- |-Copyright: (c) 2020 Kowainik+Copyright: (c) 2020-2022 Kowainik SPDX-License-Identifier: MPL-2.0 Maintainer: Kowainik <xrom.xkov@gmail.com> @@ -28,7 +28,7 @@ import Data.Map.Strict (Map) import Data.Maybe (catMaybes, mapMaybe) import Data.Text (Text)-import Distribution.ModuleName (ModuleName (..), toFilePath)+import Distribution.ModuleName (ModuleName, toFilePath) import Distribution.PackageDescription.Parsec (parseGenericPackageDescription, runParseResult) import Distribution.Parsec.Error (PError, showPError) import Distribution.Types.Benchmark (Benchmark (..))@@ -41,6 +41,9 @@ import Distribution.Types.Library (Library (..)) import Distribution.Types.TestSuite (TestSuite (..)) import Distribution.Types.TestSuiteInterface (TestSuiteInterface (..))+#if MIN_VERSION_Cabal(3,6,0)+import Distribution.Utils.Path (getSymbolicPath)+#endif import GHC.LanguageExtensions.Type (Extension (..)) import System.Directory (doesFileExist) import System.FilePath ((<.>), (</>))@@ -144,7 +147,11 @@ condTreeToExtensions extractModules extractBuildInfo condTree = do     let comp = condTreeData condTree     let buildInfo = extractBuildInfo comp+#if MIN_VERSION_Cabal(3,6,0)+    let srcDirs = getSymbolicPath <$> hsSourceDirs buildInfo+#else     let srcDirs = hsSourceDirs buildInfo+#endif     let modules = extractModules comp ++             map toModulePath (otherModules buildInfo ++ autogenModules buildInfo)     let (safeExts, parsedExtensionsAll) = partitionEithers $ mapMaybe cabalToGhcExtension $ defaultExtensions buildInfo@@ -213,143 +220,168 @@ -- | Convert 'Cabal.KnownExtension' to 'OnOffExtension'. toGhcExtension :: Cabal.KnownExtension -> Maybe Extension toGhcExtension = \case-    Cabal.OverlappingInstances       -> Just OverlappingInstances-    Cabal.UndecidableInstances       -> Just UndecidableInstances-    Cabal.IncoherentInstances        -> Just IncoherentInstances-    Cabal.DoRec                      -> Just RecursiveDo-    Cabal.RecursiveDo                -> Just RecursiveDo-    Cabal.ParallelListComp           -> Just ParallelListComp-    Cabal.MultiParamTypeClasses      -> Just MultiParamTypeClasses-    Cabal.MonomorphismRestriction    -> Just MonomorphismRestriction-    Cabal.FunctionalDependencies     -> Just FunctionalDependencies-    Cabal.Rank2Types                 -> Just RankNTypes-    Cabal.RankNTypes                 -> Just RankNTypes-    Cabal.PolymorphicComponents      -> Just RankNTypes-    Cabal.ExistentialQuantification  -> Just ExistentialQuantification-    Cabal.ScopedTypeVariables        -> Just ScopedTypeVariables-    Cabal.PatternSignatures          -> Just ScopedTypeVariables-    Cabal.ImplicitParams             -> Just ImplicitParams-    Cabal.FlexibleContexts           -> Just FlexibleContexts-    Cabal.FlexibleInstances          -> Just FlexibleInstances-    Cabal.EmptyDataDecls             -> Just EmptyDataDecls-    Cabal.CPP                        -> Just Cpp-    Cabal.KindSignatures             -> Just KindSignatures-    Cabal.BangPatterns               -> Just BangPatterns-    Cabal.TypeSynonymInstances       -> Just TypeSynonymInstances-    Cabal.TemplateHaskell            -> Just TemplateHaskell-    Cabal.ForeignFunctionInterface   -> Just ForeignFunctionInterface-    Cabal.Arrows                     -> Just Arrows-    Cabal.ImplicitPrelude            -> Just ImplicitPrelude-    Cabal.PatternGuards              -> Just PatternGuards-    Cabal.GeneralizedNewtypeDeriving -> Just GeneralizedNewtypeDeriving-    Cabal.GeneralisedNewtypeDeriving -> Just GeneralizedNewtypeDeriving-    Cabal.MagicHash                  -> Just MagicHash-    Cabal.TypeFamilies               -> Just TypeFamilies-    Cabal.StandaloneDeriving         -> Just StandaloneDeriving-    Cabal.UnicodeSyntax              -> Just UnicodeSyntax-    Cabal.UnliftedFFITypes           -> Just UnliftedFFITypes-    Cabal.InterruptibleFFI           -> Just InterruptibleFFI-    Cabal.CApiFFI                    -> Just CApiFFI-    Cabal.LiberalTypeSynonyms        -> Just LiberalTypeSynonyms-    Cabal.TypeOperators              -> Just TypeOperators-    Cabal.RecordWildCards            -> Just RecordWildCards-    Cabal.RecordPuns                 -> Just RecordPuns-    Cabal.NamedFieldPuns             -> Just RecordPuns-    Cabal.DisambiguateRecordFields   -> Just DisambiguateRecordFields-    Cabal.TraditionalRecordSyntax    -> Just TraditionalRecordSyntax-    Cabal.OverloadedStrings          -> Just OverloadedStrings-    Cabal.GADTs                      -> Just GADTs-    Cabal.GADTSyntax                 -> Just GADTSyntax-    Cabal.RelaxedPolyRec             -> Just RelaxedPolyRec-    Cabal.ExtendedDefaultRules       -> Just ExtendedDefaultRules-    Cabal.UnboxedTuples              -> Just UnboxedTuples-    Cabal.DeriveDataTypeable         -> Just DeriveDataTypeable-    Cabal.AutoDeriveTypeable         -> Just DeriveDataTypeable-    Cabal.DeriveGeneric              -> Just DeriveGeneric-    Cabal.DefaultSignatures          -> Just DefaultSignatures-    Cabal.InstanceSigs               -> Just InstanceSigs-    Cabal.ConstrainedClassMethods    -> Just ConstrainedClassMethods-    Cabal.PackageImports             -> Just PackageImports-    Cabal.ImpredicativeTypes         -> Just ImpredicativeTypes-    Cabal.PostfixOperators           -> Just PostfixOperators-    Cabal.QuasiQuotes                -> Just QuasiQuotes-    Cabal.TransformListComp          -> Just TransformListComp-    Cabal.MonadComprehensions        -> Just MonadComprehensions-    Cabal.ViewPatterns               -> Just ViewPatterns-    Cabal.TupleSections              -> Just TupleSections-    Cabal.GHCForeignImportPrim       -> Just GHCForeignImportPrim-    Cabal.NPlusKPatterns             -> Just NPlusKPatterns-    Cabal.DoAndIfThenElse            -> Just DoAndIfThenElse-    Cabal.MultiWayIf                 -> Just MultiWayIf-    Cabal.LambdaCase                 -> Just LambdaCase-    Cabal.RebindableSyntax           -> Just RebindableSyntax-    Cabal.ExplicitForAll             -> Just ExplicitForAll-    Cabal.DatatypeContexts           -> Just DatatypeContexts-    Cabal.MonoLocalBinds             -> Just MonoLocalBinds-    Cabal.DeriveFunctor              -> Just DeriveFunctor-    Cabal.DeriveTraversable          -> Just DeriveTraversable-    Cabal.DeriveFoldable             -> Just DeriveFoldable-    Cabal.NondecreasingIndentation   -> Just NondecreasingIndentation-    Cabal.ConstraintKinds            -> Just ConstraintKinds-    Cabal.PolyKinds                  -> Just PolyKinds-    Cabal.DataKinds                  -> Just DataKinds-    Cabal.ParallelArrays             -> Just ParallelArrays-    Cabal.RoleAnnotations            -> Just RoleAnnotations-    Cabal.OverloadedLists            -> Just OverloadedLists-    Cabal.EmptyCase                  -> Just EmptyCase-    Cabal.NegativeLiterals           -> Just NegativeLiterals-    Cabal.BinaryLiterals             -> Just BinaryLiterals-    Cabal.NumDecimals                -> Just NumDecimals-    Cabal.NullaryTypeClasses         -> Just NullaryTypeClasses-    Cabal.ExplicitNamespaces         -> Just ExplicitNamespaces-    Cabal.AllowAmbiguousTypes        -> Just AllowAmbiguousTypes-    Cabal.JavaScriptFFI              -> Just JavaScriptFFI-    Cabal.PatternSynonyms            -> Just PatternSynonyms-    Cabal.PartialTypeSignatures      -> Just PartialTypeSignatures-    Cabal.NamedWildCards             -> Just NamedWildCards-    Cabal.DeriveAnyClass             -> Just DeriveAnyClass-    Cabal.DeriveLift                 -> Just DeriveLift-    Cabal.StaticPointers             -> Just StaticPointers-    Cabal.StrictData                 -> Just StrictData-    Cabal.Strict                     -> Just Strict-    Cabal.ApplicativeDo              -> Just ApplicativeDo-    Cabal.DuplicateRecordFields      -> Just DuplicateRecordFields-    Cabal.TypeApplications           -> Just TypeApplications-    Cabal.TypeInType                 -> Just TypeInType-    Cabal.UndecidableSuperClasses    -> Just UndecidableSuperClasses-    Cabal.MonadFailDesugaring        -> Just MonadFailDesugaring-    Cabal.TemplateHaskellQuotes      -> Just TemplateHaskellQuotes-    Cabal.OverloadedLabels           -> Just OverloadedLabels-    Cabal.TypeFamilyDependencies     -> Just TypeFamilyDependencies-    Cabal.DerivingStrategies         -> Just DerivingStrategies-    Cabal.DerivingVia                -> Just DerivingVia-    Cabal.UnboxedSums                -> Just UnboxedSums-    Cabal.HexFloatLiterals           -> Just HexFloatLiterals-    Cabal.BlockArguments             -> Just BlockArguments-    Cabal.NumericUnderscores         -> Just NumericUnderscores-    Cabal.QuantifiedConstraints      -> Just QuantifiedConstraints-    Cabal.StarIsType                 -> Just StarIsType-    Cabal.EmptyDataDeriving          -> Just EmptyDataDeriving+    Cabal.OverlappingInstances              -> Just OverlappingInstances+    Cabal.UndecidableInstances              -> Just UndecidableInstances+    Cabal.IncoherentInstances               -> Just IncoherentInstances+    Cabal.DoRec                             -> Just RecursiveDo+    Cabal.RecursiveDo                       -> Just RecursiveDo+    Cabal.ParallelListComp                  -> Just ParallelListComp+    Cabal.MultiParamTypeClasses             -> Just MultiParamTypeClasses+    Cabal.MonomorphismRestriction           -> Just MonomorphismRestriction+    Cabal.FunctionalDependencies            -> Just FunctionalDependencies+    Cabal.Rank2Types                        -> Just RankNTypes+    Cabal.RankNTypes                        -> Just RankNTypes+    Cabal.PolymorphicComponents             -> Just RankNTypes+    Cabal.ExistentialQuantification         -> Just ExistentialQuantification+    Cabal.ScopedTypeVariables               -> Just ScopedTypeVariables+    Cabal.PatternSignatures                 -> Just ScopedTypeVariables+    Cabal.ImplicitParams                    -> Just ImplicitParams+    Cabal.FlexibleContexts                  -> Just FlexibleContexts+    Cabal.FlexibleInstances                 -> Just FlexibleInstances+    Cabal.EmptyDataDecls                    -> Just EmptyDataDecls+    Cabal.CPP                               -> Just Cpp+    Cabal.KindSignatures                    -> Just KindSignatures+    Cabal.BangPatterns                      -> Just BangPatterns+    Cabal.TypeSynonymInstances              -> Just TypeSynonymInstances+    Cabal.TemplateHaskell                   -> Just TemplateHaskell+    Cabal.ForeignFunctionInterface          -> Just ForeignFunctionInterface+    Cabal.Arrows                            -> Just Arrows+    Cabal.ImplicitPrelude                   -> Just ImplicitPrelude+    Cabal.PatternGuards                     -> Just PatternGuards+    Cabal.GeneralizedNewtypeDeriving        -> Just GeneralizedNewtypeDeriving+    Cabal.GeneralisedNewtypeDeriving        -> Just GeneralizedNewtypeDeriving+    Cabal.MagicHash                         -> Just MagicHash+    Cabal.TypeFamilies                      -> Just TypeFamilies+    Cabal.StandaloneDeriving                -> Just StandaloneDeriving+    Cabal.UnicodeSyntax                     -> Just UnicodeSyntax+    Cabal.UnliftedFFITypes                  -> Just UnliftedFFITypes+    Cabal.InterruptibleFFI                  -> Just InterruptibleFFI+    Cabal.CApiFFI                           -> Just CApiFFI+    Cabal.LiberalTypeSynonyms               -> Just LiberalTypeSynonyms+    Cabal.TypeOperators                     -> Just TypeOperators+    Cabal.RecordWildCards                   -> Just RecordWildCards+#if MIN_VERSION_ghc_boot_th(9,4,1)+    Cabal.RecordPuns                        -> Just NamedFieldPuns+    Cabal.NamedFieldPuns                    -> Just NamedFieldPuns+#else+    Cabal.RecordPuns                        -> Just RecordPuns+    Cabal.NamedFieldPuns                    -> Just RecordPuns+#endif+    Cabal.DisambiguateRecordFields          -> Just DisambiguateRecordFields+    Cabal.TraditionalRecordSyntax           -> Just TraditionalRecordSyntax+    Cabal.OverloadedStrings                 -> Just OverloadedStrings+    Cabal.GADTs                             -> Just GADTs+    Cabal.GADTSyntax                        -> Just GADTSyntax+    Cabal.RelaxedPolyRec                    -> Just RelaxedPolyRec+    Cabal.ExtendedDefaultRules              -> Just ExtendedDefaultRules+    Cabal.UnboxedTuples                     -> Just UnboxedTuples+    Cabal.DeriveDataTypeable                -> Just DeriveDataTypeable+    Cabal.AutoDeriveTypeable                -> Just DeriveDataTypeable+    Cabal.DeriveGeneric                     -> Just DeriveGeneric+    Cabal.DefaultSignatures                 -> Just DefaultSignatures+    Cabal.InstanceSigs                      -> Just InstanceSigs+    Cabal.ConstrainedClassMethods           -> Just ConstrainedClassMethods+    Cabal.PackageImports                    -> Just PackageImports+    Cabal.ImpredicativeTypes                -> Just ImpredicativeTypes+    Cabal.PostfixOperators                  -> Just PostfixOperators+    Cabal.QuasiQuotes                       -> Just QuasiQuotes+    Cabal.TransformListComp                 -> Just TransformListComp+    Cabal.MonadComprehensions               -> Just MonadComprehensions+    Cabal.ViewPatterns                      -> Just ViewPatterns+    Cabal.TupleSections                     -> Just TupleSections+    Cabal.GHCForeignImportPrim              -> Just GHCForeignImportPrim+    Cabal.NPlusKPatterns                    -> Just NPlusKPatterns+    Cabal.DoAndIfThenElse                   -> Just DoAndIfThenElse+    Cabal.MultiWayIf                        -> Just MultiWayIf+    Cabal.LambdaCase                        -> Just LambdaCase+    Cabal.RebindableSyntax                  -> Just RebindableSyntax+    Cabal.ExplicitForAll                    -> Just ExplicitForAll+    Cabal.DatatypeContexts                  -> Just DatatypeContexts+    Cabal.MonoLocalBinds                    -> Just MonoLocalBinds+    Cabal.DeriveFunctor                     -> Just DeriveFunctor+    Cabal.DeriveTraversable                 -> Just DeriveTraversable+    Cabal.DeriveFoldable                    -> Just DeriveFoldable+    Cabal.NondecreasingIndentation          -> Just NondecreasingIndentation+    Cabal.ConstraintKinds                   -> Just ConstraintKinds+    Cabal.PolyKinds                         -> Just PolyKinds+    Cabal.DataKinds                         -> Just DataKinds+    Cabal.ParallelArrays                    -> Just ParallelArrays+    Cabal.RoleAnnotations                   -> Just RoleAnnotations+    Cabal.OverloadedLists                   -> Just OverloadedLists+    Cabal.EmptyCase                         -> Just EmptyCase+    Cabal.NegativeLiterals                  -> Just NegativeLiterals+    Cabal.BinaryLiterals                    -> Just BinaryLiterals+    Cabal.NumDecimals                       -> Just NumDecimals+    Cabal.NullaryTypeClasses                -> Just NullaryTypeClasses+    Cabal.ExplicitNamespaces                -> Just ExplicitNamespaces+    Cabal.AllowAmbiguousTypes               -> Just AllowAmbiguousTypes+    Cabal.JavaScriptFFI                     -> Just JavaScriptFFI+    Cabal.PatternSynonyms                   -> Just PatternSynonyms+    Cabal.PartialTypeSignatures             -> Just PartialTypeSignatures+    Cabal.NamedWildCards                    -> Just NamedWildCards+    Cabal.DeriveAnyClass                    -> Just DeriveAnyClass+    Cabal.DeriveLift                        -> Just DeriveLift+    Cabal.StaticPointers                    -> Just StaticPointers+    Cabal.StrictData                        -> Just StrictData+    Cabal.Strict                            -> Just Strict+    Cabal.ApplicativeDo                     -> Just ApplicativeDo+    Cabal.DuplicateRecordFields             -> Just DuplicateRecordFields+    Cabal.TypeApplications                  -> Just TypeApplications+    Cabal.TypeInType                        -> Just TypeInType+    Cabal.UndecidableSuperClasses           -> Just UndecidableSuperClasses+#if MIN_VERSION_ghc_boot_th(9,2,1)+    Cabal.MonadFailDesugaring               -> Nothing+#else+    Cabal.MonadFailDesugaring               -> Just MonadFailDesugaring+#endif+    Cabal.TemplateHaskellQuotes             -> Just TemplateHaskellQuotes+    Cabal.OverloadedLabels                  -> Just OverloadedLabels+    Cabal.TypeFamilyDependencies            -> Just TypeFamilyDependencies+    Cabal.DerivingStrategies                -> Just DerivingStrategies+    Cabal.DerivingVia                       -> Just DerivingVia+    Cabal.UnboxedSums                       -> Just UnboxedSums+    Cabal.HexFloatLiterals                  -> Just HexFloatLiterals+    Cabal.BlockArguments                    -> Just BlockArguments+    Cabal.NumericUnderscores                -> Just NumericUnderscores+    Cabal.QuantifiedConstraints             -> Just QuantifiedConstraints+    Cabal.StarIsType                        -> Just StarIsType+    Cabal.EmptyDataDeriving                 -> Just EmptyDataDeriving #if __GLASGOW_HASKELL__ >= 810-    Cabal.CUSKs                    -> Just CUSKs-    Cabal.ImportQualifiedPost      -> Just ImportQualifiedPost-    Cabal.StandaloneKindSignatures -> Just StandaloneKindSignatures-    Cabal.UnliftedNewtypes         -> Just UnliftedNewtypes+    Cabal.CUSKs                             -> Just CUSKs+    Cabal.ImportQualifiedPost               -> Just ImportQualifiedPost+    Cabal.StandaloneKindSignatures          -> Just StandaloneKindSignatures+    Cabal.UnliftedNewtypes                  -> Just UnliftedNewtypes #endif+#if __GLASGOW_HASKELL__ >= 900+    Cabal.LexicalNegation                   -> Just LexicalNegation+    Cabal.QualifiedDo                       -> Just QualifiedDo+    Cabal.LinearTypes                       -> Just LinearTypes+#endif+#if __GLASGOW_HASKELL__ >= 902+    Cabal.FieldSelectors                    -> Just FieldSelectors+    Cabal.OverloadedRecordDot               -> Just OverloadedRecordDot+    Cabal.UnliftedDatatypes                 -> Just UnliftedDatatypes+#endif+#if __GLASGOW_HASKELL__ >= 904+    Cabal.OverloadedRecordUpdate            -> Just OverloadedRecordUpdate+    Cabal.AlternativeLayoutRule             -> Just AlternativeLayoutRule+    Cabal.AlternativeLayoutRuleTransitional -> Just AlternativeLayoutRuleTransitional+    Cabal.RelaxedLayout                     -> Just RelaxedLayout+#endif     -- GHC extensions, parsed by both Cabal and GHC, but don't have an Extension constructor-    Cabal.Safe                   -> Nothing-    Cabal.Trustworthy            -> Nothing-    Cabal.Unsafe                 -> Nothing+    Cabal.Safe                              -> Nothing+    Cabal.Trustworthy                       -> Nothing+    Cabal.Unsafe                            -> Nothing     -- non-GHC extensions-    Cabal.Generics               -> Nothing-    Cabal.ExtensibleRecords      -> Nothing-    Cabal.RestrictedTypeSynonyms -> Nothing-    Cabal.HereDocuments          -> Nothing-    Cabal.MonoPatBinds           -> Nothing-    Cabal.XmlSyntax              -> Nothing-    Cabal.RegularPatterns        -> Nothing-    Cabal.SafeImports            -> Nothing-    Cabal.NewQualifiedOperators  -> Nothing+    Cabal.Generics                          -> Nothing+    Cabal.ExtensibleRecords                 -> Nothing+    Cabal.RestrictedTypeSynonyms            -> Nothing+    Cabal.HereDocuments                     -> Nothing+    Cabal.MonoPatBinds                      -> Nothing+    Cabal.XmlSyntax                         -> Nothing+    Cabal.RegularPatterns                   -> Nothing+    Cabal.SafeImports                       -> Nothing+    Cabal.NewQualifiedOperators             -> Nothing  -- | Convert 'Cabal.KnownExtension' to 'SafeHaskellExtension'. toSafeExtensions :: Cabal.KnownExtension -> Maybe SafeHaskellExtension
src/Extensions/Module.hs view
@@ -1,5 +1,5 @@ {- |-Copyright: (c) 2020 Kowainik+Copyright: (c) 2020-2022 Kowainik SPDX-License-Identifier: MPL-2.0 Maintainer: Kowainik <xrom.xkov@gmail.com> @@ -31,7 +31,7 @@ import Data.List.NonEmpty (NonEmpty (..)) import System.Directory (doesFileExist) import Text.Parsec (alphaNum, between, char, eof, many, many1, manyTill, noneOf, oneOf, parse,-                    sepBy1, try, (<|>))+                    sepBy1, skipMany, try, (<|>)) import Text.Parsec.ByteString (Parser) import Text.Parsec.Char (anyChar, endOfLine, letter, newline, space, spaces, string) import Text.Read (readMaybe)@@ -106,9 +106,12 @@ the function/import/module name. -} extensionsP :: Parser [ParsedExtension]-extensionsP = concat <$> manyTill-    (try singleExtensionsP <|> try optionsGhcP <|> try commentP <|> try cppP)-    (eof <|> (() <$ manyTill endOfLine letter))+extensionsP = concat <$>+    ( newLines *>+      manyTill+        (try singleExtensionsP <|> try optionsGhcP <|> try commentP <|> try cppP)+        (eof <|> (() <$ manyTill endOfLine letter))+    )  {- | Single LANGUAGE pragma parser. @@ -124,7 +127,7 @@     languagePragmaP (commaSep (nonExtP *> extensionP <* nonExtP) <* spaces)  nonExtP :: Parser ()-nonExtP = () <$ many (try cppP <|> try commentP)+nonExtP = skipMany (try cppP <|> try commentP)  {- | Parses all known and unknown 'OnOffExtension's or 'SafeHaskellExtension's. -}@@ -165,7 +168,7 @@  -- | Comma separated parser. Newlines and spaces are allowed around comma. commaSep :: Parser a -> Parser [a]-commaSep p = p `sepBy1` (try $ newLines *> char ',' <* newLines)+commaSep p = p `sepBy1` try (newLines *> char ',' <* newLines)  {- | Haskell comment parser. Supports both single-line comments:@@ -211,4 +214,4 @@  -- | Any combination of spaces and newlines. newLines :: Parser ()-newLines = () <$ many (space <|> endOfLine)+newLines = skipMany (space <|> endOfLine)
src/Extensions/Package.hs view
@@ -1,5 +1,5 @@ {- |-Copyright: (c) 2020 Kowainik+Copyright: (c) 2020-2022 Kowainik SPDX-License-Identifier: MPL-2.0 Maintainer: Kowainik <xrom.xkov@gmail.com> 
src/Extensions/Types.hs view
@@ -1,9 +1,10 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE CPP            #-} {-# LANGUAGE DeriveAnyClass #-}  {- |-Copyright: (c) 2020 Kowainik+Copyright: (c) 2020-2022 Kowainik SPDX-License-Identifier: MPL-2.0 Maintainer: Kowainik <xrom.xkov@gmail.com> @@ -172,7 +173,9 @@     showExtension :: Extension -> Text     showExtension = \case         Cpp        -> "CPP"+#if !MIN_VERSION_ghc_boot_th(9,4,1)         RecordPuns -> "NamedFieldPuns"+#endif         ext        -> Text.pack $ show ext  {- | Parse 'OnOffExtension' from a string that specifies extension.@@ -192,12 +195,14 @@ readExtension :: String -> Maybe Extension readExtension = \case     "GeneralisedNewtypeDeriving" -> Just GeneralizedNewtypeDeriving-    "NamedFieldPuns" -> Just RecordPuns-    "RecordPuns" -> Nothing-    "Rank2Types" -> Just RankNTypes-    "CPP" -> Just Cpp-    "Cpp" -> Nothing-    s -> readMaybe s+#if !MIN_VERSION_ghc_boot_th(9,4,1)+    "NamedFieldPuns"             -> Just RecordPuns+    "RecordPuns"                 -> Nothing+#endif+    "Rank2Types"                 -> Just RankNTypes+    "CPP"                        -> Just Cpp+    "Cpp"                        -> Nothing+    s                            -> readMaybe s  {- | Take accumulated 'OnOffExtension's, and merge them into one 'Set', excluding enabling of 'default2010Extensions'.@@ -264,7 +269,12 @@     , PatternGuards     , DoAndIfThenElse     , RelaxedPolyRec+#if __GLASGOW_HASKELL__ >= 810+    , CUSKs+#endif     ]  deriving stock instance Read Extension-deriving stock instance Ord  Extension+#if __GLASGOW_HASKELL__ < 900+deriving stock instance Ord Extension+#endif
test/Test/Extensions.hs view
@@ -53,15 +53,15 @@ resultMap :: Map FilePath ExtensionsResult resultMap = Map.fromList     [ "app/Cli.hs"                     `to` Right-        (extsPlus $ Set.singleton (On ApplicativeDo))+        (extsPlus $ Set.singleton $ On ApplicativeDo)     , "app/Main.hs"                    `to` Right exts     , "src/Extensions.hs"              `to` Right exts     , "src/Extensions/Cabal.hs"        `to` Right-        (extsPlus $ Set.singleton $ On Cpp )+        (extsPlus $ Set.singleton $ On Cpp)     , "src/Extensions/Module.hs"       `to` Right exts     , "src/Extensions/Package.hs"      `to` Right exts     , "src/Extensions/Types.hs"        `to` Right-        (extsPlus $ Set.singleton $ On DeriveAnyClass )+        (extsPlus $ Set.fromList [On Cpp, On DeriveAnyClass])     , "test/Test/Extensions.hs"        `to` Right exts     , "test/Test/Extensions/Cabal.hs"  `to` Right exts     , "test/Test/Extensions/Module.hs" `to` Right exts
test/Test/Extensions/Module.hs view
@@ -177,6 +177,22 @@         "{- Haskelll -} {-# {- extension -} LANGUAGE {- called -} LambdaCase {- and nothing else -} #-} {- matters -}"         [LambdaCase]     itShouldParse (unlines+        [ ""+        , "{- |"+        , "Hello"+        , "-}"+        , "{-# LANGUAGE CPP #-}"+        ])+        [Cpp]+    itShouldParse (unlines+        [ ""+        , "-- | Hey"+        , "-- Hello"+        , "--"+        , "module Abc"+        ])+        []+    itShouldParse (unlines         [ "{-# LANGUAGE   TypeApplications  , LambdaCase   #-}"         , "{- hello -}"         ])