Also build with GHC 9.8

This commit is contained in:
Taylor Fausak 2024-07-02 11:26:35 -05:00
parent edb872c6ac
commit f5b005780b
5 changed files with 73 additions and 71 deletions

View File

@ -34,11 +34,13 @@ jobs:
strategy:
matrix:
include:
- ghc: 9.6
- ghc: 9.8
os: macos-latest
- ghc: 9.6
os: ubuntu-latest
- ghc: 9.6
- ghc: 9.8
os: ubuntu-latest
- ghc: 9.8
os: windows-latest
cabal:
name: Cabal
@ -76,7 +78,7 @@ jobs:
steps:
- uses: actions/download-artifact@v4
with:
name: splint-${{ github.sha }}-ghc-9.6-ubuntu-latest
name: splint-${{ github.sha }}-ghc-9.8-ubuntu-latest
- run: tar --extract --file artifact.tar --verbose
- uses: softprops/action-gh-release@v2
with:

View File

@ -1,5 +1,4 @@
packages: .
with-compiler: ghc-9.6
package ghc-lib-parser-ex
flags: +no-ghc-lib

View File

@ -1,77 +1,73 @@
module Splint where
import qualified Data.Maybe as Maybe
import qualified GHC.Data.Bag as Bag
import qualified GHC.Driver.Config.Diagnostic as Config
import qualified GHC.Data.Bag
import qualified GHC.Driver.Config.Diagnostic
import qualified GHC.Driver.Errors
import qualified GHC.Driver.Errors.Types
import qualified GHC.Hs as Hs
import qualified GHC.Plugins as Plugin
import qualified GHC.Types.Error as Error
import qualified GHC.Utils.Logger as Logger
import qualified GHC.Hs
import qualified GHC.Plugins
import qualified GHC.Types.Error
import qualified GHC.Utils.Error
import qualified GHC.Utils.Logger
import qualified Language.Haskell.HLint as HLint
import qualified Splint.Replacement as Replacement
import qualified Splint.Settings as Settings
plugin :: Plugin.Plugin
plugin :: GHC.Plugins.Plugin
plugin =
Plugin.defaultPlugin
{ Plugin.parsedResultAction = parsedResultAction,
Plugin.pluginRecompile = Plugin.purePlugin
GHC.Plugins.defaultPlugin
{ GHC.Plugins.parsedResultAction = parsedResultAction,
GHC.Plugins.pluginRecompile = GHC.Plugins.purePlugin
}
parsedResultAction ::
[Plugin.CommandLineOption] ->
[GHC.Plugins.CommandLineOption] ->
modSummary ->
Plugin.ParsedResult ->
Plugin.Hsc Plugin.ParsedResult
GHC.Plugins.ParsedResult ->
GHC.Plugins.Hsc GHC.Plugins.ParsedResult
parsedResultAction commandLineOptions _modSummary parsedResult = do
logger <- Logger.getLogger
dynFlags <- Plugin.getDynFlags
Plugin.liftIO $ do
(_parseFlags, classifies, hint) <- Settings.load commandLineOptions
GHC.Driver.Errors.printOrThrowDiagnostics
logger
(Config.initPrintConfig dynFlags)
(Config.initDiagOpts dynFlags)
. Error.mkMessages
. Bag.listToBag
. fmap ideaToWarnMsg
. HLint.applyHints classifies hint
logger <- GHC.Utils.Logger.getLogger
dynFlags <- GHC.Plugins.getDynFlags
let ghcMessageOpts = GHC.Driver.Config.Diagnostic.initPrintConfig dynFlags
diagOpts = GHC.Driver.Config.Diagnostic.initDiagOpts dynFlags
GHC.Plugins.liftIO $ do
settings <- Settings.load commandLineOptions
GHC.Driver.Errors.printOrThrowDiagnostics logger ghcMessageOpts diagOpts
. GHC.Types.Error.mkMessages
. GHC.Data.Bag.listToBag
. fmap (ideaToWarnMsg diagOpts)
. uncurry HLint.applyHints settings
. pure
. HLint.createModuleEx
. Hs.hpm_module
$ Plugin.parsedResultModule parsedResult
. GHC.Hs.hpm_module
$ GHC.Plugins.parsedResultModule parsedResult
pure parsedResult
ideaToWarnMsg :: HLint.Idea -> GHC.Driver.Errors.Types.WarnMsg
ideaToWarnMsg idea =
Error.MsgEnvelope
{ Error.errMsgContext = Plugin.neverQualify,
Error.errMsgDiagnostic =
GHC.Driver.Errors.Types.ghcUnknownMessage
Error.DiagnosticMessage
{ Error.diagHints =
fmap (Error.UnknownHint . Replacement.fromString)
. Maybe.maybeToList
$ HLint.ideaTo idea,
Error.diagMessage =
Error.mkDecorated $
Plugin.text
(HLint.ideaHint idea)
: fmap
(Plugin.text . mappend "Note: " . show)
(HLint.ideaNote idea),
Error.diagReason = case HLint.ideaSeverity idea of
HLint.Ignore -> Error.WarningWithoutFlag
HLint.Suggestion -> Error.WarningWithoutFlag
HLint.Warning -> Error.WarningWithoutFlag
HLint.Error -> Error.ErrorWithoutFlag
},
Error.errMsgSeverity = case HLint.ideaSeverity idea of
HLint.Ignore -> Error.SevIgnore
HLint.Suggestion -> Error.SevWarning
HLint.Warning -> Error.SevWarning
HLint.Error -> Error.SevError,
Error.errMsgSpan = HLint.ideaSpan idea
}
ideaToWarnMsg :: GHC.Utils.Error.DiagOpts -> HLint.Idea -> GHC.Driver.Errors.Types.WarnMsg
ideaToWarnMsg diagOpts idea =
let srcSpan = HLint.ideaSpan idea
ghcHints =
fmap (GHC.Types.Error.UnknownHint . Replacement.fromString)
. Maybe.maybeToList
$ HLint.ideaTo idea
decoratedSDoc =
GHC.Types.Error.mkDecorated $
GHC.Plugins.text
(HLint.ideaHint idea)
: fmap
(GHC.Plugins.text . mappend "Note: " . show)
(HLint.ideaNote idea)
diagnosticReason = case HLint.ideaSeverity idea of
HLint.Ignore -> GHC.Types.Error.WarningWithoutFlag
HLint.Suggestion -> GHC.Types.Error.WarningWithoutFlag
HLint.Warning -> GHC.Types.Error.WarningWithoutFlag
HLint.Error -> GHC.Types.Error.ErrorWithoutFlag
diagnosticMessage =
GHC.Types.Error.DiagnosticMessage
{ GHC.Types.Error.diagHints = ghcHints,
GHC.Types.Error.diagMessage = decoratedSDoc,
GHC.Types.Error.diagReason = diagnosticReason
}
ghcMessage = GHC.Driver.Errors.Types.ghcUnknownMessage diagnosticMessage
in GHC.Utils.Error.mkPlainMsgEnvelope diagOpts srcSpan ghcMessage

View File

@ -7,7 +7,7 @@ import qualified Language.Haskell.HLint as HLint
import qualified Splint.RemoteData as RemoteData
import qualified System.IO.Unsafe as Unsafe
type Settings = (HLint.ParseFlags, [HLint.Classify], HLint.Hint)
type Settings = ([HLint.Classify], HLint.Hint)
-- | Getting settings is not instantaneous. Since settings are usually reused
-- between modules, it makes sense to cache them. However each module can
@ -60,12 +60,12 @@ load commandLineOptions = do
. Map.insert commandLineOptions
$ RemoteData.Failure ioException
Exception.throwIO ioException
Right settings -> do
Right (_, classifies, hint) -> do
Stm.atomically
. Stm.modifyTVar cache
. Map.insert commandLineOptions
$ RemoteData.Success settings
pure settings
$ RemoteData.Success (classifies, hint)
pure (classifies, hint)
RemoteData.Loading -> load commandLineOptions
RemoteData.Failure ioException -> Exception.throwIO ioException
RemoteData.Success settings -> pure settings

View File

@ -1,4 +1,4 @@
cabal-version: 2.0
cabal-version: 2.2
name: splint
version: 1.0.2.1
synopsis: HLint as a GHC source plugin.
@ -25,11 +25,10 @@ flag pedantic
library
build-depends:
base ^>=4.18.0.0,
base ^>=4.18.0.0 || ^>=4.19.0.0,
containers ^>=0.6.7,
ghc ^>=9.6.1,
hlint ^>=3.6.1,
stm ^>=2.5.1.0
ghc ^>=9.6.1 || ^>=9.8.1,
stm ^>=2.5.1.0,
default-language: Haskell2010
-- cabal-gild: discover source/library
@ -57,3 +56,9 @@ library
if flag(pedantic)
ghc-options: -Werror
if impl(ghc ^>=9.6.1)
build-depends: hlint ^>=3.6.1
elif impl(ghc ^>=9.8.1)
build-depends: hlint ^>=3.8
ghc-options: -Wno-missing-role-annotations