on master help sign in
add /compile/editor-hints.json endpoint
c4118b5Evan Czaplicki
worker/src/Artifacts.hs+62
@@ -3,22 +3,32 @@ module Artifacts
3 ( Artifacts(..)
3 ( Artifacts(..)
4 , loadCompile
4 , loadCompile
5 , loadRepl
5 , loadRepl
6+ , toEditorHints
6 )
7 )
7 where
8 where
8
9
9
10
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 ((</>))
16
21
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
23
33
24
34
@@ -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
92
102
103+
104+
105+-- TO EDITOR HINTS
106+
107+
108+toEditorHints :: Artifacts -> BS.ByteString
109+toEditorHints (Artifacts ifaces _) =
110+ LBS.toStrict $ B.toLazyByteString $ E.encodeUgly $ encode ifaces
111+
112+
113+
114+-- ENCODE
115+
116+
117+encode :: Map.Map ModuleName.Raw I.Interface -> E.Value
118+encode ifaces =
119+ E.dict Json.fromName encodeInterface ifaces
120+
121+
122+encodeInterface :: I.Interface -> E.Value
123+encodeInterface (I.Interface pkg values unions aliases binops) =
124+ E.object
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)
129+ ]
130+
131+
132+isPublicAlias :: I.Alias -> Bool
133+isPublicAlias alias =
134+ case alias of
135+ I.PublicAlias _ -> True
136+ I.PrivateAlias _ -> False
137+
138+
139+toPublicUnion :: I.Union -> Maybe [N.Name]
140+toPublicUnion union =
141+ case union of
142+ I.OpenUnion (Can.Union _ variants _ _) ->
143+ Just (map getVariantName variants)
144+
145+ I.ClosedUnion _ ->
146+ Just []
147+
148+ I.PrivateUnion _ ->
149+ Nothing
150+
151+
152+getVariantName :: Can.Ctor -> N.Name
153+getVariantName (Can.Ctor name _ _ _) =
154+ name
worker/src/Main.hs+3
@@ -24,11 +24,14 @@ main =
24 do rArtifacts <- Artifacts.loadRepl
24 do rArtifacts <- Artifacts.loadRepl
25 cArtifacts <- Artifacts.loadCompile
25 cArtifacts <- Artifacts.loadCompile
26 errorJS <- Compile.loadErrorJS
26 errorJS <- Compile.loadErrorJS
27+ let editorHints = Artifacts.toEditorHints cArtifacts
28+
27 httpServe config $ msum $
29 httpServe config $ msum $
28 [ ifTop $ status
30 [ ifTop $ status
29 , path "repl" $ Repl.endpoint rArtifacts
31 , path "repl" $ Repl.endpoint rArtifacts
30 , path "compile" $ Compile.endpoint cArtifacts
32 , path "compile" $ Compile.endpoint cArtifacts
31 , path "compile/errors.js" $ writeBS errorJS
33 , path "compile/errors.js" $ writeBS errorJS
34+ , path "compile/editor-hints.json" $ writeBS editorHints
32 , notFound
35 , notFound
33 ]
36 ]
34
37