@@ -56,28 +56,31 @@ type OutputDoc = Doc OutputAnnotation
56class Warning a where
56class Warning a where
57 warningExtent :: a -> FC
57 warningExtent :: a -> FC
58 warningMessage :: a -> OutputDoc
58 warningMessage :: a -> OutputDoc
59+ warningSource :: a -> Maybe String
60data Ann = AText String | ATagged OutputAnnotation Ann | ASplit Ann Ann
61data Ann = AText String | ATagged OutputAnnotation Ann | ASplit Ann Ann
62−iWarn :: FC -> OutputDoc -> Idris ()
63+data Hack = Hack FC OutputDoc
63−iWarn fc err =
64+instance Warning Hack where
65+ warningExtent (Hack extent _) = extent
66+ warningMessage (Hack _ msg) = msg
67+ warningSource _ = Nothing
69+formatWarning :: Warning w => w -> Idris OutputDoc
64− do i <- getIState
71+ i <- getIState
65− case idris_outputmode i of
72+ maybeSource <- case warningSource w of
66− RawOutput h ->
73+ Just src -> pure (Just src)
67− do maybeSource <- readSource fc
74+ Nothing -> readSource fc
68− let maybeFormattedSource = (maybeSource >>= layoutSource fc (idris_highlightedRegions i))
75+ let maybeFormattedSource = maybeSource >>= layoutSource fc (idris_highlightedRegions i)
69− err' <- iRender . fmap (fancifyAnnots i True) $
70− layoutWarning (layoutFC fc) maybeFormattedSource err
76+ return $ layoutWarning (layoutFC fc) maybeFormattedSource (warningMessage w)
73− do err' <- iRender . fmap (fancifyAnnots i True) $ err
74− let (str, spans) = displaySpans err'
75− runIO . hPutStrLn h $
76− convSExp "warning" (fc_fname fc, fc_start fc, fc_end fc, str, spans) n
78 layoutFC :: FC -> OutputDoc
81 layoutFC :: FC -> OutputDoc
79− layoutFC (FC fn _ _) | fn /= "" = text (show fc) <> colon
82+ layoutFC fc@(FC fn _ _) | fn /= "" = text (show $ fc) <> colon
80− layoutFC _ = empty
83+ layoutFC _ = empty
82 readSource :: FC -> Idris (Maybe String)
85 readSource :: FC -> Idris (Maybe String)
83 readSource (FC fn _ _) = do
86 readSource (FC fn _ _) = do
@@ -169,8 +172,23 @@ iWarn fc err =
169 layoutWarning loc (Just src) err = loc <$$> src <$$> err <$$> empty
172 layoutWarning loc (Just src) err = loc <$$> src <$$> err <$$> empty
170 layoutWarning loc Nothing err = loc </> err
173 layoutWarning loc Nothing err = loc </> err
175+iWarn :: FC -> OutputDoc -> Idris ()
176+iWarn fc err = emit $ Hack fc err
172emit :: Warning w => w -> Idris ()
178emit :: Warning w => w -> Idris ()
173−emit w = iWarn (warningExtent w) (warningMessage w)
179+emit w =
181+ case idris_outputmode i of
183+ do formattedErr <- formatWarning w
184+ err' <- iRender . fmap (fancifyAnnots i True) $ formattedErr
187+ do err' <- iRender . fmap (fancifyAnnots i True) $ warningMessage w
188+ let fc = warningExtent w
189+ let (str, spans) = displaySpans err'
190+ runIO . hPutStrLn h $
191+ convSExp "warning" (fc_fname fc, fc_start fc, fc_end fc, str, spans) n
175iRender :: Doc a -> Idris (SimpleDoc a)
193iRender :: Doc a -> Idris (SimpleDoc a)
176iRender d = do w <- getWidth
194iRender d = do w <- getWidth