Skip to content

Commit b78152f

Browse files
authored
Merge pull request #1354 from ucsd-progsys/json-types
Add span-support in JSON
2 parents b31fdc0 + dfe2350 commit b78152f

File tree

3 files changed

+36
-22
lines changed

3 files changed

+36
-22
lines changed

src/Language/Haskell/Liquid/UX/ACSS.hs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Language.Haskell.Liquid.UX.ACSS (
1010
) where
1111

1212
import Prelude hiding (error)
13+
import qualified SrcLoc
1314

1415
import Language.Haskell.HsColour.Anchors
1516
import Language.Haskell.HsColour.Classify as Classify
@@ -25,10 +26,11 @@ import Text.Printf
2526
import Language.Haskell.Liquid.GHC.Misc
2627
import Language.Haskell.Liquid.Types.Errors (panic, impossible)
2728

28-
data AnnMap = Ann {
29-
types :: M.HashMap Loc (String, String) -- ^ Loc -> (Var, Type)
30-
, errors :: [(Loc, Loc, String)] -- ^ List of error intervals
31-
, status :: !Status
29+
data AnnMap = Ann
30+
{ types :: M.HashMap Loc (String, String) -- ^ Loc -> (Var, Type)
31+
, errors :: [(Loc, Loc, String)] -- ^ List of error intervals
32+
, status :: !Status
33+
, sptypes :: ![(SrcLoc.RealSrcSpan, (String, String)) ]-- ^ Type information with spans
3234
}
3335

3436
data Status = Safe | Unsafe | Error | Crash
@@ -93,7 +95,7 @@ annotTokenise baseLoc tx (src, annm) = zipWith (\(x,y) z -> (x,y,z)) toks annots
9395
linWidth = length $ show $ length $ lines src
9496

9597
spanAnnot :: Int -> AnnMap -> Loc -> Annotation
96-
spanAnnot w (Ann ts es _) span = A t e b
98+
spanAnnot w (Ann ts es _ _) span = A t e b
9799
where
98100
t = fmap snd (M.lookup span ts)
99101
e = fmap (\_ -> "ERROR") $ find (span `inRange`) [(x,y) | (x,y,_) <- es]
@@ -177,7 +179,7 @@ splitSrcAndAnns :: String -> (String, AnnMap)
177179
splitSrcAndAnns s =
178180
let ls = lines s in
179181
case findIndex (breakS ==) ls of
180-
Nothing -> (s, Ann M.empty [] Safe)
182+
Nothing -> (s, Ann M.empty [] Safe mempty)
181183
Just i -> (src, ann)
182184
where (codes, _:mname:annots) = splitAt i ls
183185
ann = annotParse mname $ dropWhile isSpace $ unlines annots
@@ -198,7 +200,7 @@ breakS :: [Char]
198200
breakS = "MOUSEOVER ANNOTATIONS"
199201

200202
annotParse :: String -> String -> AnnMap
201-
annotParse mname s = Ann (M.fromList ts) [(x,y,"") | (x,y) <- es] Safe
203+
annotParse mname s = Ann (M.fromList ts) [(x,y,"") | (x,y) <- es] Safe mempty
202204
where
203205
(ts, es) = partitionEithers $ parseLines mname 0 $ lines s
204206

@@ -235,8 +237,9 @@ parseLines _ i _
235237
= panic Nothing $ "Error Parsing Annot Input on Line: " ++ show i
236238

237239
instance Show AnnMap where
238-
show (Ann ts es _ ) = "\n\n" ++ (concatMap ppAnnotTyp $ M.toList ts)
239-
++ (concatMap ppAnnotErr [(x,y) | (x,y,_) <- es])
240+
show (Ann ts es _ _) = "\n\n"
241+
++ (concatMap ppAnnotTyp $ M.toList ts)
242+
++ (concatMap ppAnnotErr [(x,y) | (x,y,_) <- es])
240243

241244
ppAnnotTyp :: (PrintfArg t, PrintfType t1) => (Loc, (t, String)) -> t1
242245
ppAnnotTyp (L (l, c), (x, s)) = printf "%s\n%d\n%d\n%d\n%s\n\n\n" x l c (length $ lines s) s

src/Language/Haskell/Liquid/UX/Annotate.hs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
{-# LANGUAGE TypeSynonymInstances #-}
66
{-# LANGUAGE FlexibleInstances #-}
77

8-
{- LIQUID "--diffcheck" @-}
98

109
---------------------------------------------------------------------------
1110
-- | This module contains the code that uses the inferred types to generate
@@ -14,10 +13,8 @@
1413
-- 3. JSON files for the web-demo etc.
1514
---------------------------------------------------------------------------
1615

17-
1816
module Language.Haskell.Liquid.UX.Annotate
19-
( specAnchor
20-
, mkOutput
17+
( mkOutput
2118
, annotate
2219
, tokeniseWithLoc
2320
, annErrors
@@ -67,7 +64,7 @@ import Language.Haskell.Liquid.Types.RefType
6764
import Language.Haskell.Liquid.UX.Errors ()
6865
import Language.Haskell.Liquid.UX.Tidy
6966
import Language.Haskell.Liquid.Types hiding (Located(..), Def(..))
70-
import Language.Haskell.Liquid.Types.Specifications
67+
-- import Language.Haskell.Liquid.Types.Specifications
7168

7269

7370
-- | @output@ creates the pretty printed output
@@ -230,7 +227,12 @@ cssHTML css = unlines
230227
-- annotations.
231228

232229
mkAnnMap :: Config -> ErrorResult -> AnnInfo Doc -> ACSS.AnnMap
233-
mkAnnMap cfg res ann = ACSS.Ann (mkAnnMapTyp cfg ann) (mkAnnMapErr res) (mkStatus res)
230+
mkAnnMap cfg res ann = ACSS.Ann
231+
{ ACSS.types = mkAnnMapTyp cfg ann
232+
, ACSS.errors = mkAnnMapErr res
233+
, ACSS.status = mkStatus res
234+
, ACSS.sptypes = mkAnnMapBinders cfg ann
235+
}
234236

235237
mkStatus :: FixResult t -> ACSS.Status
236238
mkStatus (Safe) = ACSS.Safe
@@ -255,8 +257,7 @@ cinfoErr e = case pos e of
255257
mkAnnMapTyp :: Config -> AnnInfo Doc -> M.HashMap Loc (String, String)
256258
mkAnnMapTyp cfg z = M.fromList $ map (first srcSpanStartLoc) $ mkAnnMapBinders cfg z
257259

258-
mkAnnMapBinders :: Config
259-
-> AnnInfo Doc -> [(SrcLoc.RealSrcSpan, (String, String))]
260+
mkAnnMapBinders :: Config -> AnnInfo Doc -> [(SrcLoc.RealSrcSpan, (String, String))]
260261
mkAnnMapBinders cfg (AI m)
261262
= map (second bindStr . head . sortWith (srcSpanEndCol . fst))
262263
$ groupWith (lineCol . fst) locBinds
@@ -423,6 +424,9 @@ instance ToJSON AnnErrors where
423424
, "message" .= toJSON (dropErrorLoc s)
424425
]
425426

427+
428+
429+
426430
dropErrorLoc :: String -> String
427431
dropErrorLoc msg
428432
| null msg' = msg
@@ -436,11 +440,18 @@ instance (Show k, ToJSON a) => ToJSON (Assoc k a) where
436440
tshow = T.pack . show
437441

438442
instance ToJSON ACSS.AnnMap where
439-
toJSON a = object [ "types" .= toJSON (annTypes a)
440-
, "errors" .= toJSON (annErrors a)
441-
, "status" .= toJSON (ACSS.status a)
443+
toJSON a = object [ "types" .= toJSON (annTypes a)
444+
, "errors" .= toJSON (annErrors a)
445+
, "status" .= toJSON (ACSS.status a)
446+
, "sptypes" .= (toJ <$> ACSS.sptypes a)
442447
]
443-
448+
where
449+
toJ (sp, (x,t)) = object [ "start" .= toJSON (srcSpanStartLoc sp)
450+
, "stop" .= toJSON (srcSpanEndLoc sp)
451+
, "ident" .= toJSON x
452+
, "ann" .= toJSON t
453+
]
454+
444455
annErrors :: ACSS.AnnMap -> AnnErrors
445456
annErrors = AnnErrors . ACSS.errors
446457

0 commit comments

Comments
 (0)