1
+ {-# LANGUAGE DeriveAnyClass #-}
2
+ {-# LANGUAGE DeriveGeneric #-}
3
+
1
4
module Development.IDE.Session.Diagnostics where
5
+ import Control.Applicative
2
6
import Control.Monad
3
7
import qualified Data.Aeson as Aeson
4
- import Data.Char (isLower )
5
8
import Data.List
6
- import Data.List.Extra (dropPrefix , split )
9
+ import Data.List.Extra (split )
7
10
import Data.Maybe
8
11
import qualified Data.Text as T
9
- import qualified Data.Vector as Vector
10
12
import Development.IDE.Types.Diagnostics
11
13
import Development.IDE.Types.Location
14
+ import GHC.Generics
12
15
import qualified HIE.Bios.Cradle as HieBios
13
16
import HIE.Bios.Types hiding (Log )
14
17
import System.FilePath
15
- import Control.Applicative
18
+
19
+ data CradleErrorDetails =
20
+ CradleErrorDetails
21
+ { cabalProjectFiles :: [FilePath ]
22
+ -- ^ files related to the cradle error
23
+ -- i.e. .cabal, cabal.project, etc.
24
+ } deriving (Show , Eq , Ord , Read , Generic , Aeson.ToJSON , Aeson.FromJSON )
16
25
17
26
{- | Takes a cradle error, the corresponding cradle and the file path where
18
27
the cradle error occurred (of the file we attempted to load).
@@ -22,7 +31,7 @@ renderCradleError :: CradleError -> Cradle a -> NormalizedFilePath -> FileDiagno
22
31
renderCradleError (CradleError deps _ec ms) cradle nfp
23
32
| HieBios. isCabalCradle cradle =
24
33
let (fp, showDiag, diag) = ideErrorWithSource (Just " cradle" ) (Just DiagnosticSeverity_Error ) nfp $ T. unlines $ map T. pack userFriendlyMessage in
25
- (fp, showDiag, diag{_data_ = Just ( Aeson. Array $ Vector. fromList $ map ( Aeson. String . T. pack) absDeps) })
34
+ (fp, showDiag, diag{_data_ = Just $ Aeson. toJSON CradleErrorDetails {cabalProjectFiles = absDeps} })
26
35
| otherwise = ideErrorWithSource (Just " cradle" ) (Just DiagnosticSeverity_Error ) nfp $ T. unlines $ map T. pack userFriendlyMessage
27
36
where
28
37
absDeps = fmap (cradleRootDir cradle </> ) deps
@@ -33,7 +42,7 @@ renderCradleError (CradleError deps _ec ms) cradle nfp
33
42
34
43
mkUnknownModuleMessage :: Maybe [String ]
35
44
mkUnknownModuleMessage
36
- | any (isInfixOf " Error: cabal: Failed extracting script block:" ) ms = Just $ unknownModuleMessage (fromNormalizedFilePath nfp) Nothing
45
+ | any (isInfixOf " Error: cabal: Failed extracting script block:" ) ms = Just $ unknownModuleMessage (fromNormalizedFilePath nfp)
37
46
| otherwise = Nothing
38
47
39
48
fileMissingMessage :: Maybe [String ]
@@ -79,20 +88,18 @@ parseMultiCradleErr ms = do
79
88
80
89
multiCradleErrMessage :: MultiCradleErr -> [String ]
81
90
multiCradleErrMessage e =
82
- unknownModuleMessage moduleFileName ( Just moduleName )
91
+ unknownModuleMessage (mcFilePath e )
83
92
<> [" " ]
84
93
<> map prefix (mcPrefixes e)
85
94
where
86
- localFilePath f = dropWhile (== pathSeparator) $ dropPrefix (mcPwd e) f
87
- moduleFileName = localFilePath $ mcFilePath e
88
- moduleName = intercalate " ." $ map dropExtension $ dropWhile isSourceFolder $ splitDirectories moduleFileName
89
- isSourceFolder p = all isLower $ take 1 p
90
95
prefix (f, r) = f <> " - " <> r
91
96
92
- unknownModuleMessage :: String -> Maybe String -> [String ]
93
- unknownModuleMessage moduleFileName moduleNameM =
97
+ unknownModuleMessage :: String -> [String ]
98
+ unknownModuleMessage moduleFileName =
94
99
[ " Loading the module '" <> moduleFileName <> " ' failed."
100
+ , " "
95
101
, " It may not be listed in your .cabal file!"
96
- , " Perhaps you need to add `" <> fromMaybe (takeFileName moduleFileName) moduleNameM <> " ` to other-modules or exposed-modules."
102
+ , " Perhaps you need to add `" <> dropExtension (takeFileName moduleFileName) <> " ` to other-modules or exposed-modules."
103
+ , " "
97
104
, " For more information, visit: https://cabal.readthedocs.io/en/3.4/developing-packages.html#modules-included-in-the-package"
98
105
]
0 commit comments