@@ -5,18 +5,27 @@ module Reporting.Render.Code
6 , toSnippet
6 , toSnippet
12import qualified Data.ByteString as B
14import qualified Data.ByteString as B
13import qualified Data.ByteString.UTF8 as UTF8_BS
15import qualified Data.ByteString.UTF8 as UTF8_BS
16+import qualified Data.Char as Char
17+import qualified Data.IntSet as IntSet
14import qualified Data.List as List
18import qualified Data.List as List
19+import qualified Data.Name as Name
20+import qualified Data.Set as Set
15import Data.Word (Word16)
21import Data.Word (Word16)
17import qualified Reporting.Annotation as A
23import qualified Reporting.Annotation as A
18import qualified Reporting.Doc as D
24import qualified Reporting.Doc as D
19import Reporting.Doc (Doc)
25import Reporting.Doc (Doc)
26+import Parse.Primitives (Row, Col)
27+import Parse.Symbol (binopCharSet)
28+import Parse.Variable (reservedWords)
@@ -180,3 +189,55 @@ renderPair source@(Source sourceLines) region1 region2 =
180 TwoChunks
189 TwoChunks
181 (render source region1 Nothing)
190 (render source region1 Nothing)
182 (render source region2 Nothing)
191 (render source region2 Nothing)
208+whatIsNext :: Source -> Row -> Col -> Next
209+whatIsNext (Source sourceLines) row col =
210+ case List.lookup row sourceLines of
216+ chars = drop (fromIntegral col - 1) line
218+ case List.find (\kwd -> startsWith kwd chars) (map Name.toChars (Set.toList reservedWords)) of
223+ case takeWhile isSymbol chars of
228+ | null chars -> Spaces
229+ | startsWith " " chars -> Spaces
230+ | startsWith ")" chars -> CloseParen
231+ | startsWith "]" chars -> CloseSquare
232+ | startsWith "}" chars -> CloseCurly
233+ | otherwise -> Other
236+isSymbol :: Char -> Bool
238+ IntSet.member (Char.ord char) binopCharSet
241+startsWith :: [Char] -> [Char] -> Bool