@@ -228,15 +228,27 @@ whitespace :: String
228whitespace = "WHITESPACE"
228whitespace = "WHITESPACE"
231keyword :: String -> String
235keyword :: String -> String
232keyword kwd =
236keyword kwd =
233 "KEYWORD=" ++ kwd
237 "KEYWORD=" ++ kwd
236−unkeyword :: String -> Maybe String
240+data SpecialMessage
237−unkeyword message =
241+ = MsgKeyword String
245+extractSpecialMessage :: String -> Maybe SpecialMessage
246+extractSpecialMessage message =
238 if List.isPrefixOf "KEYWORD=" message then
247 if List.isPrefixOf "KEYWORD=" message then
239− Just (drop (length "KEYWORD=") message)
248+ Just $ MsgKeyword (drop (length "KEYWORD=") message)
250+ else if tab == message then
@@ -263,7 +275,12 @@ parseErrorReport messages =
279+ -- Our parser looks for tab so it can throw a custom tab error message.
280+ -- Exclude tabs from the list of expected tokens so that no one thinks they are supported.
266− hint { _expected = Set.insert msg' (_expected hint) }
283+ hint { _expected = Set.insert msg' (_expected hint) }
268 Parsec.Message msg ->
285 Parsec.Message msg ->
269 hint { _messages = msg : _messages hint }
286 hint { _messages = msg : _messages hint }
@@ -274,12 +291,17 @@ parseErrorReport messages =
274 (preHint, maybePost) =
291 (preHint, maybePost) =
275 case msgs of
292 case msgs of
277− case unkeyword msg of
294+ case extractSpecialMessage msg of
278− Just kwd ->
295+ Just (MsgKeyword kwd) ->
279 ( "It looks like the keyword `" ++ kwd ++ "` is being used as a variable."
296 ( "It looks like the keyword `" ++ kwd ++ "` is being used as a variable."
280 , Just "Rename it to something else."
297 , Just "Rename it to something else."
301+ ( "A tab character was found, but all whitespace (including indentation) must be spaces not tabs."
302+ , Just "I am looking for spaces, not tabs."
283 Nothing ->
305 Nothing ->
285 , Nothing
307 , Nothing