Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support structured diagnostics 2 #4433

Open
wants to merge 76 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
bd1404f
Change FileDiagnostic type synonym to a datatype
dylan-thinnes Jun 8, 2024
e684905
Make `ideErrorWithSource` produce FileDiagnostic by adding filepath arg
dylan-thinnes Jun 8, 2024
9d4cad1
Supply structured error wherever we easily can - TODOs for hard parts
dylan-thinnes Jun 9, 2024
e6a0b09
Fix UnitTests for new FileDiagnostic struct
dylan-thinnes Jun 9, 2024
d87c246
Remove explicit uses of FileDiagnostic, add codes to LSP diagnostics
dylan-thinnes Jun 9, 2024
cc2188c
Add field for expected error codes in ghcide tests
dylan-thinnes Jun 10, 2024
d2cbe55
Expect GHC-83865 for "type error" test - basic test
dylan-thinnes Jun 10, 2024
6e1eab7
Return structured warnings in TcModuleResult by copying from Driver
dylan-thinnes Jun 10, 2024
dcf9397
Store FileDiagnostic instead of LSP Diagnostic in Shake store
dylan-thinnes Jun 16, 2024
7bda67b
Add expected error codes for diagnostics that have them
dylan-thinnes Jun 16, 2024
6d1f0d7
Dispatch TODOs, amend remaining TODOs as future work
dylan-thinnes Jun 16, 2024
c92afae
Add scary comments all over copied code in Compat.Driver
dylan-thinnes Jun 16, 2024
b2fb63d
Update all remaining diagnostics that could use an expected error code
dylan-thinnes Jun 16, 2024
c6bc82d
Add _code to pretty printing for FileDiagnostic
dylan-thinnes Jun 16, 2024
9f5391b
Use case instead of `maybe` for StructuredMessage match
dylan-thinnes Jun 16, 2024
dd2229a
Use CPP to prevent setting _code before structured errors
dylan-thinnes Jun 16, 2024
094974d
Swap modifier for lenses, document StructuredMessage type
dylan-thinnes Jun 16, 2024
e948f2a
Add link to Issue & MR to Compat.Driver
dylan-thinnes Jun 16, 2024
79fd77e
Drop attachReason logic from withWarnings, technically incorrect
dylan-thinnes Jun 16, 2024
869edd6
Revert "Drop attachReason logic", needed by pragmas-plugin
dylan-thinnes Jun 16, 2024
1b2dd28
Fix plugins where necessary for new diagnostic structure
dylan-thinnes Jun 16, 2024
03c8409
Fix build issues with other tests from `expectDiagnostics`
dylan-thinnes Jun 16, 2024
2f83b0b
Improve comment on metadata fdStructuredMessage in FileDiagnostic
dylan-thinnes Jun 17, 2024
1cb1325
Add note to withWarnings explaining the current state of things
dylan-thinnes Jun 20, 2024
9337f25
Attach reasons into data field of LSP Diagnostic instead of code field
dylan-thinnes Jun 20, 2024
a857b9e
Fix up mistakes from merge, TODO fix merge issues for 9.3.0
dylan-thinnes Jun 20, 2024
14d6697
Set CodeDescription from HaskellErrorIndex when available
dylan-thinnes Jun 24, 2024
acbf1cb
Remove debugging print, fix expectation for preprocessor tests
dylan-thinnes Jun 27, 2024
413d1b8
Fix CPP for using Show instance on DiagnosticCode
dylan-thinnes Jun 27, 2024
926b6c4
Remove diagFromErrMsgs for GHC version < 9.6.1 using CPP
dylan-thinnes Jun 28, 2024
342b9fb
CPP fix
dylan-thinnes Jun 28, 2024
aaf5736
More stylish-haskell, more CPP fix
dylan-thinnes Jun 28, 2024
7215d80
Fix all stylish-haskell errors triggering
dylan-thinnes Jun 28, 2024
1a7856b
Fix more CPP
dylan-thinnes Jun 29, 2024
0a2174d
Only override the LSP diagnostic code when not already set
dylan-thinnes Jun 29, 2024
619098e
Fixes for stylish-haskell
dylan-thinnes Jun 29, 2024
361dd5b
Qualify s, t for FuzzySearch
dylan-thinnes Jun 29, 2024
1ec3db3
Ignore use of unsafePerformIO in FuzzySearch
dylan-thinnes Jun 29, 2024
ef5518f
Properly split GHC.Types.Error import in Diagnostics for stylish-haskell
dylan-thinnes Jun 30, 2024
45e77c7
Force type signature of annotation on FuzzySearch.dictionary
dylan-thinnes Jun 30, 2024
6ca2a19
DRY up definition of closure_errs
dylan-thinnes Jul 2, 2024
165e6b0
Remove unused imports
noughtmare Oct 17, 2024
1047d55
Post-rebase fixes
noughtmare Oct 17, 2024
a64120f
stylish-haskell formatting
noughtmare Oct 17, 2024
1fed0f9
Fix issue with GHC 9.4
noughtmare Oct 22, 2024
73bba51
Please stylish-haskell
noughtmare Oct 22, 2024
6c9860c
Ignore error codes when testing GHC 9.4
noughtmare Oct 22, 2024
c44a43d
Workaround darwin GHC bug in hls-hlint-plugin
noughtmare Oct 23, 2024
1f835da
Put the workaround in the right place
noughtmare Oct 23, 2024
1bc221c
Revert "Set CodeDescription from HaskellErrorIndex when available"
noughtmare Oct 24, 2024
16551d1
Resolve fendor's feedback
noughtmare Oct 24, 2024
5a6216b
Apply stylish-haskell formatting
noughtmare Oct 24, 2024
4465f49
Apply more stylish-haskell formatting
noughtmare Oct 24, 2024
79341ed
Merge branch 'master' into support-structured-diagnostics
soulomoon Oct 25, 2024
82367ec
Resolve some of soulomoon's feedback
noughtmare Oct 25, 2024
ada484e
Fix small issues
noughtmare Oct 25, 2024
6c05e23
Remove unused imports
noughtmare Oct 26, 2024
0776c65
Remove StructuredDiagnostic
noughtmare Oct 28, 2024
65300ef
Revert "Remove StructuredDiagnostic"
fendor Nov 21, 2024
649e2ba
Remove the unused parameter from 'ideErrorText'
fendor Nov 21, 2024
4c9e7a3
Add documentation to diagnostic helpers
fendor Nov 21, 2024
af34f06
Add action to query active diagnostics for a given Range
fendor Nov 30, 2024
92c8b4f
Use lens for updating Diagnostic
fendor Nov 30, 2024
d3b7fe6
Add GHC Structured Error compatibility module
fendor Nov 30, 2024
164dfe5
Remove unused imports
fendor Nov 30, 2024
31d1cee
Don't suggest -Wno-deferred-out-of-scope-variables (#4441)
jeukshi Nov 3, 2024
49b0ce1
Build HLS with GHC 9.8.3 (#4444)
fendor Nov 4, 2024
1feb07d
ci(mergify): upgrade configuration to current format (#4454)
mergify[bot] Nov 24, 2024
3ce3cfb
More tests and better docs for cabal-add (#4455)
VenInf Nov 25, 2024
54576e1
Fix compatibility with GHC 9.4 and rename function
fendor Dec 1, 2024
abd1a39
Use GHC Note syntax and reference Note in docs
fendor Dec 23, 2024
ada6ed6
Add doc comment for 'tmrWarnings'
fendor Dec 23, 2024
1398a0b
Push CPP statements to compatibility module
fendor Dec 23, 2024
95f65d9
Merge remote-tracking branch 'upstream/master' into support-structure…
fendor Dec 23, 2024
371896a
Fix formatting in Development.IDE.GHC.Compat.Error
fendor Dec 23, 2024
803067a
Merge branch 'master' into support-structured-diagnostics
fendor Dec 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ghcide-bench/src/Experiments.hs
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@
flip allM docs $ \DocumentPositions{..} -> do
bottom <- pred . length . T.lines <$> documentContents doc
diags <- getCurrentDiagnostics doc
case requireDiagnostic diags (DiagnosticSeverity_Error, (fromIntegral bottom, 8), "Found hole", Nothing) of
case requireDiagnostic diags (DiagnosticSeverity_Error, (fromIntegral bottom, 8), "Found hole", Just "GHC-88464", Nothing) of
Nothing -> pure True
Just _err -> pure False
),
Expand Down Expand Up @@ -342,7 +342,7 @@
examplesPath = "bench/example"

defConfig :: Config
Success defConfig = execParserPure defaultPrefs (info configP fullDesc) []

Check warning on line 345 in ghcide-bench/src/Experiments.hs

View workflow job for this annotation

GitHub Actions / test (9.6, macOS-latest, false)

Pattern match(es) are non-exhaustive

Check warning on line 345 in ghcide-bench/src/Experiments.hs

View workflow job for this annotation

GitHub Actions / flags (9.6, ubuntu-latest)

Pattern match(es) are non-exhaustive

Check warning on line 345 in ghcide-bench/src/Experiments.hs

View workflow job for this annotation

GitHub Actions / bench_init (9.6, ubuntu-latest)

Pattern match(es) are non-exhaustive

Check warning on line 345 in ghcide-bench/src/Experiments.hs

View workflow job for this annotation

GitHub Actions / test (9.6, ubuntu-latest, true)

Pattern match(es) are non-exhaustive

quiet, verbose :: Config -> Bool
verbose = (== All) . verbosity
Expand Down
3 changes: 3 additions & 0 deletions ghcide/ghcide.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ library
, hls-plugin-api == 2.9.0.1
, implicit-hie >= 0.1.4.0 && < 0.1.5
, lens
, lens-aeson
, list-t
, lsp ^>=2.7
, lsp-types ^>=2.3
Expand Down Expand Up @@ -150,7 +151,9 @@ library
Development.IDE.GHC.Compat
Development.IDE.GHC.Compat.Core
Development.IDE.GHC.Compat.CmdLine
Development.IDE.GHC.Compat.Driver
Development.IDE.GHC.Compat.Env
Development.IDE.GHC.Compat.Error
Development.IDE.GHC.Compat.Iface
Development.IDE.GHC.Compat.Logger
Development.IDE.GHC.Compat.Outputable
Expand Down
34 changes: 22 additions & 12 deletions ghcide/session-loader/Development/IDE/Session.hs
Original file line number Diff line number Diff line change
Expand Up @@ -573,10 +573,11 @@
this_flags = (this_error_env, this_dep_info)
this_error_env = ([this_error], Nothing)
this_error = ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) _cfp
$ T.unlines
[ "No cradle target found. Is this file listed in the targets of your cradle?"
, "If you are using a .cabal file, please ensure that this module is listed in either the exposed-modules or other-modules section"
]
(T.unlines
[ "No cradle target found. Is this file listed in the targets of your cradle?"
, "If you are using a .cabal file, please ensure that this module is listed in either the exposed-modules or other-modules section"
])
Nothing

void $ modifyVar' fileToFlags $ Map.insert hieYaml this_flags_map
void $ modifyVar' filesMap $ flip HM.union (HM.fromList (map ((,hieYaml) . fst) $ concatMap toFlagsMap all_targets))
Expand Down Expand Up @@ -633,7 +634,7 @@
[] -> error $ "GHC version could not be parsed: " <> version
((runTime, _):_)
| compileTime == runTime -> do
atomicModifyIORef' cradle_files (\xs -> (cfp:xs,()))

Check warning on line 637 in ghcide/session-loader/Development/IDE/Session.hs

View workflow job for this annotation

GitHub Actions / Hlint check run

Warning in loadSessionWithOptions in module Development.IDE.Session: Use atomicModifyIORef'_ ▫︎ Found: "atomicModifyIORef' cradle_files (\\ xs -> (cfp : xs, ()))" ▫︎ Perhaps: "atomicModifyIORef'_ cradle_files ((:) cfp)"
session (hieYaml, toNormalizedFilePath' cfp, opts, libDir)
| otherwise -> return (([renderPackageSetupException cfp GhcVersionMismatch{..}], Nothing),[])
-- Failure case, either a cradle error or the none cradle
Expand Down Expand Up @@ -797,10 +798,10 @@
-- GHC had an implementation of this function, but it was horribly inefficient
-- We should move back to the GHC implementation on compilers where
-- https://gitlab.haskell.org/ghc/ghc/-/merge_requests/12162 is included
checkHomeUnitsClosed' :: UnitEnv -> OS.Set UnitId -> [DriverMessages]
checkHomeUnitsClosed' :: UnitEnv -> OS.Set UnitId -> Maybe (Compat.MsgEnvelope DriverMessage)
checkHomeUnitsClosed' ue home_id_set
| OS.null bad_unit_ids = []
| otherwise = [singleMessage $ GHC.mkPlainErrorMsgEnvelope rootLoc $ DriverHomePackagesNotClosed (OS.toList bad_unit_ids)]
| OS.null bad_unit_ids = Nothing
| otherwise = Just (GHC.mkPlainErrorMsgEnvelope rootLoc $ DriverHomePackagesNotClosed (OS.toList bad_unit_ids))
where
bad_unit_ids = upwards_closure OS.\\ home_id_set
rootLoc = mkGeneralSrcSpan (Compat.fsLit "<command line>")
Expand Down Expand Up @@ -875,13 +876,22 @@
hscEnv' <- -- Set up a multi component session with the other units on GHC 9.4
Compat.initUnits dfs hsc_env

let closure_errs = checkHomeUnitsClosed' (hsc_unit_env hscEnv') (hsc_all_home_unit_ids hscEnv')
multi_errs = map (ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Warning) _cfp . T.pack . Compat.printWithoutUniques) closure_errs
let closure_errs = maybeToList $ checkHomeUnitsClosed' (hsc_unit_env hscEnv') (hsc_all_home_unit_ids hscEnv')
closure_err_to_multi_err err =
ideErrorWithSource
(Just "cradle") (Just DiagnosticSeverity_Warning) _cfp
(T.pack (Compat.printWithoutUniques (singleMessage err)))
#if MIN_VERSION_ghc(9,5,0)
(Just (fmap GhcDriverMessage err))
#else
Nothing
#endif
multi_errs = map closure_err_to_multi_err closure_errs
bad_units = OS.fromList $ concat $ do
x <- bagToList $ mapBag errMsgDiagnostic $ unionManyBags $ map Compat.getMessages closure_errs
x <- map errMsgDiagnostic closure_errs
DriverHomePackagesNotClosed us <- pure x
pure us
isBad ci = (homeUnitId_ (componentDynFlags ci)) `OS.member` bad_units

Check warning on line 894 in ghcide/session-loader/Development/IDE/Session.hs

View workflow job for this annotation

GitHub Actions / Hlint check run

Suggestion in newComponentCache in module Development.IDE.Session: Redundant bracket ▫︎ Found: "(homeUnitId_ (componentDynFlags ci)) `OS.member` bad_units" ▫︎ Perhaps: "homeUnitId_ (componentDynFlags ci) `OS.member` bad_units"
-- Whenever we spin up a session on Linux, dynamically load libm.so.6
-- in. We need this in case the binary is statically linked, in which
-- case the interactive session will fail when trying to load
Expand Down Expand Up @@ -1223,6 +1233,6 @@
, "failed to load packages:", message <> "."
, "\nPlease ensure that ghcide is compiled with the same GHC installation as the project."]

