Monotonic locations (#17632)
When GHC is parsing a file generated by a tool, e.g. by the C preprocessor, the
tool may insert #line
pragmas to adjust the locations reported to the user.
As the result, the locations recorded in RealSrcLoc
are not monotonic. Elements
that appear later in the StringBuffer
are not guaranteed to have a higher
line/column number.
In fact, there are no guarantees whatsoever, as #line
pragmas can arbitrarily
modify locations. This lack of guarantees makes ideas such as #17544 (closed)
infeasible.
This patch adds an additional bit of information to every SrcLoc
:
newtype BufPos = BufPos { bufPos :: Int }
A BufPos
represents the location in the StringBuffer
, unaffected by any
pragmas.