on master help sign in
Revive Elm.Docs and make it less clever
commitf41abda5cae1d5c3a078a6826885fd3cd7e9aab4 authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 11 Dec 2017, 16:27 (9 years ago) parent1b0a3bf
2 files changed+131−87
src/AST/Utils/Binop.hs+1−1 src/Elm/Docs.hs+130−86
src/AST/Utils/Binop.hs+1−1
@@ -1,6 +1,6 @@
11{-# OPTIONS_GHC -Wall #-}
22module AST.Utils.Binop
3− ( Precedence
3+ ( Precedence(..)
44 , Associativity(..)
55 )
66 where
src/Elm/Docs.hs+130−86
@@ -6,14 +6,12 @@ module Elm.Docs
66 , toDict
77 , decoder
88 , encode
9− , Docs.Docs(..)
10− , Docs.Checked
11− , Docs.Entry(..)
12− , Docs.Union(..)
13− , Docs.Alias(..)
14− , Docs.Value(..)
15− , Decl.Assoc(..)
16− , Decl.assocToText
9+ , Union(..)
10+ , Alias(..)
11+ , Value(..)
12+ , Binop(..)
13+ , Binop.Associativity(..)
14+ , Binop.Precedence(..)
1715 )
1816 where
1917
@@ -21,10 +19,10 @@ module Elm.Docs
2119import qualified Data.Map as Map
2220import Data.Text (Text)
2321
24−import qualified AST.Declaration as Decl
25−import qualified Docs.AST as Docs
22+import qualified AST.Utils.Binop as Binop
2623import qualified Elm.Compiler.Module as Module
2724import qualified Elm.Compiler.Type as Type
25+import qualified Elm.Name as N
2826import qualified Json.Decode as Decode
2927import qualified Json.Encode as Encode
3028import Json.Encode ((==>))
@@ -35,19 +33,39 @@ import Json.Encode ((==>))
3533
3634
3735type Documentation =
38− Map.Map Module.Raw Docs.Checked
36+ Map.Map N.Name Module
37+
38+
39+toDict :: [Module] -> Documentation
40+toDict modules =
41+ Map.fromList (map toPair modules)
42+
43+
44+
45+toPair :: Module -> (N.Name, Module)
46+toPair modul@(Module name _ _ _ _ _) =
47+ (name, modul)
48+
49+
50+
51+-- MODULES
3952
4053
4154data Module =
4255 Module
43− { _name :: !Module.Raw
44− , _docs :: !Docs.Checked
56+ { _name :: N.Name
57+ , _comment :: Text
58+ , _unions :: Map.Map N.Name Union
59+ , _aliases :: Map.Map N.Name Alias
60+ , _values :: Map.Map N.Name Value
61+ , _binops :: Map.Map N.Name Binop
4562 }
4663
4764
48−toDict :: [Module] -> Documentation
49−toDict modules =
50− Map.fromList $ map (\(Module name docs) -> (name, docs)) modules
65+data Alias = Alias Text [N.Name] Type.Type
66+data Union = Union Text [N.Name] [(N.Name, [Type.Type])]
67+data Value = Value Text Type.Type
68+data Binop = Binop Text Type.Type Binop.Associativity Binop.Precedence
5169
5270
5371
@@ -55,13 +73,14 @@ toDict modules =
5573
5674
5775encode :: Module -> Encode.Value
58−encode (Module name (Docs.Docs overview unions aliases values)) =
76+encode (Module name comment unions aliases values binops) =
5977 Encode.object $
6078 [ "name" ==> Module.encode name
61− , "comment" ==> Encode.text overview
62− , "types" ==> Encode.list encodeUnion (Map.toList unions)
79+ , "comment" ==> Encode.text comment
80+ , "unions" ==> Encode.list encodeUnion (Map.toList unions)
6381 , "aliases" ==> Encode.list encodeAlias (Map.toList aliases)
6482 , "values" ==> Encode.list encodeValue (Map.toList values)
83+ , "binops" ==> Encode.list encodeBinop (Map.toList binops)
6584 ]
6685
6786
@@ -73,36 +92,31 @@ decoder :: Decode.Decoder Module
7392decoder =
7493 Module
7594 <$> Decode.field "name" Module.decoder
76− <*> decodeDocs
95+ <*> Decode.field "comment" Decode.text
96+ <*> Decode.field "unions" (dictDecoder union)
97+ <*> Decode.field "aliases" (dictDecoder alias)
98+ <*> Decode.field "values" (dictDecoder value)
99+ <*> Decode.field "binops" (dictDecoder binop)
77100
78101
79−decodeDocs :: Decode.Decoder Docs.Checked
80−decodeDocs =
81− Docs.Docs
82− <$> Decode.field "comment" Decode.text
83− <*> Decode.field "types" (entryDictDecoder unionDecoder)
84− <*> Decode.field "aliases" (entryDictDecoder aliasDecoder)
85− <*> Decode.field "values" (entryDictDecoder valueDecoder)
86−
102+dictDecoder :: Decode.Decoder a -> Decode.Decoder (Map.Map N.Name a)
103+dictDecoder entryDecoder =
104+ Map.fromList <$> Decode.list (named entryDecoder)
87105
88−entryDictDecoder :: Decode.Decoder a -> Decode.Decoder (Map.Map Text (Docs.Good a))
89−entryDictDecoder subDecoder =
90− Map.fromList <$> Decode.list (entryDecoder subDecoder)
91106
92−
93−entryDecoder :: Decode.Decoder a -> Decode.Decoder ( Text, Docs.Good a )
94−entryDecoder subDecoder =
95− Decode.map2 (,) (Decode.field "name" Decode.text) $
96− Decode.map2 Docs.Entry (Decode.field "comment" Decode.text) $
97− subDecoder
107+named :: Decode.Decoder a -> Decode.Decoder (N.Name, a)
108+named entryDecoder =
109+ (,)
110+ <$> Decode.field "name" Decode.text
111+ <*> entryDecoder
98112
99113
100114
101−-- ENCODE UNION
115+-- UNION
102116
103117
104−encodeUnion :: ( Text, Docs.Good Docs.Union ) -> Encode.Value
105−encodeUnion ( name, Docs.Entry comment (Docs.Union args cases) ) =
118+encodeUnion :: (N.Name, Union) -> Encode.Value
119+encodeUnion (name, Union comment args cases) =
106120 Encode.object
107121 [ "name" ==> Encode.text name
108122 , "comment" ==> Encode.text comment
@@ -111,23 +125,24 @@ encodeUnion ( name, Docs.Entry comment (Docs.Union args cases) ) =
111125 ]
112126
113127
114−encodeCase :: ( Text, [Type.Type] ) -> Encode.Value
115−encodeCase ( tag, args ) =
116− Encode.list id [ Encode.text tag, Encode.list Type.encode args ]
128+union :: Decode.Decoder Union
129+union =
130+ Union
131+ <$> Decode.field "comment" Decode.text
132+ <*> Decode.field "args" (Decode.list Decode.text)
133+ <*> Decode.field "cases" (Decode.list caseDecoder)
117134
118135
119136
120−-- DECODE UNION
137+-- UNION CASE
121138
122139
123−unionDecoder :: Decode.Decoder Docs.Union
124−unionDecoder =
125− Docs.Union
126− <$> Decode.field "args" (Decode.list Decode.text)
127− <*> Decode.field "cases" (Decode.list caseDecoder)
140+encodeCase :: ( N.Name, [Type.Type] ) -> Encode.Value
141+encodeCase ( tag, args ) =
142+ Encode.list id [ Encode.text tag, Encode.list Type.encode args ]
128143
129144
130−caseDecoder :: Decode.Decoder ( Text, [Type.Type] )
145+caseDecoder :: Decode.Decoder ( N.Name, [Type.Type] )
131146caseDecoder =
132147 (,)
133148 <$> Decode.index 0 Decode.text
@@ -135,11 +150,11 @@ caseDecoder =
135150
136151
137152
138−-- ENCODE ALIAS
153+-- ALIAS
139154
140155
141−encodeAlias :: ( Text, Docs.Good Docs.Alias ) -> Encode.Value
142−encodeAlias ( name, Docs.Entry comment (Docs.Alias args tipe) ) =
156+encodeAlias :: (N.Name, Alias) -> Encode.Value
157+encodeAlias ( name, Alias comment args tipe) =
143158 Encode.object
144159 [ "name" ==> Encode.text name
145160 , "comment" ==> Encode.text comment
@@ -148,60 +163,89 @@ encodeAlias ( name, Docs.Entry comment (Docs.Alias args tipe) ) =
148163 ]
149164
150165
166+alias :: Decode.Decoder Alias
167+alias =
168+ Alias
169+ <$> Decode.field "comment" Decode.text
170+ <*> Decode.field "args" (Decode.list Decode.text)
171+ <*> Decode.field "type" Type.decoder
151172
152−-- DECODE ALIAS
153173
154174
155−aliasDecoder :: Decode.Decoder Docs.Alias
156−aliasDecoder =
157− Docs.Alias
158− <$> Decode.field "args" (Decode.list Decode.text)
175+-- ENCODE VALUE
176+
177+
178+encodeValue :: (N.Name, Value) -> Encode.Value
179+encodeValue (name, Value comment tipe) =
180+ Encode.object
181+ [ "name" ==> Encode.text name
182+ , "comment" ==> Encode.text comment
183+ , "type" ==> Type.encode tipe
184+ ]
185+
186+
187+value :: Decode.Decoder Value
188+value =
189+ Value
190+ <$> Decode.field "comment" Decode.text
159191 <*> Decode.field "type" Type.decoder
160192
161193
162194
163−-- ENCODE VALUE
195+-- BINOP
164196
165197
166−encodeValue :: ( Text, Docs.Good Docs.GoodValue ) -> Encode.Value
167−encodeValue ( name, Docs.Entry comment value ) =
168− Encode.object $
198+encodeBinop :: (N.Name, Binop) -> Encode.Value
199+encodeBinop (name, Binop comment tipe assoc prec) =
200+ Encode.object
169201 [ "name" ==> Encode.text name
170202 , "comment" ==> Encode.text comment
203+ , "type" ==> Type.encode tipe
204+ , "associativity" ==> encodeAssoc assoc
205+ , "precedence" ==> encodePrec prec
171206 ]
172− ++
173− case value of
174− Docs.Value tipe ->
175− [ "type" ==> Type.encode tipe
176− ]
177207
178− Docs.Infix tipe assoc prec ->
179− [ "type" ==> Type.encode tipe
180− , "associativity" ==> Encode.text (Decl.assocToText assoc)
181− , "precedence" ==> Encode.int prec
182− ]
208+
209+binop :: Decode.Decoder Binop
210+binop =
211+ Binop
212+ <$> Decode.field "comment" Decode.text
213+ <*> Decode.field "type" Type.decoder
214+ <*> Decode.field "associativity" assocDecoder
215+ <*> Decode.field "precedence" precDecoder
183216
184217
185218
186−-- DECODE VALUE
219+-- ASSOCIATIVITY
187220
188221
189−valueDecoder :: Decode.Decoder Docs.GoodValue
190−valueDecoder =
191− do tipe <- Decode.field "type" Type.decoder
192− Decode.oneOf
193− [ Docs.Infix tipe
194− <$> Decode.field "associativity" assocDecoder
195− <*> Decode.field "precedence" Decode.int
196− , Decode.succeed (Docs.Value tipe)
197− ]
222+encodeAssoc :: Binop.Associativity -> Encode.Value
223+encodeAssoc assoc =
224+ case assoc of
225+ Binop.Left -> Encode.text "left"
226+ Binop.Non -> Encode.text "non"
227+ Binop.Right -> Encode.text "right"
198228
199229
200−assocDecoder :: Decode.Decoder Decl.Assoc
230+assocDecoder :: Decode.Decoder Binop.Associativity
201231assocDecoder =
202232 do txt <- Decode.text
203233 case txt of
204− "left" -> Decode.succeed Decl.Left
205− "non" -> Decode.succeed Decl.Non
206− "right" -> Decode.succeed Decl.Right
234+ "left" -> Decode.succeed Binop.Left
235+ "non" -> Decode.succeed Binop.Non
236+ "right" -> Decode.succeed Binop.Right
207237 _ -> Decode.fail "Expecting an ASSOCIATIVITY (e.g. left, non, right)"
238+
239+
240+
241+-- PRECEDENCE
242+
243+
244+encodePrec :: Binop.Precedence -> Encode.Value
245+encodePrec (Binop.Precedence n) =
246+ Encode.int n
247+
248+
249+precDecoder :: Decode.Decoder Binop.Precedence
250+precDecoder =
251+ Binop.Precedence <$> Decode.int