@@ -40,6 +40,7 @@ import qualified Json.String as Json
40import qualified Parse.Keyword as K
40import qualified Parse.Keyword as K
41import qualified Parse.Primitives as P
41import qualified Parse.Primitives as P
42import Parse.Primitives (Row, Col)
42import Parse.Primitives (Row, Col)
43+import qualified Reporting.Annotation as A
@@ -88,8 +89,8 @@ data Problem x
88 = Field B.ByteString (Problem x)
89 = Field B.ByteString (Problem x)
89 | Index Int (Problem x)
90 | Index Int (Problem x)
90 | OneOf (Problem x) [Problem x]
91 | OneOf (Problem x) [Problem x]
91− | Failure x
92+ | Failure A.Region x
92− | Expecting DecodeExpectation
93+ | Expecting A.Region DecodeExpectation
95data DecodeExpectation
96data DecodeExpectation
@@ -156,26 +157,26 @@ instance Monad (Decoder x) where
157string :: Decoder x Json.String
158string :: Decoder x Json.String
159− Decoder $ \ast ok err ->
160+ Decoder $ \(A.At region ast) ok err ->
160 case ast of
161 case ast of
161 String snippet ->
162 String snippet ->
162 ok (Json.fromSnippet snippet)
163 ok (Json.fromSnippet snippet)
165− err (Expecting TString)
166+ err (Expecting region TString)
168customString :: P.Parser x a -> (Row -> Col -> x) -> Decoder x a
169customString :: P.Parser x a -> (Row -> Col -> x) -> Decoder x a
169customString parser toBadEnd =
170customString parser toBadEnd =
170− Decoder $ \ast ok err ->
171+ Decoder $ \(A.At region ast) ok err ->
171 case ast of
172 case ast of
172 String snippet ->
173 String snippet ->
173 case P.fromSnippet parser toBadEnd snippet of
174 case P.fromSnippet parser toBadEnd snippet of
174 Right a -> ok a
175 Right a -> ok a
175− Left x -> err (Failure x)
176+ Left x -> err (Failure region x)
178− err (Expecting TString)
179+ err (Expecting region TString)
@@ -184,7 +185,7 @@ customString parser toBadEnd =
185bool :: Decoder x Bool
186bool :: Decoder x Bool
187− Decoder $ \ast ok err ->
188+ Decoder $ \(A.At region ast) ok err ->
188 case ast of
189 case ast of
@@ -193,7 +194,7 @@ bool =
196− err (Expecting TBool)
197+ err (Expecting region TBool)
@@ -202,13 +203,13 @@ bool =
203int :: Decoder x Int
204int :: Decoder x Int
205− Decoder $ \ast ok err ->
206+ Decoder $ \(A.At region ast) ok err ->
206 case ast of
207 case ast of
211− err (Expecting TInt)
212+ err (Expecting region TInt)
@@ -217,13 +218,13 @@ int =
218list :: Decoder x a -> Decoder x [a]
219list :: Decoder x a -> Decoder x [a]
219list decoder =
220list decoder =
220− Decoder $ \ast ok err ->
221+ Decoder $ \(A.At region ast) ok err ->
221 case ast of
222 case ast of
222 Array asts ->
223 Array asts ->
223 listHelp decoder ok err 0 asts []
224 listHelp decoder ok err 0 asts []
226− err (Expecting TArray)
227+ err (Expecting region TArray)
229listHelp :: Decoder x a -> ([a] -> b) -> (Problem x -> b) -> Int -> [AST] -> [a] -> b
230listHelp :: Decoder x a -> ([a] -> b) -> (Problem x -> b) -> Int -> [AST] -> [a] -> b
@@ -258,7 +259,7 @@ nonEmptyList decoder x =
259pair :: Decoder x a -> Decoder x b -> Decoder x (a,b)
260pair :: Decoder x a -> Decoder x b -> Decoder x (a,b)
260pair (Decoder decodeA) (Decoder decodeB) =
261pair (Decoder decodeA) (Decoder decodeB) =
261− Decoder $ \ast ok err ->
262+ Decoder $ \(A.At region ast) ok err ->
262 case ast of
263 case ast of
263 Array vs ->
264 Array vs ->
264 case vs of
265 case vs of
@@ -275,10 +276,10 @@ pair (Decoder decodeA) (Decoder decodeB) =
275 decodeA astA ok0 err0
276 decodeA astA ok0 err0
278− err (Expecting (TArrayPair (length vs)))
279+ err (Expecting region (TArrayPair (length vs)))
281− err (Expecting TArray)
282+ err (Expecting region TArray)
@@ -296,13 +297,13 @@ dict keyDecoder valueDecoder =
297pairs :: KeyDecoder x k -> Decoder x a -> Decoder x [(k, a)]
298pairs :: KeyDecoder x k -> Decoder x a -> Decoder x [(k, a)]
298pairs keyDecoder valueDecoder =
299pairs keyDecoder valueDecoder =
299− Decoder $ \ast ok err ->
300+ Decoder $ \(A.At region ast) ok err ->
300 case ast of
301 case ast of
301 Object kvs ->
302 Object kvs ->
302 pairsHelp keyDecoder valueDecoder ok err kvs []
303 pairsHelp keyDecoder valueDecoder ok err kvs []
305− err (Expecting TObject)
306+ err (Expecting region TObject)
308pairsHelp :: KeyDecoder x k -> Decoder x a -> ([(k, a)] -> b) -> (Problem x -> b) -> [(P.Snippet, AST)] -> [(k, a)] -> b
309pairsHelp :: KeyDecoder x k -> Decoder x a -> ([(k, a)] -> b) -> (Problem x -> b) -> [(P.Snippet, AST)] -> [(k, a)] -> b
@@ -314,7 +315,7 @@ pairsHelp keyDecoder@(KeyDecoder keyParser toBadEnd) valueDecoder@(Decoder decod
314 (snippet, ast) : kvs ->
315 (snippet, ast) : kvs ->
315 case P.fromSnippet keyParser toBadEnd snippet of
316 case P.fromSnippet keyParser toBadEnd snippet of
316 Left x ->
317 Left x ->
317− err (Failure x)
318+ err (Failure (snippetToRegion snippet) x)
319 Right key ->
320 Right key ->
@@ -326,13 +327,18 @@ pairsHelp keyDecoder@(KeyDecoder keyParser toBadEnd) valueDecoder@(Decoder decod
326 decodeA ast ok' err'
327 decodeA ast ok' err'
330+snippetToRegion :: P.Snippet -> A.Region
331+snippetToRegion (P.Snippet _ _ len row col) =
332+ A.Region (A.Position row col) (A.Position row (col + fromIntegral len))
333field :: B.ByteString -> Decoder x a -> Decoder x a
339field :: B.ByteString -> Decoder x a -> Decoder x a
334field key (Decoder decodeA) =
340field key (Decoder decodeA) =
335− Decoder $ \ast ok err ->
341+ Decoder $ \(A.At region ast) ok err ->
336 case ast of
342 case ast of
337 Object kvs ->
343 Object kvs ->
338 case findField key kvs of
344 case findField key kvs of
@@ -344,10 +350,10 @@ field key (Decoder decodeA) =
344 decodeA value ok err'
350 decodeA value ok err'
346 Nothing ->
352 Nothing ->
347− err (Expecting (TObjectWith key))
353+ err (Expecting region (TObjectWith key))
350− err (Expecting TObject)
356+ err (Expecting region TObject)
353findField :: B.ByteString -> [(P.Snippet, AST)] -> Maybe AST
359findField :: B.ByteString -> [(P.Snippet, AST)] -> Maybe AST
@@ -411,8 +417,8 @@ oneOfError problems prob ps =
412failure :: x -> Decoder x a
418failure :: x -> Decoder x a
413failure x =
419failure x =
414− Decoder $ \_ _ err ->
420+ Decoder $ \(A.At region _) _ err ->
415− err (Failure x)
421+ err (Failure region x)
@@ -431,18 +437,22 @@ mapError func (Decoder decodeA) =
431mapErrorHelp :: (x -> y) -> Problem x -> Problem y
437mapErrorHelp :: (x -> y) -> Problem x -> Problem y
432mapErrorHelp func problem =
438mapErrorHelp func problem =
433 case problem of
439 case problem of
434− Field k p -> Field k (mapErrorHelp func p)
440+ Field k p -> Field k (mapErrorHelp func p)
435− Index i p -> Index i (mapErrorHelp func p)
441+ Index i p -> Index i (mapErrorHelp func p)
436− OneOf p ps -> OneOf (mapErrorHelp func p) (map (mapErrorHelp func) ps)
442+ OneOf p ps -> OneOf (mapErrorHelp func p) (map (mapErrorHelp func) ps)
437− Failure x -> Failure (func x)
443+ Failure r x -> Failure r (func x)
438− Expecting e -> Expecting e
444+ Expecting r e -> Expecting r e
445−data AST
451+type AST =
446 = Array [AST]
456 = Array [AST]
447 | Object [(P.Snippet, AST)]
457 | Object [(P.Snippet, AST)]
448 | String P.Snippet
458 | String P.Snippet
@@ -496,6 +506,7 @@ pFile =
497pValue :: Parser AST
507pValue :: Parser AST
499 P.oneOf Start
510 P.oneOf Start
500 [ String <$> pString Start
511 [ String <$> pString Start
501 , pObject
512 , pObject
@@ -511,7 +522,7 @@ pValue =
514−pObject :: Parser AST
525+pObject :: Parser AST_
516 do P.word1 0x7B {- { -} Start
527 do P.word1 0x7B {- { -} Start
@@ -524,7 +535,7 @@ pObject =
527−pObjectHelp :: [(P.Snippet, AST)] -> Parser AST
538+pObjectHelp :: [(P.Snippet, AST)] -> Parser AST_
528pObjectHelp revEntries =
539pObjectHelp revEntries =
529 P.oneOf ObjectEnd
540 P.oneOf ObjectEnd
@@ -553,7 +564,7 @@ pField =
556−pArray :: Parser AST
567+pArray :: Parser AST_
558 do P.word1 0x5B {-[-} Start
569 do P.word1 0x5B {-[-} Start
@@ -566,7 +577,7 @@ pArray =
569−pArrayHelp :: Int -> [AST] -> Parser AST
580+pArrayHelp :: Int -> [AST] -> Parser AST_
570pArrayHelp !len revEntries =
581pArrayHelp !len revEntries =
571 P.oneOf ArrayEnd
582 P.oneOf ArrayEnd
@@ -716,7 +727,7 @@ eatSpaces pos end row col =
719−pInt :: Parser AST
730+pInt :: Parser AST_
721 P.Parser $ \(P.State src pos end indent row col) cok _ cerr eerr ->
732 P.Parser $ \(P.State src pos end indent row col) cok _ cerr eerr ->
722 if pos >= end then
733 if pos >= end then