@@ -1,14 +1,16 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Validate (module') where
2module Validate (module') where
4+import Prelude hiding (init)
4import Control.Monad (foldM, when)
5import Control.Monad (foldM, when)
5import qualified Data.Map as Map
6import qualified Data.Map as Map
7+import qualified Data.Maybe as Maybe
6import qualified Data.Set as Set
8import qualified Data.Set as Set
7import qualified Data.Foldable as F
9import qualified Data.Foldable as F
8import qualified Data.Traversable as T
10import qualified Data.Traversable as T
10import AST.Expression.General as Expr
12import AST.Expression.General as Expr
11−import qualified AST.Effects as Fx
13+import qualified AST.Effects as Effects
12import qualified AST.Expression.Source as Source
14import qualified AST.Expression.Source as Source
13import qualified AST.Expression.Valid as Valid
15import qualified AST.Expression.Valid as Valid
14import qualified AST.Declaration as D
16import qualified AST.Declaration as D
@@ -38,11 +40,12 @@ module' (Module.Module name path info) =
38 (Module.Source tag settings docs exports imports decls) =
40 (Module.Source tag settings docs exports imports decls) =
41− do validDecls <- declarations decls
43+ do (ValidStuff foreigns structure) <- validateDecls decls
42− validEffects <- validateEffects tag settings validDecls
45+ validEffects <- validateEffects tag settings foreigns (D._defs structure)
44 return $ Module.Module name path $
47 return $ Module.Module name path $
45− Module.Valid docs exports (addDefaults pkgName imports) validDecls validEffects
48+ Module.Valid docs exports (addDefaults pkgName imports) structure validEffects
@@ -69,17 +72,19 @@ addDefaults pkgName imports =
69validateEffects
72validateEffects
70 :: Module.SourceTag
73 :: Module.SourceTag
71 -> Module.SourceSettings
74 -> Module.SourceSettings
75+ -> [A.Commented Effects.ForeignRaw]
72− -> [D.Valid]
76+ -> [A.Commented Valid.Def]
73− -> Result.Result wrn Error.Error Fx.Effects
77+ -> Result.Result wrn Error.Error Effects.Raw
74−validateEffects tag settings@(A.A _ pairs) decls =
78+validateEffects tag settings@(A.A _ pairs) foreigns validDefs =
75 case tag of
79 case tag of
76 Module.Normal ->
80 Module.Normal ->
77 do noSettings Error.SettingsOnNormalModule settings
81 do noSettings Error.SettingsOnNormalModule settings
78− return Fx.None
83+ return Effects.None
80 Module.Foreign _ ->
85 Module.Foreign _ ->
81 do noSettings Error.SettingsOnForeignModule settings
86 do noSettings Error.SettingsOnForeignModule settings
82− return Fx.Foreign
87+ return (Effects.Foreign foreigns)
84 Module.Effect tagRegion ->
89 Module.Effect tagRegion ->
@@ -89,9 +94,10 @@ validateEffects tag settings@(A.A _ pairs) decls =
89 settingsDict =
94 settingsDict =
90 foldr collectSettings Map.empty pairs
95 foldr collectSettings Map.empty pairs
97+ do noForeigns foreigns
92− do managerType <- toManagerType tagRegion settingsDict
98+ managerType <- toManagerType tagRegion settingsDict
93− (r0, r1, r2) <- checkManagerImpl tagRegion managerType noInfo decls
99+ (r0, r1, r2) <- checkManager tagRegion managerType validDefs
94− return (Fx.Effect (Fx.Info tagRegion r0 r1 r2 managerType))
100+ return (Effects.Manager (Effects.Info tagRegion r0 r1 r2 managerType))
97noSettings
103noSettings
@@ -107,10 +113,24 @@ noSettings errorMsg (A.A region settings) =
107 Result.throw region errorMsg
113 Result.throw region errorMsg
116+noForeigns :: [A.Commented Effects.ForeignRaw] -> Result.Result wrn Error.Error ()
117+noForeigns foreigns =
124+ toError (A.A (region, _) (Effects.ForeignRaw name _)) =
125+ A.A region (Error.UnexpectedForeign name)
127+ Result.throwMany (map toError foreigns)
110toManagerType
130toManagerType
111 :: R.Region
131 :: R.Region
112 -> Map.Map String [(R.Region, A.Located String)]
132 -> Map.Map String [(R.Region, A.Located String)]
113− -> Result.Result wrn Error.Error Fx.ManagerType
133+ -> Result.Result wrn Error.Error Effects.ManagerType
114toManagerType tagRegion settingsDict =
134toManagerType tagRegion settingsDict =
116 toErrors name entries =
136 toErrors name entries =
@@ -129,18 +149,19 @@ toManagerType tagRegion settingsDict =
129 (,) <$> extractOne "command" settingsDict
149 (,) <$> extractOne "command" settingsDict
130 <*> extractOne "subscription" settingsDict
150 <*> extractOne "subscription" settingsDict
152+ -- TODO check that cmd and sub types exist?
132 case maybeEffects of
153 case maybeEffects of
133 (Nothing, Nothing) ->
154 (Nothing, Nothing) ->
134 Result.throw tagRegion Error.NoSettingsOnEffectModule
155 Result.throw tagRegion Error.NoSettingsOnEffectModule
136 (Just cmd, Nothing) ->
157 (Just cmd, Nothing) ->
137− return (Fx.CmdManager cmd)
158+ return (Effects.CmdManager cmd)
139 (Nothing, Just sub) ->
160 (Nothing, Just sub) ->
140− return (Fx.SubManager sub)
161+ return (Effects.SubManager sub)
142 (Just cmd, Just sub) ->
163 (Just cmd, Just sub) ->
143− return (Fx.FxManager cmd sub)
164+ return (Effects.FxManager cmd sub)
146extractOne
167extractOne
@@ -163,95 +184,65 @@ extractOne name settingsDict =
166−-- EFFECT REGIONS
187+-- CHECK EFFECT MANAGER
173− , _init :: Maybe R.Region
174− , _onEffects :: Maybe R.Region
175− , _onSelfMsg :: Maybe R.Region
179−noInfo :: ManagerInfo
181− ManagerInfo False False Nothing Nothing Nothing
185 :: R.Region
191 :: R.Region
186− -> Fx.ManagerType
192+ -> Effects.ManagerType
188− -> [D.Valid]
193+ -> [A.Commented Valid.Def]
189 -> Result.Result w Error.Error (R.Region, R.Region, R.Region)
194 -> Result.Result w Error.Error (R.Region, R.Region, R.Region)
190−checkManagerImpl tagRegion managerType info decls =
195+checkManager tagRegion managerType validDefs =
194− (ManagerInfo cmdMap subMap init onEffects onSelfMsg) = info
197+ regionDict =
198+ Map.fromList (Maybe.mapMaybe getSimpleDefRegion validDefs)
196− const (,,)
200+ const (,,)
197− <$> requireMaps tagRegion managerType cmdMap subMap
201+ <$> requireMaps tagRegion regionDict managerType
198− <*> requireRegion tagRegion "init" init
202+ <*> requireRegion tagRegion regionDict "init"
199− <*> requireRegion tagRegion "onEffects" onEffects
203+ <*> requireRegion tagRegion regionDict "onEffects"
200− <*> requireRegion tagRegion "onSelfMsg" onSelfMsg
204+ <*> requireRegion tagRegion regionDict "onSelfMsg"
203− case getDefInfo decl of
204− Just ("init", region) ->
205− checkManagerImpl tagRegion managerType (info { _init = Just region }) rest
207− Just ("onEffects", region) ->
208− checkManagerImpl tagRegion managerType (info { _onEffects = Just region }) rest
210− Just ("onSelfMsg", region) ->
211− checkManagerImpl tagRegion managerType (info { _onSelfMsg = Just region }) rest
213− Just ("cmdMap", _) ->
214− checkManagerImpl tagRegion managerType (info { _cmdMap = True }) rest
216− Just ("subMap", _) ->
217− checkManagerImpl tagRegion managerType (info { _subMap = True }) rest
220− checkManagerImpl tagRegion managerType info rest
223−getDefInfo :: D.Valid -> Maybe (String, R.Region)
207+getSimpleDefRegion :: A.Commented Valid.Def -> Maybe (String, R.Region)
224−getDefInfo decl =
208+getSimpleDefRegion decl =
225 case decl of
209 case decl of
226− A.A region (D.Def (Valid.Definition (A.A _ (Pattern.Var name)) _ _)) ->
210+ A.A (region, _) (Valid.Def (A.A _ (Pattern.Var name)) _ _) ->
227− Just (name, fst region)
211+ Just (name, region)
219+ -> Map.Map String R.Region
220+ -> Effects.ManagerType
233−requireMaps :: R.Region -> Fx.ManagerType -> Bool -> Bool -> Result.Result w Error.Error ()
221+ -> Result.Result w Error.Error ()
234−requireMaps tagRegion managerType hasCmdMap hasSubMap =
222+requireMaps tagRegion regionDict managerType =
236− check hasIt name =
224+ check name =
225+ when (Map.notMember name regionDict) $
237− when (not hasIt) (Result.throw tagRegion (Error.MissingManagerOnEffectModule name))
226+ Result.throw tagRegion (Error.MissingManagerOnEffectModule name)
239 case managerType of
228 case managerType of
240− Fx.CmdManager _ ->
229+ Effects.CmdManager _ ->
241− check hasCmdMap "cmdMap"
230+ check "cmdMap"
243− Fx.SubManager _ ->
232+ Effects.SubManager _ ->
244− check hasSubMap "subMap"
233+ check "subMap"
246− Fx.FxManager _ _ ->
235+ Effects.FxManager _ _ ->
248− <$> check hasCmdMap "cmdMap"
236+ check "cmdMap" <* check "subMap"
249− <*> check hasSubMap "subMap"
241+ -> Map.Map String R.Region
252−requireRegion :: R.Region -> String -> Maybe R.Region -> Result.Result w Error.Error R.Region
243+ -> Result.Result w Error.Error R.Region
253−requireRegion tagRegion name maybeRegion =
244+requireRegion tagRegion regionDict name =
254− case maybeRegion of
245+ case Map.lookup name regionDict of
255 Just region ->
246 Just region ->
256 return region
247 return region
@@ -263,30 +254,23 @@ requireRegion tagRegion name maybeRegion =
263-- COLLAPSE COMMENTS
254-- COLLAPSE COMMENTS
267− A.Annotated (R.Region, Maybe (A.Located String)) a
271− :: [D.CommentOr (A.Located a)]
272− -> Result.Result wrn Error.Error [Commented a]
257+collapseComments :: [D.CommentOr (A.Located a)] -> Result.Result wrn Error.Error [A.Commented a]
273collapseComments listWithComments =
258collapseComments listWithComments =
274 case listWithComments of
259 case listWithComments of
276 Result.ok []
261 Result.ok []
278− D.Comment msg : D.Whatever (A.A region a) : rest ->
263+ D.Comment (A.A _ msg) : D.Whatever (A.A region a) : rest ->
281 A.A (region, Just msg) a
266 A.A (region, Just msg) a
283 fmap (entry:) (collapseComments rest)
268 fmap (entry:) (collapseComments rest)
285− D.Comment (A.A region _) : D.Comment _ : _ ->
270+ D.Comment (A.A region _) : rest ->
271+ collapseComments rest
286− Result.throw region Error.CommentOnComment
272+ <* Result.throw region Error.CommentOnNothing
288− [D.Comment (A.A region _)] ->
289− Result.throw region Error.CommentOnNothing
291 D.Whatever (A.A region a) : rest ->
275 D.Whatever (A.A region a) : rest ->
@@ -300,87 +284,92 @@ collapseComments listWithComments =
300-- VALIDATE STRUCTURED SOURCE
284-- VALIDATE STRUCTURED SOURCE
303−declarations :: [D.Source] -> Result.Result wrn Error.Error [D.Valid]
287+validateDecls :: [D.Source] -> Result.Result wrn Error.Error ValidStuff
304−declarations sourceDecls =
288+validateDecls sourceDecls =
306− collapseComments sourceDecls
289+ do rawDecls <- collapseComments sourceDecls
308− validDecls <-
291+ validStuff <- validateRawDecls rawDecls
311− F.traverse_ id
293+ let (D.Decls _ unions aliases _) = _structure validStuff
312− (declDuplicates validDecls : map findBadTypeVars validDecls)
314− return validDecls
295+ return validStuff
296+ <* F.traverse_ checkTypeVarsInUnion unions
297+ <* F.traverse_ checkTypeVarsInAlias aliases
298+ <* checkDuplicates validStuff
318-- VALIDATE DECLARATIONS
302-- VALIDATE DECLARATIONS
321−validateDecls
305+data ValidStuff =
322− :: [Commented D.Source']
306+ ValidStuff
307+ { _foreigns :: [A.Commented Effects.ForeignRaw]
308+ , _structure :: D.Valid
323− -> Result.Result wrn Error.Error [D.Valid]
312+validateRawDecls :: [A.Commented D.Raw] -> Result.Result wrn Error.Error ValidStuff
313+validateRawDecls commentedDecls =
314+ vrdHelp commentedDecls [] (D.Decls [] [] [] [])
318+ :: [A.Commented D.Raw]
319+ -> [A.Commented Effects.ForeignRaw]
321+ -> Result.Result wrn Error.Error ValidStuff
324−validateDecls commentedDecls =
322+vrdHelp commentedDecls foreigns structure =
325 case commentedDecls of
323 case commentedDecls of
327− Result.ok []
325+ Result.ok (ValidStuff foreigns structure)
329− A.A (region, maybeComment) decl : rest ->
327+ A.A ann decl : rest ->
334− A.A (region, fmap A.drop maybeComment) validDecl
336− fmap (entry:) (validateDecls rest)
338− case decl of
328+ case decl of
339− D.Union name tvars ctors ->
329+ D.Union (D.Type name tvars ctors) ->
340− addRest (D.Union name tvars ctors)
330+ vrdHelp rest foreigns (D.addUnion (A.A ann (D.Type name tvars ctors)) structure)
342− D.Alias name tvars alias ->
332+ D.Alias (D.Type name tvars alias) ->
343− addRest (D.Alias name tvars alias)
333+ vrdHelp rest foreigns (D.addAlias (A.A ann (D.Type name tvars alias)) structure)
345− D.Fixity assoc prec op ->
335+ D.Fixity fixity ->
346− addRest (D.Fixity assoc prec op)
336+ vrdHelp rest foreigns (D.addInfix fixity structure)
348− D.Def def ->
338+ D.Def (A.A region def) ->
349− validateDeclsHelp maybeComment def rest
339+ vrdDefHelp rest (A.A (region, snd ann) def) foreigns structure
341+ D.Foreign name tipe ->
342+ vrdHelp rest (A.A ann (Effects.ForeignRaw name tipe) : foreigns) structure
353− :: Maybe (A.Located String)
355− -> [Commented D.Source']
356− -> Result.Result wrn Error.Error [D.Valid]
357−validateDeclsHelp maybeComment (A.A region def) decls =
360− (region, fmap A.drop maybeComment)
362− makeDef pat expr maybeType =
345+vrdDefHelp
363− D.Def (Valid.Definition pat expr maybeType)
346+ :: [A.Commented D.Raw]
347+ -> A.Commented Source.Def'
348+ -> [A.Commented Effects.ForeignRaw]
350+ -> Result.Result wrn Error.Error ValidStuff
351+vrdDefHelp remainingDecls (A.A ann def) foreigns structure =
353+ addDef validDef (ValidStuff finalForeigns struct) =
354+ ValidStuff finalForeigns (D.addDef (A.A ann validDef) struct)
365 case def of
356 case def of
366 Source.Definition pat expr ->
357 Source.Definition pat expr ->
368− <$> validateDef makeDef ann pat expr Nothing
359+ <$> validateDef pat expr Nothing
369− <*> validateDecls decls
360+ <*> vrdHelp remainingDecls foreigns structure
371 Source.Annotation name tipe ->
362 Source.Annotation name tipe ->
372− case decls of
363+ case remainingDecls of
373− A.A (_, Just (A.A commentRegion _)) _ : _ ->
374− Result.throw commentRegion (Error.CommentAfterAnnotation name)
376 A.A _ (D.Def (A.A _ (Source.Definition pat expr))) : rest
364 A.A _ (D.Def (A.A _ (Source.Definition pat expr))) : rest
377 | Pattern.isVar name pat ->
365 | Pattern.isVar name pat ->
379− <$> validateDef makeDef ann pat expr (Just tipe)
367+ <$> validateDef pat expr (Just tipe)
380− <*> validateDecls rest
368+ <*> vrdHelp rest foreigns structure
371+ vrdHelp remainingDecls foreigns structure
383− Result.throw region (Error.TypeWithoutDefinition name)
372+ <* Result.throw (fst ann) (Error.TypeWithoutDefinition name)
@@ -390,8 +379,12 @@ validateDeclsHelp maybeComment (A.A region def) decls =
390definitions :: [Source.Def] -> Result.Result wrn Error.Error [Valid.Def]
379definitions :: [Source.Def] -> Result.Result wrn Error.Error [Valid.Def]
391definitions sourceDefs =
380definitions sourceDefs =
392 do validDefs <- definitionsHelp sourceDefs
381 do validDefs <- definitionsHelp sourceDefs
393− let patterns = map (\(Valid.Definition p _ _) -> p) validDefs
382+
394− defDuplicates patterns
383+ validDefs
384+ |> map Valid.getPattern
385+ |> concatMap Pattern.boundVars
386+ |> detectDuplicates Error.DuplicateDefinition
395 return validDefs
388 return validDefs
@@ -401,34 +394,32 @@ definitionsHelp sourceDefs =
402 return []
395 return []
404− A.A region (Source.Definition pat expr) : rest ->
397+ A.A _ (Source.Definition pat expr) : rest ->
406− <$> fmap A.drop (validateDef Valid.Definition region pat expr Nothing)
399+ <$> validateDef pat expr Nothing
407 <*> definitionsHelp rest
400 <*> definitionsHelp rest
409− A.A r1 (Source.Annotation name tipe) : rest ->
402+ A.A region (Source.Annotation name tipe) : rest ->
410 case rest of
403 case rest of
411− A.A r2 (Source.Definition pat expr) : rest'
404+ A.A _ (Source.Definition pat expr) : rest'
412 | Pattern.isVar name pat ->
405 | Pattern.isVar name pat ->
414− <$> fmap A.drop (validateDef Valid.Definition (R.merge r1 r2) pat expr (Just tipe))
407+ <$> validateDef pat expr (Just tipe)
415 <*> definitionsHelp rest'
408 <*> definitionsHelp rest'
418− Result.throw r1 (Error.TypeWithoutDefinition name)
411+ Result.throw region (Error.TypeWithoutDefinition name)
421validateDef
414validateDef
422− :: (Pattern.Raw -> Valid.Expr -> Maybe Type.Raw -> def)
424− -> Pattern.Raw
415+ :: Pattern.Raw
425 -> Source.Expr
416 -> Source.Expr
426 -> Maybe Type.Raw
417 -> Maybe Type.Raw
427− -> Result.Result wrn Error.Error (A.Annotated annotation def)
418+ -> Result.Result wrn Error.Error Valid.Def
428−validateDef makeDef annotation pat expr maybeType =
419+validateDef pat expr maybeType =
429 do validExpr <- expression expr
420 do validExpr <- expression expr
430 validateDefPattern pat validExpr
421 validateDefPattern pat validExpr
431− return $ A.A annotation (makeDef pat validExpr maybeType)
422+ return $ Valid.Def pat validExpr maybeType
434validateDefPattern :: Pattern.Raw -> Valid.Expr -> Result.Result wrn Error.Error ()
425validateDefPattern :: Pattern.Raw -> Valid.Expr -> Result.Result wrn Error.Error ()
@@ -528,11 +519,17 @@ expression (A.A ann sourceExpression) =
528 <$> definitions defs
519 <$> definitions defs
529 <*> expression body
520 <*> expression body
531− Cmd moduleName typeName ->
522+ Cmd moduleName ->
532− return (Cmd moduleName typeName)
523+ return (Cmd moduleName)
534− Sub moduleName typeName ->
525+ Sub moduleName ->
535− return (Sub moduleName typeName)
526+ return (Sub moduleName)
528+ ForeignCmd name tipe ->
529+ return (ForeignCmd name tipe)
531+ ForeignSub name tipe ->
532+ return (ForeignSub name tipe)
537 SaveEnv moduleName effects ->
534 SaveEnv moduleName effects ->
538 return (SaveEnv moduleName effects)
535 return (SaveEnv moduleName effects)
@@ -567,112 +564,105 @@ validatePattern pattern =
567-- DETECT DUPLICATES
564-- DETECT DUPLICATES
571− :: (String -> Error.Error)
572− -> [A.Located String]
573− -> Result.Result wrn Error.Error ()
567+checkDuplicates :: ValidStuff -> Result.Result wrn Error.Error ()
574−detectDuplicates tag names =
568+checkDuplicates (ValidStuff foreigns (D.Decls defs unions aliases _)) =
575− let add (A.A region name) dict =
569+ let
576− Map.insertWith (++) name [region] dict
570+ -- SIMPLE NAMES
578− makeGroups pairs =
572+ defValues =
579− Map.toList (foldr add Map.empty pairs)
573+ concatMap (Pattern.boundVars . Valid.getPattern . A.drop) defs
581− check (name, regions) =
575+ foreignValues =
582− case regions of
576+ map fromForeign foreigns
584− Result.throw region (tag name)
586− _ ->
578+ fromForeign (A.A (region, _) (Effects.ForeignRaw name _)) =
587− return ()
579+ A.A region name
589− F.traverse_ check (makeGroups names)
592−defDuplicates :: [Pattern.Raw] -> Result.Result wrn Error.Error ()
583+ (types, typeValues) =
593−defDuplicates patterns =
584+ unzip (map fromUnion unions ++ map fromAlias aliases)
594− concatMap Pattern.boundVars patterns
595− |> detectDuplicates Error.DuplicateDefinition
586+ fromUnion (A.A (region, _) (D.Type name _ ctors)) =
588+ , map (A.A region . fst) ctors
598−declDuplicates :: [D.Valid] -> Result.Result wrn Error.Error ()
591+ fromAlias (A.A (region, _) (D.Type name _ (A.A _ tipe))) =
599−declDuplicates decls =
592+ (,) (A.A region name) $
600− let
593+ case tipe of
601− (valueLists, typeLists) =
594+ Type.RRecord _ _ ->
602− unzip (map extractValues decls)
595+ [A.A region name]
605− <$> detectDuplicates Error.DuplicateValueDeclaration (concat valueLists)
606− <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
601+ [ detectDuplicates Error.DuplicateValueDeclaration (foreignValues ++ defValues)
602+ , detectDuplicates Error.DuplicateValueDeclaration (concat typeValues)
603+ , detectDuplicates Error.DuplicateTypeDeclaration types
609−extractValues :: D.Valid -> ([A.Located String], [A.Located String])
610−extractValues (A.A (region, _) decl) =
612− D.Def (Valid.Definition pattern _ _) ->
613− ( Pattern.boundVars pattern
617− D.Union name _ ctors ->
607+detectDuplicates
618− ( map (A.A region . fst) ctors
608+ :: (String -> Error.Error)
609+ -> [A.Located String]
610+ -> Result.Result wrn Error.Error ()
611+detectDuplicates tag names =
619− , [A.A region name]
613+ add (A.A region name) dict =
620− )
614+ Map.insertWith (++) name [region] dict
622− D.Alias name _ (A.A _ (Type.RRecord _ _)) ->
616+ makeGroups pairs =
623− ( [A.A region name]
617+ Map.toList (foldr add Map.empty pairs)
627− D.Alias name _ _ ->
619+ check (name, regions) =
628− ( []
620+ case regions of
629− , [A.A region name]
622+ Result.throw region (tag name)
632− D.Fixity _ _ _ ->
624+ _ ->
635− )
627+ F.traverse_ check (makeGroups names)
639-- UNBOUND TYPE VARIABLES
631-- UNBOUND TYPE VARIABLES
635+ :: A.Commented (D.Union Type.Raw)
642−findBadTypeVars :: D.Valid -> Result.Result wrn Error.Error ()
636+ -> Result.Result wrn Error.Error ()
643−findBadTypeVars (A.A (region,_) decl) =
637+checkTypeVarsInUnion (A.A (region,_) (D.Type name boundVars ctors)) =
644− case decl of
638+ case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
645− D.Def _ ->
639+ (_, []) ->
646 return ()
640 return ()
648− D.Union name boundVars ctors ->
642+ (_, unbound) ->
649− case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
643+ Result.throw region
650− (_, []) ->
644+ (Error.UnboundTypeVarsInUnion name boundVars unbound)
655− (Error.UnboundTypeVarsInUnion name boundVars unbound)
657− D.Alias name boundVars tipe ->
658− case diff boundVars (freeVars tipe) of
662− ([], unbound) ->
647+checkTypeVarsInAlias
663− Result.throw region
648+ :: A.Commented (D.Alias Type.Raw)
664− (Error.UnboundTypeVarsInAlias name boundVars unbound)
649+ -> Result.Result wrn Error.Error ()
650+checkTypeVarsInAlias (A.A (region,_) (D.Type name boundVars tipe)) =
651+ case diff boundVars (freeVars tipe) of
666− (unused, []) ->
655+ ([], unbound) ->
667− Result.throw region
656+ Result.throw region
668− (Error.UnusedTypeVarsInAlias name boundVars unused)
657+ (Error.UnboundTypeVarsInAlias name boundVars unbound)
670− (unused, unbound) ->
659+ (unused, []) ->
671− Result.throw region
660+ Result.throw region
672− (Error.MessyTypeVarsInAlias name boundVars unused unbound)
661+ (Error.UnusedTypeVarsInAlias name boundVars unused)
674− D.Fixity _ _ _ ->
663+ (unused, unbound) ->
675− return ()
664+ Result.throw region
665+ (Error.MessyTypeVarsInAlias name boundVars unused unbound)
678diff :: [String] -> [A.Located String] -> ([String], [String])
668diff :: [String] -> [A.Located String] -> ([String], [String])
@@ -689,7 +679,6 @@ diff left right =
693freeVars :: Type.Raw -> [A.Located String]
682freeVars :: Type.Raw -> [A.Located String]
694freeVars (A.A region tipe) =
683freeVars (A.A region tipe) =
695 case tipe of
684 case tipe of