mirror of
https://github.com/tfausak/splint.git
synced 2024-10-05 13:37:37 +03:00
Also build with GHC 9.8
This commit is contained in:
parent
edb872c6ac
commit
f5b005780b
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
@ -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:
|
||||
|
@ -1,5 +1,4 @@
|
||||
packages: .
|
||||
with-compiler: ghc-9.6
|
||||
|
||||
package ghc-lib-parser-ex
|
||||
flags: +no-ghc-lib
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
15
splint.cabal
15
splint.cabal
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user