git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Tighten source-spans to token end position
0100861Nicholas Wolverson
src/Language/PureScript/Parser/Declarations.hs+6−1
@@ -52,7 +52,11 @@ withSourceSpan f p = do
52 comments <- C.readComments
52 comments <- C.readComments
53 x <- p
53 x <- p
54 end <- P.getPosition
54 end <- P.getPosition
55+ input <- P.getInput
56+ let end' = case input of
57+ pt:_ -> ptPrevEndPos pt
58+ _ -> Nothing
55− let sp = SourceSpan (P.sourceName start) (C.toSourcePos start) (C.toSourcePos end)
59+ let sp = SourceSpan (P.sourceName start) (C.toSourcePos start) (C.toSourcePos $ fromMaybe end end')
56 return $ f sp comments x
60 return $ f sp comments x
57
61
58kindedIdent :: TokenParser (String, Maybe Kind)
62kindedIdent :: TokenParser (String, Maybe Kind)
@@ -273,6 +277,7 @@ parseModulesFromFiles toFilePath input = do
273 inParallel :: [Either P.ParseError (k, [Module])] -> [Either P.ParseError (k, [Module])]
277 inParallel :: [Either P.ParseError (k, [Module])] -> [Either P.ParseError (k, [Module])]
274 inParallel = withStrategy (parList rseq)
278 inParallel = withStrategy (parList rseq)
275
279
280+
276toPositionedError :: P.ParseError -> ErrorMessage
281toPositionedError :: P.ParseError -> ErrorMessage
277toPositionedError perr = ErrorMessage [ PositionedError (SourceSpan name start end) ] (ErrorParsingModule perr)
282toPositionedError perr = ErrorMessage [ PositionedError (SourceSpan name start end) ] (ErrorParsingModule perr)
278 where
283 where
src/Language/PureScript/Parser/Lexer.hs+17−4
@@ -152,7 +152,12 @@ prettyPrintToken (Number n) = either show show n
152prettyPrintToken (HoleLit name) = "?" ++ name
152prettyPrintToken (HoleLit name) = "?" ++ name
153
153
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
163
168
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
171+
172+updatePositions :: [PositionedToken] -> [PositionedToken]
173+updatePositions [] = []
174+updatePositions (x:xs) = x : zipWith update (x:xs) xs
175+ where
176+ update PositionedToken { ptEndPos = pos } pt = pt { ptPrevEndPos = Just pos }
166
177
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
199+ whitespace
187− return $ PositionedToken pos tok comments
200+ return $ PositionedToken pos pos' Nothing tok comments
188
201
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+ ]
225
238
226 where
239 where
227 parseLName :: P.Parsec String u String
240 parseLName :: P.Parsec String u String
src/Language/PureScript/Parser/State.hs−2
@@ -26,5 +26,3 @@ data ParseState = ParseState {
26 --
26 --
27 indentationLevel :: P.Column
27 indentationLevel :: P.Column
28 } deriving Show
28 } deriving Show
29−
30−