renderPackageSetupException :: FilePath -> PackageSetupException -> (NormalizedFilePath, ShowDiagnostic, Diagnostic)
renderPackageSetupException :: FilePath -> PackageSetupException -> FileDiagnostic
renderPackageSetupException fp e =
ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) (toNormalizedFilePath' fp) (T.pack $ showPackageSetupException e)
ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) (toNormalizedFilePath' fp) (T.pack $ showPackageSetupException e) Nothing
13 changes: 8 additions & 5 deletions ghcide/session-loader/Development/IDE/Session/Diagnostics.hs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{-# LANGUAGE DeriveAnyClass #-}

Check warning on line 1 in ghcide/session-loader/Development/IDE/Session/Diagnostics.hs

View workflow job for this annotation

GitHub Actions / Hlint check run

Warning in module Development.IDE.Session.Diagnostics: Use module export list ▫︎ Found: "module Development.IDE.Session.Diagnostics where" ▫︎ Perhaps: "module Development.IDE.Session.Diagnostics (\n module Development.IDE.Session.Diagnostics\n ) where" ▫︎ Note: an explicit list is usually better

module Development.IDE.Session.Diagnostics where
import Control.Applicative
import Control.Lens
import Control.Monad
import qualified Data.Aeson as Aeson
import Data.List
Expand All @@ -27,11 +28,13 @@
Depicts the cradle error in a user-friendly way.
-}
renderCradleError :: CradleError -> Cradle a -> NormalizedFilePath -> FileDiagnostic
renderCradleError (CradleError deps _ec ms) cradle nfp
| HieBios.isCabalCradle cradle =
let (fp, showDiag, diag) = ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) nfp $ T.unlines $ map T.pack userFriendlyMessage in
(fp, showDiag, diag{_data_ = Just $ Aeson.toJSON CradleErrorDetails{cabalProjectFiles=absDeps}})
| otherwise = ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) nfp $ T.unlines $ map T.pack userFriendlyMessage
renderCradleError (CradleError deps _ec ms) cradle nfp =
let noDetails =
ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) nfp (T.unlines $ map T.pack userFriendlyMessage) Nothing
in
if HieBios.isCabalCradle cradle
then noDetails & fdLspDiagnosticL %~ \diag -> diag{_data_ = Just $ Aeson.toJSON CradleErrorDetails{cabalProjectFiles=absDeps}}
else noDetails
where
absDeps = fmap (cradleRootDir cradle </>) deps
userFriendlyMessage :: [String]
Expand Down Expand Up @@ -84,7 +87,7 @@
surround start s end = do
guard (listToMaybe s == Just start)
guard (listToMaybe (reverse s) == Just end)
pure $ drop 1 $ take (length s - 1) s

