Commit afcfb62b authored by Dave Laing's avatar Dave Laing Committed by thomie

Change 'Tab character' warnings so there is one per file (#9723)

Reviewed By: nomeata, thomie

Differential Revision: https://phabricator.haskell.org/D760Signed-off-by: Dave Laing's avatarDave Laing <dave.laing.80@gmail.com>
parent 4c1e1c87
......@@ -203,7 +203,7 @@ haskell :-
-- everywhere: skip whitespace
$white_no_nl+ ;
$tab+ { warn Opt_WarnTabs (text "Tab character") }
$tab { warnTab }
-- Everywhere: deal with nested comments. We explicitly rule out
-- pragmas, "{-#", so that we don't accidentally treat them as comments.
......@@ -1655,6 +1655,11 @@ warn option warning srcspan _buf _len = do
addWarning option (RealSrcSpan srcspan) warning
lexToken
warnTab :: Action
warnTab srcspan _buf _len = do
addTabWarning srcspan
lexToken
warnThen :: WarningFlag -> SDoc -> Action -> Action
warnThen option warning action srcspan buf len = do
addWarning option (RealSrcSpan srcspan) warning
......@@ -1680,6 +1685,8 @@ data PState = PState {
buffer :: StringBuffer,
dflags :: DynFlags,
messages :: Messages,
tab_first :: Maybe RealSrcSpan, -- pos of first tab warning in the file
tab_count :: !Int, -- number of tab warnings in the file
last_tk :: Maybe Token,
last_loc :: RealSrcSpan, -- pos of previous token
last_len :: !Int, -- len of previous token
......@@ -2083,6 +2090,8 @@ mkPState flags buf loc =
buffer = buf,
dflags = flags,
messages = emptyMessages,
tab_first = Nothing,
tab_count = 0,
last_tk = Nothing,
last_loc = mkRealSrcSpan loc loc,
last_len = 0,
......@@ -2146,8 +2155,34 @@ addWarning option srcspan warning
ws' = if wopt option d then ws `snocBag` warning' else ws
in POk s{messages=(ws', es)} ()
addTabWarning :: RealSrcSpan -> P ()
addTabWarning srcspan
= P $ \s@PState{tab_first=tf, tab_count=tc, dflags=d} ->
let tf' = if isJust tf then tf else Just srcspan
tc' = tc + 1
s' = if wopt Opt_WarnTabs d
then s{tab_first = tf', tab_count = tc'}
else s
in POk s' ()
addTabWarning _
= P $ \s -> POk s ()
mkTabWarning :: PState -> Maybe ErrMsg
mkTabWarning PState{tab_first=tf, tab_count=tc, dflags=d} =
let middle = if tc == 1
then text ""
else text ", and in" <+> speakNOf (tc - 1) (text "further location")
message = text "Tab character found here"
<> middle
<> text "."
$+$ text "Please use spaces instead."
in fmap (\s -> mkWarnMsg d (RealSrcSpan s) alwaysQualify message) tf
getMessages :: PState -> Messages
getMessages PState{messages=ms} = ms
getMessages p@PState{messages=(ws,es)} =
let tabwarning = mkTabWarning p
ws' = maybe ws (`consBag` ws) tabwarning
in (ws', es)
getContext :: P [LayoutContext]
getContext = P $ \s@PState{context=ctx} -> POk s ctx
......
......@@ -8,7 +8,9 @@ werror.hs:7:13: Warning:
werror.hs:7:13: Warning: Defined but not used: ‘main’
werror.hs:8:1: Warning: Tab character
werror.hs:8:1: Warning:
Tab character found here.
Please use spaces instead.
werror.hs:10:1: Warning: Defined but not used: ‘f’
......
{-# OPTIONS -fwarn-tabs #-}
-- Check we get a warning for a single tab
module ShouldCompile where
tab1 = 'a'
T9723a.hs:8:5: Warning:
Tab character found here.
Please use spaces instead.
{-# OPTIONS -fwarn-tabs #-}
-- Check we get a warning for multiple tabs, with the correct number of tabs
-- mentioned
module ShouldCompile where
-- tab in middle of line
tab1 = 'a'
-- tab at end of line
tab2 = 'b'
-- two tabs in middle of line
tab3 = 'c'
tab4 = if True
-- tab at start of line
then 'd'
-- tab at start of line
else 'e'
-- tab before a comment starts
T9723b.hs:9:5: Warning:
Tab character found here, and in six further locations.
Please use spaces instead.
......@@ -98,3 +98,5 @@ test('T7118', normal, compile, [''])
test('T7776', normal, compile, [''])
test('RdrNoStaticPointers01', when(compiler_lt('ghc', '7.9'), skip), compile, [''])
test('T5682', normal, compile, [''])
test('T9723a', normal, compile, [''])
test('T9723b', normal, compile, [''])
read043.hs:8:5: Warning: Tab character
read043.hs:10:5: Warning: Tab character
read043.hs:8:5: Warning:
Tab character found here, and in one further location.
Please use spaces instead.
T9230.hs:5:1: Warning: Tab character
T9230.hs:5:1: Warning:
Tab character found here.
Please use spaces instead.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment