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 +12/−0
- README.md +8/−2
- extensions.cabal +28/−13
- src/Extensions.hs +1/−1
- src/Extensions/Cabal.hs +167/−135
- src/Extensions/Module.hs +11/−8
- src/Extensions/Package.hs +1/−1
- src/Extensions/Types.hs +18/−8
- test/Test/Extensions.hs +3/−3
- test/Test/Extensions/Module.hs +16/−0
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 -}" ])