-
Notifications
You must be signed in to change notification settings - Fork 0
/
Render.hs
132 lines (102 loc) · 3.8 KB
/
Render.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
-- This file is part of FairCheck
--
-- FairCheck is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published
-- by the Free Software Foundation, either version 3 of the License,
-- or (at your option) any later version.
--
-- FairCheck is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with FairCheck. If not, see <http://www.gnu.org/licenses/>.
--
-- Copyright 2021 Luca Padovani
-- |Pretty printer for session types and error messages.
module Render
( printTitle
, printWarning
, printOK
, printNO
, printType )
where
import Atoms
import Prelude hiding ((<>))
import Type (Type)
import qualified Type
import Prettyprinter
import qualified Prettyprinter.Render.String as PR
import qualified Prettyprinter.Render.Terminal as PT
import qualified Data.Map as Map
import qualified Data.Set as S
-- PRETTY PRINTER COMPATIBILITY
type Document = Doc PT.AnsiStyle
keyword :: String -> Document
keyword = annotate (PT.color PT.Blue) . pretty
identifier :: String -> Document
identifier = pretty
constant :: String -> Document
constant = annotate (PT.color PT.Magenta) . pretty
operator :: String -> Document
operator = annotate PT.bold . pretty
emark :: Document
emark = operator "!"
qmark :: Document
qmark = operator "?"
dot :: Document
dot = operator "."
bar :: Document
bar = operator "|"
ampersand :: Document
ampersand = operator "&"
-- UTILITIES
embrace :: Document -> Document -> Document -> [Document] -> Document
embrace open close sep ds = align (encloseSep (open <> space) (space <> close) (sep <> space) ds)
sepembrace :: Document -> Document -> Document -> [Document] -> Document
sepembrace open close sep ds = embrace open close sep (map (<> space) (init ds) ++ [last ds])
-- LABELS
prettyLabel :: Label -> Document
prettyLabel = identifier . show
-- TYPES
prettyType :: Type -> Document
prettyType = annotate (PT.colorDull PT.Cyan) . aux
where
aux (Type.End pol) = operator (show pol) <> keyword "end"
aux (Type.Var tname) = identifier (show tname)
aux (Type.Rec tname t) = keyword "rec" <+> identifier (show tname) <> Render.dot <> aux t
aux (Type.Channel pol s t) = operator (show pol) <> brackets (aux s) <> Render.dot <> aux t
aux (Type.Label pol [(label, t)]) = operator (show pol) <> constant (show label) <> Render.dot <> aux t
aux (Type.Label pol bs) = operator (show pol) <> embrace lbrace rbrace comma (map auxB bs)
auxB (label, t) = constant (show label) <> colon <+> aux t
instance Show Type where
show = PR.renderString . layoutPretty defaultLayoutOptions . prettyType
-- |Print a type.
printType :: Type -> IO ()
printType = PT.putDoc . prettyType
-- AUXILIARY PRINTING OPERATIONS
-- |Print a newline.
printNewLine :: IO ()
printNewLine = putStrLn ""
-- |Print a string with style annotations.
printAnnotatedString :: [PT.AnsiStyle] -> String -> IO ()
printAnnotatedString anns msg = PT.putDoc (foldr annotate (pretty msg) anns)
-- |Print a string as a title.
printTitle :: String -> IO ()
printTitle msg = printAnnotatedString [PT.bold, PT.underlined] msg >> printNewLine
-- |Print a warning message.
printWarning :: String -> IO ()
printWarning msg = printAnnotatedString [PT.color PT.Red] msg >> printNewLine
-- |Print an error message.
printNO :: String -> IO ()
printNO msg = do
printAnnotatedString [PT.color PT.Red] "NO:"
putStrLn $ " " ++ msg
-- |Print a success message.
printOK :: Maybe String -> IO ()
printOK msg = do
printAnnotatedString [PT.bold, PT.color PT.Green] "OK"
case msg of
Nothing -> printNewLine
Just m -> putStrLn $ " (" ++ m ++ ")"