on master help sign in
Confirm that all imports exist with /compile endpoint
commite37ceaaf9d69d5d11fa3580966d4a53fb9cb7fca authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 15 May 2019, 10:27 (7 years ago) parent4e2086c
1 file changed+35−7
worker/src/Main.hs+35−7
worker/src/Main.hs+35−7
@@ -13,6 +13,8 @@ import qualified Data.ByteString.Builder as B
1313import qualified Data.ByteString.Lazy as LBS
1414import qualified Data.HashSet as HashSet
1515import qualified Data.Map as Map
16+import qualified Data.Map.Utils as Map
17+import qualified Data.NonEmptyList as NE
1618import qualified Data.OneOrMore as OneOrMore
1719import Network.URI (parseURI)
1820import Snap.Core
@@ -38,7 +40,9 @@ import qualified Generate.Mode as Mode
3840import qualified Json.Encode as Encode
3941import qualified Parse.Module as Parse
4042import qualified Reporting
43+import qualified Reporting.Annotation as A
4144import qualified Reporting.Error as Error
45+import qualified Reporting.Error.Import as Import
4246import qualified Reporting.Render.Code as Code
4347
4448
@@ -116,20 +120,44 @@ handlePart info stream =
116120
117121
118122compileByteString :: 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 =
120124 case Parse.fromByteString Pkg.dummyName source of
121125 Left err ->
122126 Left (Error.BadSyntax err)
123127
124− Right modul ->
125− case Compile.compile Pkg.dummyName ifaces modul of
128+ Right modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
129+ case checkImports interfaces imports of
126130 Left err ->
127131 Left err
128132
129− Right artifacts@(Compile.Artifacts modul _ locals@(Opt.LocalGraph maybeMain _ _)) ->
130− case maybeMain of
131− Just main -> Right (Can._name modul, locals, main)
132− Nothing -> Left (error "TODO no main")
133+ Right ifaces ->
134+ case Compile.compile Pkg.dummyName ifaces modul of
135+ Left err ->
136+ Left err
137+
138+ Right artifacts@(Compile.Artifacts modul _ locals@(Opt.LocalGraph maybeMain _ _)) ->
139+ case maybeMain of
140+ Just main -> Right (Can._name modul, locals, 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)))
133161
134162
135163errorToHtmlBuilder :: B.ByteString -> Error.Error -> B.Builder