@@ -152,7 +152,12 @@ prettyPrintToken (Number n) = either show show n
152prettyPrintToken (HoleLit name) = "?" ++ name
152prettyPrintToken (HoleLit name) = "?" ++ name
154data PositionedToken = PositionedToken
154data PositionedToken = PositionedToken
155+ { -- | Start position of this token
155− { ptSourcePos :: P.SourcePos
156+ ptSourcePos :: P.SourcePos
157+ -- | End position of this token (not including whitespace)
158+ , ptEndPos :: P.SourcePos
159+ -- | End position of the previous token
160+ , ptPrevEndPos :: Maybe P.SourcePos
156 , ptToken :: Token
161 , ptToken :: Token
157 , ptComments :: [Comment]
162 , ptComments :: [Comment]
158 } deriving (Eq)
163 } deriving (Eq)
@@ -162,7 +167,13 @@ instance Show PositionedToken where
162 show = prettyPrintToken . ptToken
167 show = prettyPrintToken . ptToken
164lex :: FilePath -> String -> Either P.ParseError [PositionedToken]
169lex :: FilePath -> String -> Either P.ParseError [PositionedToken]
165−lex = P.parse parseTokens
170+lex f s = updatePositions <$> P.parse parseTokens f s
172+updatePositions :: [PositionedToken] -> [PositionedToken]
173+updatePositions [] = []
174+updatePositions (x:xs) = x : zipWith update (x:xs) xs
176+ update PositionedToken { ptEndPos = pos } pt = pt { ptPrevEndPos = Just pos }
167parseTokens :: P.Parsec String u [PositionedToken]
178parseTokens :: P.Parsec String u [PositionedToken]
168parseTokens = whitespace *> P.many parsePositionedToken <* P.skipMany parseComment <* P.eof
179parseTokens = whitespace *> P.many parsePositionedToken <* P.skipMany parseComment <* P.eof
@@ -184,7 +195,9 @@ parsePositionedToken = P.try $ do
184 comments <- P.many parseComment
195 comments <- P.many parseComment
185 pos <- P.getPosition
196 pos <- P.getPosition
186 tok <- parseToken
197 tok <- parseToken
198+ pos' <- P.getPosition
187− return $ PositionedToken pos tok comments
200+ return $ PositionedToken pos pos' Nothing tok comments
189parseToken :: P.Parsec String u Token
202parseToken :: P.Parsec String u Token
190parseToken = P.choice
203parseToken = P.choice
@@ -221,7 +234,7 @@ parseToken = P.choice
221 , CharLiteral <$> parseCharLiteral
234 , CharLiteral <$> parseCharLiteral
222 , StringLiteral <$> parseStringLiteral
235 , StringLiteral <$> parseStringLiteral
223 , Number <$> parseNumber
236 , Number <$> parseNumber
224− ] <* whitespace
237+ ]
227 parseLName :: P.Parsec String u String
240 parseLName :: P.Parsec String u String