@@ -1,7 +1,6 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Validate (declarations) where
2module Validate (declarations) where
4−import qualified Control.Arrow as Arrow
5import Control.Monad (foldM)
4import Control.Monad (foldM)
6import qualified Data.Map as Map
5import qualified Data.Map as Map
7import qualified Data.Set as Set
6import qualified Data.Set as Set
@@ -12,7 +11,6 @@ import AST.Expression.General as Expr
12import qualified AST.Expression.Source as Source
11import qualified AST.Expression.Source as Source
13import qualified AST.Expression.Valid as Valid
12import qualified AST.Expression.Valid as Valid
14import qualified AST.Declaration as D
13import qualified AST.Declaration as D
15−import qualified AST.Module as Module
16import qualified AST.Pattern as Pattern
14import qualified AST.Pattern as Pattern
17import qualified AST.Type as Type
15import qualified AST.Type as Type
18import Elm.Utils ((|>))
16import Elm.Utils ((|>))
@@ -60,148 +58,21 @@ collapseComments listWithComments =
63−-- PARTITION AND VALIDATE DEFINES
67− Map.Map D.EffectType [A.Located [D.CommentOr (A.Located Source.Effect)]]
70−partitionEffects :: [Commented D.SourceOrDefine] -> ([Commented D.Source'], Defines)
71−partitionEffects commentedDecls =
72− case commentedDecls of
76− A.A ann (D.Source decl) : rest ->
79− (partitionEffects rest)
81− A.A (region, _) (D.Define effectType commentOrEffects) : rest ->
83− (Map.insertWith (++) effectType [A.A region commentOrEffects])
84− (partitionEffects rest)
90− -> Result.Result wrn Error.Error Valid.Effects
91−validateDefines tag defines =
94− do disallowLeftoverDefines Error.BadDefineInNormalModule defines
97− Module.Effect region ->
99− (maybeCmds, smallerDefines) =
100− extractKey D.Cmd defines
102− (maybeSubs, leftovers) =
103− extractKey D.Sub smallerDefines
105− do disallowLeftoverDefines Error.BadDefineInEffectModule leftovers
106− case (maybeCmds, maybeSubs) of
107− (Nothing, Nothing) ->
108− Result.throw region Error.NoDefineInEffectModule
113− <$> validateDefineDefs D.Cmd maybeCmds validateEffects
114− <*> validateDefineDefs D.Sub maybeSubs validateEffects
116− Module.Foreign region ->
118− (maybeCmds, smallerDefines) =
119− extractKey D.ForeignCmd defines
121− (maybeSubs, leftovers) =
122− extractKey D.ForeignSub smallerDefines
124− do disallowLeftoverDefines Error.BadDefineInForeignModule leftovers
125− case (maybeCmds, maybeSubs) of
126− (Nothing, Nothing) ->
127− Result.throw region Error.NoDefineInForeignModule
130− Valid.ForeignEffects
131− <$> validateDefineDefs D.ForeignCmd maybeCmds (T.traverse validateForeignCmd)
132− <*> validateDefineDefs D.ForeignSub maybeSubs (T.traverse validateForeignSub)
135−extractKey :: (Ord k) => k -> Map.Map k v -> (Maybe v, Map.Map k v)
136−extractKey key dict =
137− ( Map.lookup key dict
138− , Map.delete key dict
144− -> Maybe [A.Located [D.CommentOr (A.Located Source.Effect)]]
145− -> ([Commented Source.Effect] -> Result.Result wrn Error.Error a)
146− -> Result.Result wrn Error.Error a
147−validateDefineDefs effectType maybeAllRawDefines validate =
148− case maybeAllRawDefines of
152− Just [A.A _ sourceDefs] ->
153− validate =<< collapseComments sourceDefs
155− Just allRawDefines ->
161− Error.DuplicateDefines effectType (length allRawDefines)
163− Result.throw region errorMsg
166−disallowLeftoverDefines
167− :: (D.EffectType -> Error.Error)
169− -> Result.Result wrn Error.Error ()
170−disallowLeftoverDefines errorTagger leftoverDefines =
171− case Map.toList leftoverDefines of
177− toErrors (key, allDefines) =
178− map (A.map (\_ -> errorTagger key)) allDefines
180− Result.throwMany (concatMap toErrors pairs)
184-- VALIDATE STRUCTURED SOURCE
61-- VALIDATE STRUCTURED SOURCE
190− -> Result.Result wrn Error.Error ([D.Valid], Valid.Effects)
64+declarations :: [D.Source] -> Result.Result wrn Error.Error [D.Valid]
191−declarations tag sourceDecls =
65+declarations sourceDecls =
192− do (decls, defines) <-
66+ do decls <-
193− partitionEffects <$> collapseComments sourceDecls
67+ collapseComments sourceDecls
195 validDecls <-
69 validDecls <-
196 validateDecls decls
70 validateDecls decls
199− validateDefines tag defines
201 F.traverse_ id
72 F.traverse_ id
202− (declDuplicates validDecls validEffects : map findBadTypeVars validDecls)
73+ (declDuplicates validDecls : map findBadTypeVars validDecls)
204− return (validDecls, validEffects)
75+ return validDecls
@@ -274,86 +145,6 @@ validateDeclsHelp maybeComment (A.A region def) decls =
281− :: [Commented Source.Effect]
282− -> Result.Result wrn Error.Error [A.Commented Valid.Def]
283−validateEffects effects =
288− A.A (region, maybeComment) effect : rest ->
289− validateEffectsHelp (region, fmap A.drop maybeComment) effect rest
293− :: (R.Region, Maybe String)
295− -> [Commented Source.Effect]
296− -> Result.Result wrn Error.Error [A.Commented Valid.Def]
297−validateEffectsHelp ann effect remainingEffects =
300− Result.throw (fst ann) (error "TODO")
302− Source.Def pat expr ->
304− <$> validateDef Valid.Definition ann pat expr Nothing
305− <*> validateEffects remainingEffects
307− Source.Type name tipe ->
308− case remainingEffects of
309− A.A (_, Just (A.A commentRegion _)) _ : _ ->
310− Result.throw commentRegion (Error.CommentAfterAnnotation name)
312− A.A _ (Source.Def pat expr) : rest
313− | Pattern.isVar name pat ->
315− <$> validateDef Valid.Definition ann pat expr (Just tipe)
316− <*> validateEffects rest
319− Result.throw (fst ann) (Error.TypeWithoutDefinition name)
323− :: Commented Source.Effect
324− -> Result.Result wrn Error.Error (A.Commented Valid.ForeignCmd)
325−validateForeignCmd (A.A (region, maybeComment) effect) =
328− Result.throw region (error "TODO")
331− Result.throw region (error "TODO")
333− Source.Type name tipe ->
335− A.A (region, fmap A.drop maybeComment) (Valid.Cmd name tipe)
339− :: Commented Source.Effect
340− -> Result.Result wrn Error.Error (A.Commented Valid.ForeignSub)
341−validateForeignSub (A.A (region, maybeComment) effect) =
343− Source.With name expr ->
344− do validExpr <- expression expr
346− A.A (region, fmap A.drop maybeComment) (Valid.SubWith name validExpr)
349− Result.throw region (error "TODO")
351− Source.Type name tipe ->
353− A.A (region, fmap A.drop maybeComment) (Valid.Sub name tipe)
357-- VALIDATE DEFINITIONS
148-- VALIDATE DEFINITIONS
@@ -556,17 +347,14 @@ defDuplicates patterns =
556 |> detectDuplicates Error.DuplicateDefinition
347 |> detectDuplicates Error.DuplicateDefinition
559−declDuplicates :: [D.Valid] -> Valid.Effects -> Result.Result wrn Error.Error ()
350+declDuplicates :: [D.Valid] -> Result.Result wrn Error.Error ()
560−declDuplicates decls effects =
351+declDuplicates decls =
562 (valueLists, typeLists) =
353 (valueLists, typeLists) =
563 unzip (map extractValues decls)
354 unzip (map extractValues decls)
566− extractEffectValues effects
568 (\_ _ -> ())
356 (\_ _ -> ())
569− <$> detectDuplicates Error.DuplicateValueDeclaration (effectValues ++ concat valueLists)
357+ <$> detectDuplicates Error.DuplicateValueDeclaration (concat valueLists)
570 <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
358 <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
@@ -599,36 +387,6 @@ extractValues (A.A (region, _) decl) =
602−extractEffectValues :: Valid.Effects -> [A.Located String]
603−extractEffectValues effects =
608− Valid.Effects cmds subs ->
610− extractNames (Valid.Definition pat _ _) =
611− Pattern.boundVars pat
613− concatMap (extractNames . A.drop) (cmds ++ subs)
615− Valid.ForeignEffects cmds subs ->
617− extractCmdNames (A.A (region, _) (Valid.Cmd name _)) =
620− extractSubNames (A.A (region, _) sub) =
626− Valid.SubWith name _ ->
629− map extractCmdNames cmds ++ map extractSubNames subs
633-- UNBOUND TYPE VARIABLES
391-- UNBOUND TYPE VARIABLES