@@ -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
@@ -116,20 +120,44 @@ handlePart info stream =
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)
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 ->
134+ case Compile.compile Pkg.dummyName ifaces modul of
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")
144+checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either Error.Error (Map.Map ModuleName.Raw I.Interface)
145+checkImports interfaces imports =
147+ importDict = Map.fromValues Src.getImportName imports
148+ missing = Map.difference importDict interfaces
150+ case Map.elems missing of
152+ Right (Map.intersection interfaces importDict)
156+ unimported = Map.keysSet (Map.difference interfaces importDict)
157+ toError (Src.Import (A.At region name) _ _) =
158+ Import.Error region name unimported Import.NotFound
160+ Left (Error.BadImports (fmap toError (NE.List i is)))
135errorToHtmlBuilder :: B.ByteString -> Error.Error -> B.Builder
163errorToHtmlBuilder :: B.ByteString -> Error.Error -> B.Builder