@@ -3,22 +3,32 @@ module Artifacts
3 ( Artifacts(..)
3 ( Artifacts(..)
4 , loadCompile
4 , loadCompile
10import Control.Concurrent (readMVar)
11import Control.Concurrent (readMVar)
11import Control.Monad (liftM2)
12import Control.Monad (liftM2)
13+import qualified Data.ByteString as BS
14+import qualified Data.ByteString.Builder as B
15+import qualified Data.ByteString.Lazy as LBS
12import qualified Data.Map as Map
16import qualified Data.Map as Map
17+import qualified Data.Name as N
13import qualified Data.OneOrMore as OneOrMore
18import qualified Data.OneOrMore as OneOrMore
14import qualified System.Directory as Dir
19import qualified System.Directory as Dir
15import System.FilePath ((</>))
20import System.FilePath ((</>))
22+import qualified AST.Canonical as Can
17import qualified AST.Optimized as Opt
23import qualified AST.Optimized as Opt
18import qualified BackgroundWriter as BW
24import qualified BackgroundWriter as BW
19import qualified Elm.Details as Details
25import qualified Elm.Details as Details
20import qualified Elm.Interface as I
26import qualified Elm.Interface as I
21import qualified Elm.ModuleName as ModuleName
27import qualified Elm.ModuleName as ModuleName
28+import qualified Elm.Package as Pkg
29+import Json.Encode ((==>))
30+import qualified Json.Encode as E
31+import qualified Json.String as Json
22import qualified Reporting
32import qualified Reporting
@@ -90,3 +100,55 @@ toUnique oneOrMore =
90 OneOrMore.One value -> Just value
100 OneOrMore.One value -> Just value
91 OneOrMore.More _ _ -> Nothing
101 OneOrMore.More _ _ -> Nothing
108+toEditorHints :: Artifacts -> BS.ByteString
109+toEditorHints (Artifacts ifaces _) =
110+ LBS.toStrict $ B.toLazyByteString $ E.encodeUgly $ encode ifaces
117+encode :: Map.Map ModuleName.Raw I.Interface -> E.Value
119+ E.dict Json.fromName encodeInterface ifaces
122+encodeInterface :: I.Interface -> E.Value
123+encodeInterface (I.Interface pkg values unions aliases binops) =
125+ [ "home" ==> E.chars (Pkg.toChars pkg)
126+ , "values" ==> E.list E.name (Map.keys binops ++ Map.keys values)
127+ , "aliases" ==> E.list E.name (Map.keys (Map.filter isPublicAlias aliases))
128+ , "types" ==> E.dict Json.fromName (E.list E.name) (Map.mapMaybe toPublicUnion unions)
132+isPublicAlias :: I.Alias -> Bool
133+isPublicAlias alias =
135+ I.PublicAlias _ -> True
136+ I.PrivateAlias _ -> False
139+toPublicUnion :: I.Union -> Maybe [N.Name]
140+toPublicUnion union =
142+ I.OpenUnion (Can.Union _ variants _ _) ->
143+ Just (map getVariantName variants)
152+getVariantName :: Can.Ctor -> N.Name
153+getVariantName (Can.Ctor name _ _ _) =