@@ -18,9 +18,22 @@ import System.FilePath
1818
1919data CradleErrorDetails =
2020 CradleErrorDetails
21- { cabalProjectFiles :: [FilePath ]
21+ { cradleDependencies :: [FilePath ]
2222 -- ^ files related to the cradle error
2323 -- i.e. .cabal, cabal.project, etc.
24+ , structuredCradleError :: Maybe StructuredCradleError
25+ -- ^ structured information about the cradle error
26+ -- i.e. unknownModules error
27+ } deriving (Show , Eq , Ord , Read , Generic , Aeson.ToJSON , Aeson.FromJSON )
28+
29+ data StructuredCradleError
30+ = UnknownModuleError UnknownModuleDetails
31+ deriving (Show , Eq , Ord , Read , Generic , Aeson.ToJSON , Aeson.FromJSON )
32+
33+ data UnknownModuleDetails =
34+ UnknownModuleDetails
35+ { moduleFilePath :: FilePath
36+ , suggestedModuleName :: String
2437 } deriving (Show , Eq , Ord , Read , Generic , Aeson.ToJSON , Aeson.FromJSON )
2538
2639{- | Takes a cradle error, the corresponding cradle and the file path where
@@ -33,21 +46,31 @@ renderCradleError cradleError cradle nfp =
3346 ideErrorWithSource (Just " cradle" ) (Just DiagnosticSeverity_Error ) nfp (T. unlines $ map T. pack userFriendlyMessage) Nothing
3447 in
3548 if HieBios. isCabalCradle cradle
36- then noDetails & fdLspDiagnosticL %~ \ diag -> diag{_data_ = Just $ Aeson. toJSON CradleErrorDetails {cabalProjectFiles= absDeps}}
49+ then noDetails & fdLspDiagnosticL %~ \ diag -> diag
50+ { _data_ = Just $ Aeson. toJSON CradleErrorDetails
51+ { cradleDependencies = absDeps
52+ , structuredCradleError = fmap UnknownModuleError mkUnknownModuleDetails
53+ }
54+ }
3755 else noDetails
3856 where
3957 ms = cradleErrorStderr cradleError
4058
4159 absDeps = fmap (cradleRootDir cradle </> ) (cradleErrorDependencies cradleError)
4260 userFriendlyMessage :: [String ]
4361 userFriendlyMessage
44- | HieBios. isCabalCradle cradle = fromMaybe ms $ fileMissingMessage <|> mkUnknownModuleMessage
62+ | HieBios. isCabalCradle cradle = fromMaybe ms $ fileMissingMessage <|> (unknownModuleMessage (fromNormalizedFilePath nfp) <$ mkUnknownModuleDetails)
4563 | otherwise = ms
4664
47- mkUnknownModuleMessage :: Maybe [String ]
48- mkUnknownModuleMessage
65+ -- Produce structured details when unknown module error is detected
66+ mkUnknownModuleDetails :: Maybe UnknownModuleDetails
67+ mkUnknownModuleDetails
4968 | any (isInfixOf " Failed extracting script block:" ) ms =
50- Just $ unknownModuleMessage (fromNormalizedFilePath nfp)
69+ let fp = fromNormalizedFilePath nfp
70+ in Just UnknownModuleDetails
71+ { moduleFilePath = fp
72+ , suggestedModuleName = dropExtension (takeFileName fp)
73+ }
5174 | otherwise = Nothing
5275
5376 fileMissingMessage :: Maybe [String ]
0 commit comments