#3303: Allow multi-line deprecation messages.
-----------------------------+----------------------------------------------
Reporter: duncan | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler
Version: 6.10.2 | Severity: normal
Keywords: | Testcase:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
-----------------------------+----------------------------------------------
Sometimes one line just isn't enough. There's two related issues, pretty
source code and pretty warning messages.
It is a bit annoying when a `DEPRECATED` pragma stretches on past 80-100
columns or whatever. Does the ordinary multi-line Haskell string syntax
work in this situation? Even if it does it's not useful in practice due to
the cpp-incompatibility, and because it's a pragma, we cannot use the
normal `++` trick.
The other is presenting multi-line error messages to the user. Sometimes
we want to present more info, like not just what the alternative is but
for example when the alternative was added and when the deprecated thing
will be removed.
In Cabal for example we've got ugly hack:
{{{
{-# DEPRECATED defaultUserHooks
"Use simpleUserHooks or autoconfUserHooks, unless you need
Cabal-1.2\n compatibility in which case you must stick with
defaultUserHooks" #-}
}}}
Yes it's really that wide :-)
Reformatted:
{{{
{-# DEPRECATED defaultUserHooks
"Use simpleUserHooks or autoconfUserHooks, unless you \
need Cabal-1.2\n compatibility in which \
case you must stick with defaultUserHooks" #-}
}}}
Note the silly `"\n "` to make the multi-line message line up
ok in current ghc versions.
To allow embedded '\n' more sensibly, it just needs a slight tweak in the
rendering. Split the message into lines and then use `hsep` or equivalent.
That way we get correct indenting for free.
I'm not sure how long single-line messages get printed, but Cabal solves
this problem for its error messages by re-wrapping text, though it also
respects embedded newlines (to force line breaks or paragraph breaks).
{{{
-- | Wraps text to the default line width. Existing newlines are
preserved.
wrapText :: String -> String
wrapText = unlines
. concatMap (map unwords
. wrapLine 79
. words)
. lines
-- | Wraps a list of words to a list of lines of words of a particular
width.
wrapLine :: Int -> [String] -> [[String]]
wrapLine width = wrap 0 []
where wrap :: Int -> [String] -> [String] -> [[String]]
wrap 0 [] (w:ws)
| length w + 1 > width
= wrap (length w) [w] ws
wrap col line (w:ws)
| col + length w + 1 > width
= reverse line : wrap 0 [] (w:ws)
wrap col line (w:ws)
= let col' = col + length w + 1
in wrap col' (w:line) ws
wrap _ [] [] = []
wrap _ line [] = [reverse line]
}}}
There's also a more sophisticated version of this using the `Doc` type in
the gtk2hs code gen utils. It has a parameter for the line width and
handles prefix text on the first line.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3303>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs