ghc-lib-parser-ex 0.20200601 → 0.20200704
raw patch · 10 files changed
+196/−113 lines, 10 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Haskell.GhclibParserEx.Config: fakeLlvmConfig :: LlvmConfig
- Language.Haskell.GhclibParserEx.Config: fakeSettings :: Settings
+ Language.Haskell.GhclibParserEx.GHC.Hs.ImpExp: isImportQualifiedPost :: ImportDeclQualifiedStyle -> Bool
+ Language.Haskell.GhclibParserEx.GHC.Settings.Config: fakeLlvmConfig :: LlvmConfig
+ Language.Haskell.GhclibParserEx.GHC.Settings.Config: fakeSettings :: Settings
+ Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader: isSymbolRdrName :: RdrName -> Bool
Files
- ChangeLog.md +11/−0
- ghc-lib-parser-ex.cabal +3/−2
- src/Language/Haskell/GhclibParserEx/Config.hs +4/−89
- src/Language/Haskell/GhclibParserEx/GHC/Driver/Flags.hs +5/−5
- src/Language/Haskell/GhclibParserEx/GHC/Driver/Session.hs +13/−12
- src/Language/Haskell/GhclibParserEx/GHC/Hs/Expr.hs +4/−0
- src/Language/Haskell/GhclibParserEx/GHC/Hs/ImpExp.hs +20/−1
- src/Language/Haskell/GhclibParserEx/GHC/Settings/Config.hs +96/−0
- src/Language/Haskell/GhclibParserEx/GHC/Types/Name/Reader.hs +6/−1
- test/Test.hs +34/−3
ChangeLog.md view
@@ -1,5 +1,16 @@ # Changelog for ghc-lib-parser-ex +## 0.20200704 released 2020-07-04+- New function `isImportQualifiedPost`++## 8.10.0.15 released 2020-07-04+- New function `isImportQualifiedPost`++## 8.10.0.14 released 2020-06-10+- New function `isSymbolRdrName`+- New module+ - `Language.Haskell.GhclibParserEx.GHC.Settings.Config` to replace `Language.Haskell.GhclibParserEx.Config` (which remains for now but deprecated and will be removed in a future release)+ ## 0.20200601 released 2020-06-01 ## 8.10.0.13 released 2020-05-31
ghc-lib-parser-ex.cabal view
@@ -1,6 +1,6 @@ cabal-version: >= 1.18 name: ghc-lib-parser-ex-version: 0.20200601+version: 0.20200704 description: Please see the README on GitHub at <https://github.com/shayne-fletcher/ghc-lib-parser-ex#readme> homepage: https://github.com/shayne-fletcher/ghc-lib-parser-ex#readme bug-reports: https://github.com/shayne-fletcher/ghc-lib-parser-ex/issues@@ -34,9 +34,9 @@ library exposed-modules:- Language.Haskell.GhclibParserEx.Config Language.Haskell.GhclibParserEx.Dump Language.Haskell.GhclibParserEx.Fixity+ Language.Haskell.GhclibParserEx.GHC.Settings.Config Language.Haskell.GhclibParserEx.GHC.Driver.Flags Language.Haskell.GhclibParserEx.GHC.Driver.Session Language.Haskell.GhclibParserEx.GHC.Hs@@ -51,6 +51,7 @@ Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader Language.Haskell.GhclibParserEx.GHC.Utils.Outputable -- Deprecated and will be removed in a future release.+ Language.Haskell.GhclibParserEx.Config Language.Haskell.GhclibParserEx.Parse Language.Haskell.GhclibParserEx.Outputable other-modules:
src/Language/Haskell/GhclibParserEx/Config.hs view
@@ -1,94 +1,9 @@ -- Copyright (c) 2020, Shayne Fletcher. All rights reserved. -- SPDX-License-Identifier: BSD-3-Clause. -{-# OPTIONS_GHC -Wno-missing-fields #-}-{-# LANGUAGE CPP #-}-#include "ghclib_api.h"-module Language.Haskell.GhclibParserEx.Config(- fakeSettings- , fakeLlvmConfig+module Language.Haskell.GhclibParserEx.Config+ {-# DEPRECATED "Use Language.Haskell.GhclibParserEx.GHC.Settings.Config instead" #-} (+ module Language.Haskell.GhclibParserEx.GHC.Settings.Config )-where--#if defined (GHCLIB_API_811)-import GHC.Settings.Config-import GHC.Driver.Session-import GHC.Utils.Fingerprint-import GHC.Platform-import GHC.Settings-#elif defined (GHCLIB_API_810)-import Config-import DynFlags-import Fingerprint-import GHC.Platform-import ToolSettings-#else-import Config-import DynFlags-import Fingerprint-import Platform-#endif--fakeSettings :: Settings-fakeSettings = Settings-#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)- { sGhcNameVersion=ghcNameVersion- , sFileSettings=fileSettings- , sTargetPlatform=platform- , sPlatformMisc=platformMisc- , sPlatformConstants=platformConstants- , sToolSettings=toolSettings- }-#else- { sTargetPlatform=platform- , sPlatformConstants=platformConstants- , sProjectVersion=cProjectVersion- , sProgramName="ghc"- , sOpt_P_fingerprint=fingerprint0- }-#endif where-#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)- toolSettings = ToolSettings {- toolSettings_opt_P_fingerprint=fingerprint0- }- fileSettings = FileSettings {}- platformMisc = PlatformMisc {}- ghcNameVersion =- GhcNameVersion{ghcNameVersion_programName="ghc"- ,ghcNameVersion_projectVersion=cProjectVersion- }-#endif- platform =- Platform{-#if defined(GHCLIB_API_811)- -- It doesn't matter what values we write here as these fields are- -- not referenced for our purposes. However the fields are strict- -- so we must say something.- platformByteOrder=LittleEndian- , platformHasGnuNonexecStack=True- , platformHasIdentDirective=False- , platformHasSubsectionsViaSymbols=False- , platformIsCrossCompiling=False- , platformLeadingUnderscore=False- ,-#endif-#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)- platformWordSize = PW8- , platformMini = PlatformMini {platformMini_arch=ArchUnknown, platformMini_os=OSUnknown}-#else- platformWordSize=8- , platformOS=OSUnknown-#endif- , platformUnregisterised=True- }- platformConstants =- PlatformConstants{pc_DYNAMIC_BY_DEFAULT=False,pc_WORD_SIZE=8}--#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)-fakeLlvmConfig :: LlvmConfig-fakeLlvmConfig = LlvmConfig [] []-#else-fakeLlvmConfig :: (LlvmTargets, LlvmPasses)-fakeLlvmConfig = ([], [])-#endif+import Language.Haskell.GhclibParserEx.GHC.Settings.Config
src/Language/Haskell/GhclibParserEx/GHC/Driver/Flags.hs view
@@ -3,14 +3,14 @@ #include "ghclib_api.h" module Language.Haskell.GhclibParserEx.GHC.Driver.Flags () where -#if defined(GHCLIB_API_811)-import GHC.Driver.Session-#else+#if !defined(GHCLIB_API_811) import DynFlags #endif --- Oprhan instance until--- https://gitlab.haskell.org/ghc/ghc/merge_requests/2905 lands.+-- This instance landed in+-- https://gitlab.haskell.org/ghc/ghc/merge_requests/2905.+#if defined(GHCLIB_API_808) || defined(GHCLIB_API_810) instance Bounded Language where minBound = Haskell98 maxBound = Haskell2010+#endif
src/Language/Haskell/GhclibParserEx/GHC/Driver/Session.hs view
@@ -7,14 +7,16 @@ module Language.Haskell.GhclibParserEx.GHC.Driver.Session( readExtension , extensionImplications- -- Copied from DynFlags (see- -- https://gitlab.haskell.org/ghc/ghc/merge_requests/2654).+-- Landed in https://gitlab.haskell.org/ghc/ghc/merge_requests/2654.+#if defined (GHCLIB_API_808) || defined (GHCLIB_API_810) , TurnOnFlag, turnOn, turnOff, impliedGFlags, impliedOffGFlags, impliedXFlags- --+#endif , parsePragmasIntoDynFlags ) where +#if defined(GHCLIB_API_808) || defined(GHCLIB_API_810) import qualified GHC.LanguageExtensions as LangExt+#endif #if defined (GHCLIB_API_811) import GHC.Utils.Panic import GHC.Parser.Header@@ -32,14 +34,11 @@ import Data.List import Data.Maybe import qualified Data.Map as Map-#if !defined(GHCLIB_API_811)+-- Landed in https://gitlab.haskell.org/ghc/ghc/merge_requests/2707.+#if defined (GHCLIB_API_808) || defined (GHCLIB_API_810) import Data.Function -- For `compareOn`.--- Oprhan instance until--- https://gitlab.haskell.org/ghc/ghc/merge_requests/2707 lands. instance Ord Extension where compare = compare `on` fromEnum-#else--- Update : It's landed. #endif -- | Parse a GHC extension.@@ -56,7 +55,10 @@ [(show a, ([c | b], [c | not b])) | (a, flag, c) <- impliedXFlags, let b = flag == turnOn] --- Copied from 'ghc/compiler/main/DynFlags.hs'.+-- Landed in+-- https://gitlab.haskell.org/ghc/ghc/merge_requests/2654. Copied from+-- 'ghc/compiler/main/DynFlags.hs'.+#if defined(GHCLIB_API_808) || defined(GHCLIB_API_810) type TurnOnFlag = Bool -- True <=> we are turning the flag on -- False <=> we are turning the flag off@@ -109,7 +111,7 @@ , (LangExt.TypeInType, turnOn, LangExt.PolyKinds) , (LangExt.TypeInType, turnOn, LangExt.KindSignatures) -#if defined(GHCLIB_API_811) || defined(GHCLIB_API_810)+#if defined(GHCLIB_API_810) -- Standalone kind signatures are a replacement for CUSKs. , (LangExt.StandaloneKindSignatures, turnOff, LangExt.CUSKs) #endif@@ -143,8 +145,7 @@ , (LangExt.TemplateHaskell, turnOn, LangExt.TemplateHaskellQuotes) , (LangExt.Strict, turnOn, LangExt.StrictData) ]----+#endif parsePragmasIntoDynFlags :: DynFlags -> ([Extension], [Extension])
src/Language/Haskell/GhclibParserEx/GHC/Hs/Expr.hs view
@@ -99,7 +99,11 @@ isParComp = \case ParStmt{} -> True; _ -> False isMDo :: HsStmtContext Name -> Bool+#if defined(GHCLIB_API_811)+isMDo = \case MDoExpr _ -> True; _ -> False+#else isMDo = \case MDoExpr -> True; _ -> False+#endif isTupleSection :: HsTupArg GhcPs -> Bool isTupleSection = \case Missing{} -> True; _ -> False
src/Language/Haskell/GhclibParserEx/GHC/Hs/ImpExp.hs view
@@ -3,7 +3,14 @@ {-# LANGUAGE CPP #-} #include "ghclib_api.h" module Language.Haskell.GhclibParserEx.GHC.Hs.ImpExp(- isPatSynIE+ isPatSynIE+#if defined (MIN_VERSION_ghc_lib_parser)+# if !MIN_VERSION_ghc_lib_parser(1, 0, 0) || MIN_VERSION_ghc_lib_parser(8, 10, 0)+ , isImportQualifiedPost+# endif+#elif __GLASGOW_HASKELL__ >= 810+ , isImportQualifiedPost+#endif ) where @@ -21,3 +28,15 @@ isPatSynIE :: IEWrappedName RdrName -> Bool isPatSynIE IEPattern{} = True isPatSynIE _ = False++#if defined(MIN_VERSION_ghc_lib_parser)+# if !MIN_VERSION_ghc_lib_parser(1, 0, 0) || MIN_VERSION_ghc_lib_parser(8, 10, 0)+isImportQualifiedPost :: ImportDeclQualifiedStyle -> Bool+isImportQualifiedPost QualifiedPost = True+isImportQualifiedPost _ = False+# endif+#elif __GLASGOW_HASKELL__ >= 810+isImportQualifiedPost :: ImportDeclQualifiedStyle -> Bool+isImportQualifiedPost QualifiedPost = True+isImportQualifiedPost _ = False+#endif
+ src/Language/Haskell/GhclibParserEx/GHC/Settings/Config.hs view
@@ -0,0 +1,96 @@+-- Copyright (c) 2020, Shayne Fletcher. All rights reserved.+-- SPDX-License-Identifier: BSD-3-Clause.++{-# OPTIONS_GHC -Wno-missing-fields #-}+{-# LANGUAGE CPP #-}+#include "ghclib_api.h"++module Language.Haskell.GhclibParserEx.GHC.Settings.Config(+ fakeSettings+ , fakeLlvmConfig+ )+where++#if defined (GHCLIB_API_811)+import GHC.Settings.Config+import GHC.Driver.Session+import GHC.Utils.Fingerprint+import GHC.Platform+import GHC.Settings+#elif defined (GHCLIB_API_810)+import Config+import DynFlags+import Fingerprint+import GHC.Platform+import ToolSettings+#else+import Config+import DynFlags+import Fingerprint+import Platform+#endif++fakeSettings :: Settings+fakeSettings = Settings+#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)+ { sGhcNameVersion=ghcNameVersion+ , sFileSettings=fileSettings+ , sTargetPlatform=platform+ , sPlatformMisc=platformMisc+ , sPlatformConstants=platformConstants+ , sToolSettings=toolSettings+ }+#else+ { sTargetPlatform=platform+ , sPlatformConstants=platformConstants+ , sProjectVersion=cProjectVersion+ , sProgramName="ghc"+ , sOpt_P_fingerprint=fingerprint0+ }+#endif+ where+#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)+ toolSettings = ToolSettings {+ toolSettings_opt_P_fingerprint=fingerprint0+ }+ fileSettings = FileSettings {}+ platformMisc = PlatformMisc {}+ ghcNameVersion =+ GhcNameVersion{ghcNameVersion_programName="ghc"+ ,ghcNameVersion_projectVersion=cProjectVersion+ }+#endif+ platform =+ Platform{+#if defined(GHCLIB_API_811)+ -- It doesn't matter what values we write here as these fields are+ -- not referenced for our purposes. However the fields are strict+ -- so we must say something.+ platformByteOrder=LittleEndian+ , platformHasGnuNonexecStack=True+ , platformHasIdentDirective=False+ , platformHasSubsectionsViaSymbols=False+ , platformIsCrossCompiling=False+ , platformLeadingUnderscore=False+ , platformTablesNextToCode=False+ ,+#endif+#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)+ platformWordSize = PW8+ , platformMini = PlatformMini {platformMini_arch=ArchUnknown, platformMini_os=OSUnknown}+#else+ platformWordSize=8+ , platformOS=OSUnknown+#endif+ , platformUnregisterised=True+ }+ platformConstants =+ PlatformConstants{pc_DYNAMIC_BY_DEFAULT=False,pc_WORD_SIZE=8}++#if defined (GHCLIB_API_811) || defined (GHCLIB_API_810)+fakeLlvmConfig :: LlvmConfig+fakeLlvmConfig = LlvmConfig [] []+#else+fakeLlvmConfig :: (LlvmTargets, LlvmPasses)+fakeLlvmConfig = ([], [])+#endif
src/Language/Haskell/GhclibParserEx/GHC/Types/Name/Reader.hs view
@@ -5,7 +5,7 @@ #include "ghclib_api.h" module Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader(- occNameStr, rdrNameStr, isSpecial, unqual, fromQual+ occNameStr, rdrNameStr, isSpecial, unqual, fromQual, isSymbolRdrName ) where @@ -41,3 +41,8 @@ fromQual (L _ (Qual _ x)) = Just x fromQual (L _ (Unqual x)) = Just x fromQual _ = Nothing++-- Test if the reader name is that of an operator (be it a data+-- constructor, variable or whatever).+isSymbolRdrName :: RdrName -> Bool+isSymbolRdrName = isSymOcc . rdrNameOcc
test/Test.hs view
@@ -17,16 +17,26 @@ import Data.List.Extra import Data.Maybe -import Language.Haskell.GhclibParserEx.Config import Language.Haskell.GhclibParserEx.Dump import Language.Haskell.GhclibParserEx.Fixity+import Language.Haskell.GhclibParserEx.GHC.Settings.Config import Language.Haskell.GhclibParserEx.GHC.Parser import Language.Haskell.GhclibParserEx.GHC.Hs import Language.Haskell.GhclibParserEx.GHC.Hs.ExtendInstances import Language.Haskell.GhclibParserEx.GHC.Hs.Expr import Language.Haskell.GhclibParserEx.GHC.Hs.Pat+-- We only test 'isImportQualifiedPost' at this time which requires >=+-- 8.10; avoid unused import warning.+#if defined (MIN_VERSION_ghc_lib_parser)+# if !MIN_VERSION_ghc_lib_parser(1, 0, 0) || MIN_VERSION_ghc_lib_parser(8, 10, 0)+import Language.Haskell.GhclibParserEx.GHC.Hs.ImpExp+# endif+#elif __GLASGOW_HASKELL__ >= 810+import Language.Haskell.GhclibParserEx.GHC.Hs.ImpExp+#endif import Language.Haskell.GhclibParserEx.GHC.Driver.Flags() import Language.Haskell.GhclibParserEx.GHC.Driver.Session+import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader #if defined (GHCLIB_API_811) || defined (GHCLIB_API_810) import GHC.Hs@@ -39,12 +49,16 @@ import GHC.Parser.Lexer import GHC.Utils.Outputable import GHC.Utils.Error+import GHC.Types.Name.Reader+import GHC.Types.Name.Occurrence #else import SrcLoc import DynFlags import Lexer import Outputable import ErrUtils+import RdrName+import OccName #endif import GHC.LanguageExtensions.Type #if defined (GHCLIB_API_808)@@ -323,6 +337,19 @@ parsePragmasIntoDynFlags flags ([StarIsType], []) foo s >>= \case Left msg -> assertFailure msg Right flags -> chkParseResult report flags $ parseFile foo flags s+#if defined (MIN_VERSION_ghc_lib_parser)+# if !MIN_VERSION_ghc_lib_parser(1, 0, 0) || MIN_VERSION_ghc_lib_parser(8, 10, 0)+ , testCase "ImportQualifiedPost" $ do+ case parseImport "import Foo qualified" (flags `xopt_set` ImportQualifiedPost) of+ POk _ (L _ decl) -> assertBool "expected postpositive" (isImportQualifiedPost . ideclQualified $ decl)+ PFailed _ -> assertFailure "parse error"+# endif+#elif __GLASGOW_HASKELL__ >= 810+ , testCase "ImportQualifiedPost" $ do+ case parseImport "import Foo qualified" (flags `xopt_set` ImportQualifiedPost) of+ POk _ (L _ decl) -> assertBool "expected postpositive" (isImportQualifiedPost . ideclQualified $ decl)+ PFailed _ -> assertFailure "parse error"+#endif ] where flags = unsafeGlobalDynFlags@@ -330,12 +357,16 @@ nameTests :: TestTree nameTests = testGroup "Name tests"- [ testCase "Module (1)" $+ [ testCase "modName (1)" $ moduleTest "module Foo.Bar.Baz where" flags (\n -> assertBool "Unexpected name string" $ modName n == "Foo.Bar.Baz")- , testCase "Module (2)" $+ , testCase "modName (2)" $ moduleTest "f x = x * 2" flags (\n -> assertBool "Unexpected name string" $ modName n == "Main")+ , testCase "isSymbolRdrName (1)" $ assertBool "Expected 'True'" $ isSymbolRdrName (mkRdrUnqual (mkVarOcc "+"))+ , testCase "isSymbolRdrName (2)" $ assertBool "Expected 'False'" $ not (isSymbolRdrName (mkRdrUnqual (mkVarOcc "_foo")))+ , testCase "isSymbolRdrName (3)" $ assertBool "Expected 'False'" $ not (isSymbolRdrName (mkRdrUnqual (mkVarOcc "foo'")))+ , testCase "isSymbolRdrName (4)" $ assertBool "Expected 'True'" $ isSymbolRdrName (mkRdrUnqual (mkVarOcc ":+:")) ] where flags = defaultDynFlags fakeSettings fakeLlvmConfig