From f41e3ea766c340c49b829eabfdea7c77bda2a95e Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Sat, 28 Nov 2009 15:12:04 +0000 Subject: [PATCH] Teach advanceSrcLoc about tab characters --- compiler/basicTypes/SrcLoc.lhs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/basicTypes/SrcLoc.lhs b/compiler/basicTypes/SrcLoc.lhs index 20e1bca..e213bef 100644 --- a/compiler/basicTypes/SrcLoc.lhs +++ b/compiler/basicTypes/SrcLoc.lhs @@ -72,6 +72,8 @@ module SrcLoc ( import Util import Outputable import FastString + +import Data.Bits \end{code} %************************************************************************ @@ -131,10 +133,13 @@ srcLocCol :: SrcLoc -> Int srcLocCol (SrcLoc _ _ c) = c srcLocCol _other = panic "srcLocCol: unknown col" --- | Move the 'SrcLoc' down by one line if the character is a newline --- and across by one character in any other case +-- | Move the 'SrcLoc' down by one line if the character is a newline, +-- to the next 8-char tabstop if it is a tab, and across by one +-- character in any other case advanceSrcLoc :: SrcLoc -> Char -> SrcLoc advanceSrcLoc (SrcLoc f l _) '\n' = SrcLoc f (l + 1) 1 +advanceSrcLoc (SrcLoc f l c) '\t' = SrcLoc f l ((((c `shiftR` 3) + 1) + `shiftL` 3) + 1) advanceSrcLoc (SrcLoc f l c) _ = SrcLoc f l (c + 1) advanceSrcLoc loc _ = loc -- Better than nothing \end{code} -- 1.7.10.4