@@ -1,17 +1,19 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Elm.Docs where
2module Elm.Docs where
4−import Control.Applicative ((<$>),(<*>))
4+import Control.Applicative ((<$>),(<*>),(<|>))
5import Control.Monad
5import Control.Monad
6import Data.Aeson ((.:), (.:?), (.=))
6import Data.Aeson ((.:), (.:?), (.=))
7import qualified Data.Aeson as Json
7import qualified Data.Aeson as Json
8import qualified Data.Aeson.Encode.Pretty as Json
8import qualified Data.Aeson.Encode.Pretty as Json
9import qualified Data.ByteString.Lazy.Char8 as BS
9import qualified Data.ByteString.Lazy.Char8 as BS
10import qualified Data.Map as Map
10import qualified Data.Map as Map
11+import qualified Data.Text as Text
12import qualified Docs.AST as Docs
13import qualified Docs.AST as Docs
13import qualified Elm.Compiler.Module as Module
14import qualified Elm.Compiler.Module as Module
14import qualified Elm.Compiler.Type as Type
15import qualified Elm.Compiler.Type as Type
16+import qualified Elm.Compiler.Version as Version
15import qualified Reporting.Annotation as A
17import qualified Reporting.Annotation as A
@@ -21,6 +23,7 @@ data Documentation = Documentation
21 , aliases :: [Alias]
23 , aliases :: [Alias]
22 , types :: [Union]
24 , types :: [Union]
23 , values :: [Value]
25 , values :: [Value]
@@ -48,6 +51,9 @@ data Value = Value
54+data Version = NonCanonicalTypes | Version String
51-- FROM CHECKED DOCS
57-- FROM CHECKED DOCS
53fromCheckedDocs :: Module.Name -> Docs.Checked -> Documentation
59fromCheckedDocs :: Module.Name -> Docs.Checked -> Documentation
@@ -69,6 +75,7 @@ fromCheckedDocs name (Docs.Docs comment aliases unions values) =
69 (map toAlias (Map.toList aliases))
75 (map toAlias (Map.toList aliases))
70 (map toUnion (Map.toList unions))
76 (map toUnion (Map.toList unions))
71 (map toValue (Map.toList values))
77 (map toValue (Map.toList values))
78+ (Version Version.version)
74-- PRETTY JSON
81-- PRETTY JSON
@@ -94,13 +101,14 @@ config =
94-- JSON for DOCUMENTATION
101-- JSON for DOCUMENTATION
96instance Json.ToJSON Documentation where
103instance Json.ToJSON Documentation where
97− toJSON (Documentation name comment aliases types values) =
104+ toJSON (Documentation name comment aliases types values version) =
98 Json.object
105 Json.object
99 [ "name" .= name
106 [ "name" .= name
100 , "comment" .= comment
107 , "comment" .= comment
101 , "aliases" .= aliases
108 , "aliases" .= aliases
102 , "types" .= types
109 , "types" .= types
103 , "values" .= values
110 , "values" .= values
111+ , "generated-with-elm-version" .= version
@@ -112,11 +120,34 @@ instance Json.FromJSON Documentation where
112 <*> obj .: "aliases"
120 <*> obj .: "aliases"
113 <*> obj .: "types"
121 <*> obj .: "types"
114 <*> obj .: "values"
122 <*> obj .: "values"
123+ <*> ((obj .: "generated-with-elm-version") <|> return NonCanonicalTypes)
116 parseJSON value =
125 parseJSON value =
117 fail $ "Cannot decode Documentation from: " ++ BS.unpack (Json.encode value)
126 fail $ "Cannot decode Documentation from: " ++ BS.unpack (Json.encode value)
131+instance Json.ToJSON Version where
134+ NonCanonicalTypes ->
138+ Json.String (Text.pack vsn)
141+instance Json.FromJSON Version where
142+ parseJSON (Json.String text) =
143+ case Text.unpack text of
144+ "old" -> return NonCanonicalTypes
145+ vrsn -> return (Version vrsn)
148+ fail $ "Cannot decode version of documentation from: " ++ BS.unpack (Json.encode value)
120-- JSON for ALIAS
151-- JSON for ALIAS
122instance Json.ToJSON Alias where
153instance Json.ToJSON Alias where