@@ -29,14 +29,37 @@ import qualified Reporting.Error.Syntax as E
29-- FROM BYTE STRING
29-- FROM BYTE STRING
32−fromByteString :: Pkg.Name -> BS.ByteString -> Either E.Error Src.Module
32+fromByteString :: ProjectType -> BS.ByteString -> Either E.Error Src.Module
33−fromByteString pkg source =
33+fromByteString projectType source =
34− case P.fromByteString (chompModule pkg) E.ModuleBadEnd source of
34+ case P.fromByteString (chompModule projectType) E.ModuleBadEnd source of
35− Right modul -> checkModule modul
35+ Right modul -> checkModule projectType modul
36 Left err -> Left (E.ParseError err)
36 Left err -> Left (E.ParseError err)
48+isCore :: ProjectType -> Bool
51+ Package pkg -> pkg == Pkg.core
55+isKernel :: ProjectType -> Bool
56+isKernel projectType =
58+ Package pkg -> Pkg.isKernel pkg
@@ -49,11 +72,11 @@ data Module =
52−chompModule :: Pkg.Name -> Parser E.Module Module
75+chompModule :: ProjectType -> Parser E.Module Module
53−chompModule pkg =
76+chompModule projectType =
54 do header <- chompHeader
77 do header <- chompHeader
55− imports <- chompImports (if pkg == Pkg.core then [] else Imports.defaults)
78+ imports <- chompImports (if isCore projectType then [] else Imports.defaults)
56− infixes <- if Pkg.isKernel pkg then chompInfixes [] else return []
79+ infixes <- if isKernel projectType then chompInfixes [] else return []
57 decls <- specialize E.Declarations $ chompDecls []
80 decls <- specialize E.Declarations $ chompDecls []
58 return (Module header imports infixes decls)
81 return (Module header imports infixes decls)
@@ -62,15 +85,15 @@ chompModule pkg =
62-- CHECK MODULE
85-- CHECK MODULE
65−checkModule :: Module -> Either E.Error Src.Module
88+checkModule :: ProjectType -> Module -> Either E.Error Src.Module
66−checkModule (Module maybeHeader imports infixes decls) =
89+checkModule projectType (Module maybeHeader imports infixes decls) =
68 (values, unions, aliases, ports) = categorizeDecls [] [] [] [] decls
91 (values, unions, aliases, ports) = categorizeDecls [] [] [] [] decls
70 case maybeHeader of
93 case maybeHeader of
71 Just (Header name effects exports docs) ->
94 Just (Header name effects exports docs) ->
72 Src.Module (Just name) exports (toDocs docs decls) imports values unions aliases infixes
95 Src.Module (Just name) exports (toDocs docs decls) imports values unions aliases infixes
73− <$> checkEffects ports effects
96+ <$> checkEffects projectType ports effects
75 Nothing ->
98 Nothing ->
@@ -80,23 +103,37 @@ checkModule (Module maybeHeader imports infixes decls) =
80 _:_ -> Src.Ports ports
103 _:_ -> Src.Ports ports
83−checkEffects :: [Src.Port] -> Effects -> Either E.Error Src.Effects
106+checkEffects :: ProjectType -> [Src.Port] -> Effects -> Either E.Error Src.Effects
84−checkEffects ports effects =
107+checkEffects projectType ports effects =
85 case effects of
108 case effects of
86 NoEffects region ->
109 NoEffects region ->
87 case ports of
110 case ports of
88− [] -> Right Src.NoEffects
112+ Right Src.NoEffects
114+ Src.Port name _ : _ ->
116+ Package _ -> Left (E.NoPortsInPackage name)
89− _:_ -> Left (E.UnexpectedPort region)
117+ Application -> Left (E.UnexpectedPort region)
91 Ports region ->
119 Ports region ->
92− case ports of
120+ case projectType of
122+ Left (E.NoPortModulesInPackage region)
93− [] -> Left (E.NoPorts region)
126+ [] -> Left (E.NoPorts region)
94− _:_ -> Right (Src.Ports ports)
127+ _:_ -> Right (Src.Ports ports)
96 Manager region manager ->
129 Manager region manager ->
130+ if isKernel projectType then
97− case ports of
131+ case ports of
98− [] -> Right (Src.Manager region manager)
132+ [] -> Right (Src.Manager region manager)
99− _:_ -> Left (E.UnexpectedPort region)
133+ _:_ -> Left (E.UnexpectedPort region)
135+ Left (E.NoEffectsOutsideKernel region)
102categorizeDecls :: [A.Located Src.Value] -> [A.Located Src.Union] -> [A.Located Src.Alias] -> [Src.Port] -> [Decl.Decl] -> ( [A.Located Src.Value], [A.Located Src.Union], [A.Located Src.Alias], [Src.Port] )
139categorizeDecls :: [A.Located Src.Value] -> [A.Located Src.Union] -> [A.Located Src.Alias] -> [Src.Port] -> [Decl.Decl] -> ( [A.Located Src.Value], [A.Located Src.Union], [A.Located Src.Alias], [Src.Port] )