[GHC] #7351: showRichTokenStream has an off-by one error on starting col
GHC
cvs-ghc at haskell.org
Wed Oct 24 14:14:32 CEST 2012
#7351: showRichTokenStream has an off-by one error on starting col
---------------------------------+------------------------------------------
Reporter: alanz | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHC API | Version: 7.6.1
Keywords: | Os: Unknown/Multiple
Architecture: Unknown/Multiple | Failure: None/Unknown
Difficulty: Unknown | Testcase:
Blockedby: | Blocking:
Related: |
---------------------------------+------------------------------------------
Changes (by simonmar):
* difficulty: => Unknown
Old description:
> When using showRichTokenStream to re-create a source file, all lines
> after the first one start one column from the left.
>
> The code for advancing to a new line has an off-by one bug where it
> assumes zero based columns.
>
> I have marked what I assume to be a fix in the pasted code below.
>
> -------
> showRichTokenStream ts = go startLoc ts ""
> where sourceFile = getFile $ map (getLoc . fst) ts
> getFile [] = panic "showRichTokenStream: No source file found"
> getFile (UnhelpfulSpan _ : xs) = getFile xs
> getFile (RealSrcSpan s : _) = srcSpanFile s
> startLoc = mkRealSrcLoc sourceFile 1 1
> go _ [] = id
> go loc ((L span _, str):ts)
> = case span of
> UnhelpfulSpan _ -> go loc ts
> RealSrcSpan s
> | locLine == tokLine -> ((replicate (tokCol - locCol) '
> ') ++)
> . (str ++)
> . go tokEnd ts
> | otherwise -> ((replicate (tokLine - locLine) '\n') ++)
> . ((replicate (tokCol - 1) ' ') ++) -- AZ:
> updated line
> . (str ++)
> . go tokEnd ts
> where (locLine, locCol) = (srcLocLine loc, srcLocCol
> loc)
> (tokLine, tokCol) = (srcSpanStartLine s,
> srcSpanStartCol s)
> tokEnd = realSrcSpanEnd s
> ----------
New description:
When using showRichTokenStream to re-create a source file, all lines after
the first one start one column from the left.
The code for advancing to a new line has an off-by one bug where it
assumes zero based columns.
I have marked what I assume to be a fix in the pasted code below.
{{{
showRichTokenStream ts = go startLoc ts ""
where sourceFile = getFile $ map (getLoc . fst) ts
getFile [] = panic "showRichTokenStream: No source file found"
getFile (UnhelpfulSpan _ : xs) = getFile xs
getFile (RealSrcSpan s : _) = srcSpanFile s
startLoc = mkRealSrcLoc sourceFile 1 1
go _ [] = id
go loc ((L span _, str):ts)
= case span of
UnhelpfulSpan _ -> go loc ts
RealSrcSpan s
| locLine == tokLine -> ((replicate (tokCol - locCol) '
') ++)
. (str ++)
. go tokEnd ts
| otherwise -> ((replicate (tokLine - locLine) '\n') ++)
. ((replicate (tokCol - 1) ' ') ++) -- AZ:
updated line
. (str ++)
. go tokEnd ts
where (locLine, locCol) = (srcLocLine loc, srcLocCol
loc)
(tokLine, tokCol) = (srcSpanStartLine s,
srcSpanStartCol s)
tokEnd = realSrcSpanEnd s
}}}
--
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7351#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list