Check warning on line 90 in ghcide/session-loader/Development/IDE/Session/Diagnostics.hs

View workflow job for this annotation

GitHub Actions / Hlint check run

Warning in parseMultiCradleErr in module Development.IDE.Session.Diagnostics: Use drop1 ▫︎ Found: "drop 1" ▫︎ Perhaps: "drop1"

multiCradleErrMessage :: MultiCradleErr -> [String]
multiCradleErrMessage e =
Expand Down
128 changes: 82 additions & 46 deletions ghcide/src/Development/IDE/Core/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
import Data.Time (UTCTime (..))
import Data.Tuple.Extra (dupe)
import Debug.Trace
import Development.IDE.Core.FileStore (resetInterfaceStore)

Check warning on line 72 in ghcide/src/Development/IDE/Core/Compile.hs

View workflow job for this annotation

GitHub Actions / Hlint check run

Warning in module Development.IDE.Core.Compile: Use fewer imports ▫︎ Found: "import Development.IDE.Core.FileStore ( resetInterfaceStore )\nimport Development.IDE.Core.FileStore ( shareFilePath )\n" ▫︎ Perhaps: "import Development.IDE.Core.FileStore\n ( resetInterfaceStore, shareFilePath )\n"
import Development.IDE.Core.Preprocessor
import Development.IDE.Core.ProgressReporting (progressUpdate)
import Development.IDE.Core.RuleTypes
Expand Down Expand Up @@ -111,6 +111,7 @@
import qualified GHC as G
import qualified GHC.Runtime.Loader as Loader
import GHC.Tc.Gen.Splice
import GHC.Types.Error
import GHC.Types.ForeignStubs
import GHC.Types.HpcInfo
import GHC.Types.TypeEnv
Expand All @@ -130,6 +131,8 @@
import Development.IDE.Core.FileStore (shareFilePath)
#endif

