on master help sign in
Confirm that all imports exist with /compile endpoint
e37ceaaEvan Czaplicki
worker/src/Main.hs+35−7
@@ -13,6 +13,8 @@ import qualified Data.ByteString.Builder as B
13import qualified Data.ByteString.Lazy as LBS
13import qualified Data.ByteString.Lazy as LBS
14import qualified Data.HashSet as HashSet
14import qualified Data.HashSet as HashSet
15import qualified Data.Map as Map
15import qualified Data.Map as Map
16+import qualified Data.Map.Utils as Map
17+import qualified Data.NonEmptyList as NE
16import qualified Data.OneOrMore as OneOrMore
18import qualified Data.OneOrMore as OneOrMore
17import Network.URI (parseURI)
19import Network.URI (parseURI)
18import Snap.Core
20import Snap.Core
@@ -38,7 +40,9 @@ import qualified Generate.Mode as Mode
38import qualified Json.Encode as Encode
40import qualified Json.Encode as Encode
39import qualified Parse.Module as Parse
41import qualified Parse.Module as Parse
40import qualified Reporting
42import qualified Reporting
43+import qualified Reporting.Annotation as A
41import qualified Reporting.Error as Error
44import qualified Reporting.Error as Error
45+import qualified Reporting.Error.Import as Import
42import qualified Reporting.Render.Code as Code
46import qualified Reporting.Render.Code as Code
43
47
44
48
@@ -116,20 +120,44 @@ handlePart info stream =
116
120
117
121
118compileByteString :: Map.Map ModuleName.Raw I.Interface -> B.ByteString -> Either Error.Error (ModuleName.Canonical, Opt.LocalGraph, Opt.Main)
122compileByteString :: Map.Map ModuleName.Raw I.Interface -> B.ByteString -> Either Error.Error (ModuleName.Canonical, Opt.LocalGraph, Opt.Main)
119−compileByteString ifaces source =
123+compileByteString interfaces source =
120 case Parse.fromByteString Pkg.dummyName source of
124 case Parse.fromByteString Pkg.dummyName source of
121 Left err ->
125 Left err ->
122 Left (Error.BadSyntax err)
126 Left (Error.BadSyntax err)
123
127
124− Right modul ->
128+ Right modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
125− case Compile.compile Pkg.dummyName ifaces modul of
129+ case checkImports interfaces imports of
126 Left err ->
130 Left err ->
127 Left err
131 Left err
128
132
133+ Right ifaces ->
134+ case Compile.compile Pkg.dummyName ifaces modul of
135+ Left err ->
136+ Left err
137+
129− Right artifacts@(Compile.Artifacts modul _ locals@(Opt.LocalGraph maybeMain _ _)) ->
138+ Right artifacts@(Compile.Artifacts modul _ locals@(Opt.LocalGraph maybeMain _ _)) ->
130− case maybeMain of
139+ case maybeMain of
131− Just main -> Right (Can._name modul, locals, main)
140+ Just main -> Right (Can._name modul, locals, main)
132− Nothing -> Left (error "TODO no main")
141+ Nothing -> Left (error "TODO no main")
142+
143+
144+checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either Error.Error (Map.Map ModuleName.Raw I.Interface)
145+checkImports interfaces imports =
146+ let
147+ importDict = Map.fromValues Src.getImportName imports
148+ missing = Map.difference importDict interfaces
149+ in
150+ case Map.elems missing of
151+ [] ->
152+ Right (Map.intersection interfaces importDict)
153+
154+ i:is ->
155+ let
156+ unimported = Map.keysSet (Map.difference interfaces importDict)
157+ toError (Src.Import (A.At region name) _ _) =
158+ Import.Error region name unimported Import.NotFound
159+ in
160+ Left (Error.BadImports (fmap toError (NE.List i is)))
133
161
134
162
135errorToHtmlBuilder :: B.ByteString -> Error.Error -> B.Builder
163errorToHtmlBuilder :: B.ByteString -> Error.Error -> B.Builder