import Development.IDE.GHC.Compat.Driver (hscTypecheckRenameWithDiagnostics)

--Simple constants to make sure the source is consistently named
sourceTypecheck :: T.Text
sourceTypecheck = "typecheck"
Expand Down Expand Up @@ -157,8 +160,12 @@
-> IO (Either [FileDiagnostic] [UnitId])
computePackageDeps env pkg = do
case lookupUnit env pkg of
Nothing -> return $ Left [ideErrorText (toNormalizedFilePath' noFilePath) $
T.pack $ "unknown package: " ++ show pkg]
Nothing ->
return $ Left
[ ideErrorText
(toNormalizedFilePath' noFilePath)
(T.pack $ "unknown package: " ++ show pkg)
]
Just pkgInfo -> return $ Right $ unitDepends pkgInfo

newtype TypecheckHelpers
Expand All @@ -179,20 +186,24 @@
case initialized of
Left errs -> return (errs, Nothing)
Right hscEnv -> do
(warnings, etcm) <- withWarnings sourceTypecheck $ \tweak ->
etcm <-
let
session = tweak (hscSetFlags dflags hscEnv)
-- TODO: maybe settings ms_hspp_opts is unnecessary?
mod_summary'' = modSummary { ms_hspp_opts = hsc_dflags session}
-- TODO: maybe setting ms_hspp_opts is unnecessary?
mod_summary' = modSummary { ms_hspp_opts = hsc_dflags hscEnv}
in
catchSrcErrors (hsc_dflags hscEnv) sourceTypecheck $ do
tcRnModule session tc_helpers $ demoteIfDefer pm{pm_mod_summary = mod_summary''}
let errorPipeline = unDefer . hideDiag dflags . tagDiag
diags = map errorPipeline warnings
deferredError = any fst diags
tcRnModule hscEnv tc_helpers $ demoteIfDefer pm{pm_mod_summary = mod_summary'}
case etcm of
Left errs -> return (map snd diags ++ errs, Nothing)
Right tcm -> return (map snd diags, Just $ tcm{tmrDeferredError = deferredError})
Left errs -> return (errs, Nothing)
Right tcm ->
let addReason diag =
map (Just (diagnosticReason (errMsgDiagnostic diag)),) $
diagFromErrMsg sourceTypecheck (hsc_dflags hscEnv) diag
errorPipeline = map (unDefer . hideDiag dflags . tagDiag) . addReason
diags = concatMap errorPipeline $ Compat.getMessages $ tmrWarnings tcm
deferredError = any fst diags
in
return (map snd diags, Just $ tcm{tmrDeferredError = deferredError})
where
demoteIfDefer = if defer then demoteTypeErrorsToWarnings else id

Expand Down Expand Up @@ -358,9 +369,9 @@
let ms = pm_mod_summary pmod
hsc_env_tmp = hscSetFlags (ms_hspp_opts ms) hsc_env

((tc_gbl_env', mrn_info), splices, mod_env)
(((tc_gbl_env', mrn_info), warning_messages), splices, mod_env)
<- captureSplicesAndDeps tc_helpers hsc_env_tmp $ \hscEnvTmp ->
do hscTypecheckRename hscEnvTmp ms $
do hscTypecheckRenameWithDiagnostics hscEnvTmp ms $
HsParsedModule { hpm_module = parsedSource pmod
, hpm_src_files = pm_extra_src_files pmod
}
Expand All @@ -372,7 +383,7 @@
mod_env_anns = map (\(mod, hash) -> Annotation (ModuleTarget mod) $ toSerialized BS.unpack hash)
(moduleEnvToList mod_env)
tc_gbl_env = tc_gbl_env' { tcg_ann_env = extendAnnEnvList (tcg_ann_env tc_gbl_env') mod_env_anns }
pure (TcModuleResult pmod rn_info tc_gbl_env splices False mod_env)
pure (TcModuleResult pmod rn_info tc_gbl_env splices False mod_env warning_messages)


-- Note [Clearing mi_globals after generating an iface]
Expand Down Expand Up @@ -535,8 +546,14 @@
source = "compile"
catchErrs x = x `catches`
[ Handler $ return . (,Nothing) . diagFromGhcException source dflags
, Handler $ return . (,Nothing) . diagFromString source DiagnosticSeverity_Error (noSpan "<internal>")
. (("Error during " ++ T.unpack source) ++) . show @SomeException
, Handler $ \diag ->
return
( diagFromString
source DiagnosticSeverity_Error (noSpan "<internal>")
("Error during " ++ T.unpack source ++ show @SomeException diag)
Nothing
, Nothing
)
]

-- | Whether we should run the -O0 simplifier when generating core.
Expand Down Expand Up @@ -660,15 +677,16 @@
unDefer ( _ , fd) = (False, fd)

upgradeWarningToError :: FileDiagnostic -> FileDiagnostic
upgradeWarningToError (nfp, sh, fd) =
(nfp, sh, fd{_severity = Just DiagnosticSeverity_Error, _message = warn2err $ _message fd}) where
upgradeWarningToError =
fdLspDiagnosticL %~ \diag -> diag {_severity = Just DiagnosticSeverity_Error, _message = warn2err $ _message diag}
where
warn2err :: T.Text -> T.Text
warn2err = T.intercalate ": error:" . T.splitOn ": warning:"

hideDiag :: DynFlags -> (Maybe DiagnosticReason, FileDiagnostic) -> (Maybe DiagnosticReason, FileDiagnostic)
hideDiag originalFlags (w@(Just (WarningWithFlag warning)), (nfp, _sh, fd))
hideDiag originalFlags (w@(Just (WarningWithFlag warning)), fd)
| not (wopt warning originalFlags)
= (w, (nfp, HideDiag, fd))
= (w, fd { fdShouldShowDiagnostic = HideDiag })
hideDiag _originalFlags t = t

-- | Warnings which lead to a diagnostic tag
Expand All @@ -692,18 +710,18 @@
tagDiag :: (Maybe DiagnosticReason, FileDiagnostic) -> (Maybe DiagnosticReason, FileDiagnostic)

#if MIN_VERSION_ghc(9,7,0)
tagDiag (w@(Just (WarningWithCategory cat)), (nfp, sh, fd))
tagDiag (w@(Just (WarningWithCategory cat)), fd)
| cat == defaultWarningCategory -- default warning category is for deprecations
= (w, (nfp, sh, fd { _tags = Just $ DiagnosticTag_Deprecated : concat (_tags fd) }))
tagDiag (w@(Just (WarningWithFlags warnings)), (nfp, sh, fd))
= (w, fd & fdLspDiagnosticL %~ \diag -> diag { _tags = Just $ DiagnosticTag_Deprecated : concat (_tags diag) })
tagDiag (w@(Just (WarningWithFlags warnings)), fd)
| tags <- mapMaybe requiresTag (toList warnings)
= (w, (nfp, sh, fd { _tags = Just $ tags ++ concat (_tags fd) }))
= (w, fd & fdLspDiagnosticL %~ \diag -> diag { _tags = Just $ tags ++ concat (_tags diag) })
#else
tagDiag (w@(Just (WarningWithFlag warning)), (nfp, sh, fd))
tagDiag (w@(Just (WarningWithFlag warning)), fd)
| Just tag <- requiresTag warning
= (w, (nfp, sh, fd { _tags = Just $ tag : concat (_tags fd) }))
= (w, fd & fdLspDiagnosticL %~ \diag -> diag { _tags = Just $ tag : concat (_tags diag) })
#endif
where
where
requiresTag :: WarningFlag -> Maybe DiagnosticTag
#if !MIN_VERSION_ghc(9,7,0)
-- doesn't exist on 9.8, we use WarningWithCategory instead
Expand Down Expand Up @@ -859,16 +877,25 @@
handleGenerationErrors dflags source action =
action >> return [] `catches`
[ Handler $ return . diagFromGhcException source dflags
, Handler $ return . diagFromString source DiagnosticSeverity_Error (noSpan "<internal>")
. (("Error during " ++ T.unpack source) ++) . show @SomeException
, Handler $ \(exception :: SomeException) -> return $
diagFromString
source DiagnosticSeverity_Error (noSpan "<internal>")
("Error during " ++ T.unpack source ++ show exception)
Nothing
]

handleGenerationErrors' :: DynFlags -> T.Text -> IO (Maybe a) -> IO ([FileDiagnostic], Maybe a)
handleGenerationErrors' dflags source action =
fmap ([],) action `catches`
[ Handler $ return . (,Nothing) . diagFromGhcException source dflags
, Handler $ return . (,Nothing) . diagFromString source DiagnosticSeverity_Error (noSpan "<internal>")
. (("Error during " ++ T.unpack source) ++) . show @SomeException
, Handler $ \(exception :: SomeException) ->
return
( diagFromString
source DiagnosticSeverity_Error (noSpan "<internal>")
("Error during " ++ T.unpack source ++ show exception)
Nothing
, Nothing
)
]


Expand Down Expand Up @@ -957,7 +984,7 @@


convImport (L _ i) = (
(ideclPkgQual i)

Check warning on line 987 in ghcide/src/Development/IDE/Core/Compile.hs

View workflow job for this annotation

GitHub Actions / Hlint check run

Suggestion in getModSummaryFromImports in module Development.IDE.Core.Compile: Redundant bracket ▫︎ Found: "((ideclPkgQual i), reLoc $ ideclName i)" ▫︎ Perhaps: "(ideclPkgQual i, reLoc $ ideclName i)"
, reLoc $ ideclName i)

msrImports = implicit_imports ++ imps
Expand Down Expand Up @@ -1048,7 +1075,7 @@
let loc = mkRealSrcLoc (Util.mkFastString filename) 1 1
case unP Compat.parseHeader (initParserState (initParserOpts dflags) contents loc) of
PFailedWithErrorMessages msgs ->
throwE $ diagFromErrMsgs sourceParser dflags $ msgs dflags
throwE $ diagFromGhcErrorMessages sourceParser dflags $ msgs dflags
POk pst rdr_module -> do
let (warns, errs) = renderMessages $ getPsMessages pst

Expand All @@ -1062,9 +1089,9 @@
-- errors are those from which a parse tree just can't
-- be produced.
unless (null errs) $
throwE $ diagFromErrMsgs sourceParser dflags errs
throwE $ diagFromGhcErrorMessages sourceParser dflags errs

let warnings = diagFromErrMsgs sourceParser dflags warns
let warnings = diagFromGhcErrorMessages sourceParser dflags warns
return (warnings, rdr_module)

-- | Given a buffer, flags, and file path, produce a
Expand All @@ -1081,18 +1108,28 @@
dflags = ms_hspp_opts ms
contents = fromJust $ ms_hspp_buf ms
case unP Compat.parseModule (initParserState (initParserOpts dflags) contents loc) of
PFailedWithErrorMessages msgs -> throwE $ diagFromErrMsgs sourceParser dflags $ msgs dflags
PFailedWithErrorMessages msgs ->
throwE $ diagFromGhcErrorMessages sourceParser dflags $ msgs dflags
POk pst rdr_module ->
let
psMessages = getPsMessages pst
in
do
let IdePreprocessedSource preproc_warns errs parsed = customPreprocessor rdr_module

unless (null errs) $
throwE $ diagFromStrings sourceParser DiagnosticSeverity_Error errs

let preproc_warnings = diagFromStrings sourceParser DiagnosticSeverity_Warning preproc_warns
let IdePreprocessedSource preproc_warns preproc_errs parsed = customPreprocessor rdr_module
let attachNoStructuredError (span, msg) = (span, msg, Nothing)

unless (null preproc_errs) $
throwE $
diagFromStrings
sourceParser
DiagnosticSeverity_Error
(fmap attachNoStructuredError preproc_errs)

let preproc_warning_file_diagnostics =
diagFromStrings
sourceParser
DiagnosticSeverity_Warning
(fmap attachNoStructuredError preproc_warns)
(parsed', msgs) <- liftIO $ applyPluginsParsedResultAction env ms parsed psMessages
let (warns, errors) = renderMessages msgs

Expand All @@ -1106,8 +1143,7 @@
-- errors are those from which a parse tree just can't
-- be produced.
unless (null errors) $
throwE $ diagFromErrMsgs sourceParser dflags errors

throwE $ diagFromGhcErrorMessages sourceParser dflags errors

-- To get the list of extra source files, we take the list
-- that the parser gave us,
Expand Down Expand Up @@ -1137,8 +1173,8 @@
srcs2 <- liftIO $ filterM doesFileExist srcs1

let pm = ParsedModule ms parsed' srcs2
warnings = diagFromErrMsgs sourceParser dflags warns
pure (warnings ++ preproc_warnings, pm)
warnings = diagFromGhcErrorMessages sourceParser dflags warns
pure (warnings ++ preproc_warning_file_diagnostics, pm)

loadHieFile :: Compat.NameCacheUpdater -> FilePath -> IO GHC.HieFile
loadHieFile ncu f = do
Expand Down
Loading
Loading