@@ -1,14 +1,16 @@
11{-# OPTIONS_GHC -Wall #-}
22module Validate (module') where
33
4+import Prelude hiding (init)
45import Control.Monad (foldM, when)
56import qualified Data.Map as Map
7+import qualified Data.Maybe as Maybe
68import qualified Data.Set as Set
79import qualified Data.Foldable as F
810import qualified Data.Traversable as T
911
1012import AST.Expression.General as Expr
11−import qualified AST.Effects as Fx
13+import qualified AST.Effects as Effects
1214import qualified AST.Expression.Source as Source
1315import qualified AST.Expression.Valid as Valid
1416import qualified AST.Declaration as D
@@ -38,11 +40,12 @@ module' (Module.Module name path info) =
3840 (Module.Source tag settings docs exports imports decls) =
3941 info
4042 in
41− do validDecls <- declarations decls
42− validEffects <- validateEffects tag settings validDecls
43+ do (ValidStuff foreigns structure) <- validateDecls decls
44+
45+ validEffects <- validateEffects tag settings foreigns (D._defs structure)
4346
4447 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
4649
4750
4851
@@ -69,17 +72,19 @@ addDefaults pkgName imports =
6972validateEffects
7073 :: Module.SourceTag
7174 -> Module.SourceSettings
72− -> [D.Valid]
73− -> Result.Result wrn Error.Error Fx.Effects
74−validateEffects tag settings@(A.A _ pairs) decls =
75+ -> [A.Commented Effects.ForeignRaw]
76+ -> [A.Commented Valid.Def]
77+ -> Result.Result wrn Error.Error Effects.Raw
78+validateEffects tag settings@(A.A _ pairs) foreigns validDefs =
7579 case tag of
7680 Module.Normal ->
7781 do noSettings Error.SettingsOnNormalModule settings
78− return Fx.None
82+ noForeigns foreigns
83+ return Effects.None
7984
8085 Module.Foreign _ ->
8186 do noSettings Error.SettingsOnForeignModule settings
82− return Fx.Foreign
87+ return (Effects.Foreign foreigns)
8388
8489 Module.Effect tagRegion ->
8590 let
@@ -89,9 +94,10 @@ validateEffects tag settings@(A.A _ pairs) decls =
8994 settingsDict =
9095 foldr collectSettings Map.empty pairs
9196 in
92− do managerType <- toManagerType tagRegion settingsDict
93− (r0, r1, r2) <- checkManagerImpl tagRegion managerType noInfo decls
94− return (Fx.Effect (Fx.Info tagRegion r0 r1 r2 managerType))
97+ do noForeigns foreigns
98+ managerType <- toManagerType tagRegion settingsDict
99+ (r0, r1, r2) <- checkManager tagRegion managerType validDefs
100+ return (Effects.Manager (Effects.Info tagRegion r0 r1 r2 managerType))
95101
96102
97103noSettings
@@ -107,10 +113,24 @@ noSettings errorMsg (A.A region settings) =
107113 Result.throw region errorMsg
108114
109115
116+noForeigns :: [A.Commented Effects.ForeignRaw] -> Result.Result wrn Error.Error ()
117+noForeigns foreigns =
118+ case foreigns of
119+ [] ->
120+ Result.ok ()
121+
122+ _ : _ ->
123+ let
124+ toError (A.A (region, _) (Effects.ForeignRaw name _)) =
125+ A.A region (Error.UnexpectedForeign name)
126+ in
127+ Result.throwMany (map toError foreigns)
128+
129+
110130toManagerType
111131 :: R.Region
112132 -> Map.Map String [(R.Region, A.Located String)]
113− -> Result.Result wrn Error.Error Fx.ManagerType
133+ -> Result.Result wrn Error.Error Effects.ManagerType
114134toManagerType tagRegion settingsDict =
115135 let
116136 toErrors name entries =
@@ -129,18 +149,19 @@ toManagerType tagRegion settingsDict =
129149 (,) <$> extractOne "command" settingsDict
130150 <*> extractOne "subscription" settingsDict
131151
152+ -- TODO check that cmd and sub types exist?
132153 case maybeEffects of
133154 (Nothing, Nothing) ->
134155 Result.throw tagRegion Error.NoSettingsOnEffectModule
135156
136157 (Just cmd, Nothing) ->
137− return (Fx.CmdManager cmd)
158+ return (Effects.CmdManager cmd)
138159
139160 (Nothing, Just sub) ->
140− return (Fx.SubManager sub)
161+ return (Effects.SubManager sub)
141162
142163 (Just cmd, Just sub) ->
143− return (Fx.FxManager cmd sub)
164+ return (Effects.FxManager cmd sub)
144165
145166
146167extractOne
@@ -163,95 +184,65 @@ extractOne name settingsDict =
163184
164185
165186
166−-- EFFECT REGIONS
167−
187+-- CHECK EFFECT MANAGER
168188
169−data ManagerInfo =
170− ManagerInfo
171− { _cmdMap :: Bool
172− , _subMap :: Bool
173− , _init :: Maybe R.Region
174− , _onEffects :: Maybe R.Region
175− , _onSelfMsg :: Maybe R.Region
176− }
177−
178−
179−noInfo :: ManagerInfo
180−noInfo =
181− ManagerInfo False False Nothing Nothing Nothing
182189
183−
184−checkManagerImpl
190+checkManager
185191 :: R.Region
186− -> Fx.ManagerType
187− -> ManagerInfo
188− -> [D.Valid]
192+ -> Effects.ManagerType
193+ -> [A.Commented Valid.Def]
189194 -> Result.Result w Error.Error (R.Region, R.Region, R.Region)
190−checkManagerImpl tagRegion managerType info decls =
191− case decls of
192− [] ->
193− let
194− (ManagerInfo cmdMap subMap init onEffects onSelfMsg) = info
195− in
196− const (,,)
197− <$> requireMaps tagRegion managerType cmdMap subMap
198− <*> requireRegion tagRegion "init" init
199− <*> requireRegion tagRegion "onEffects" onEffects
200− <*> requireRegion tagRegion "onSelfMsg" onSelfMsg
201−
202− decl : rest ->
203− case getDefInfo decl of
204− Just ("init", region) ->
205− checkManagerImpl tagRegion managerType (info { _init = Just region }) rest
206−
207− Just ("onEffects", region) ->
208− checkManagerImpl tagRegion managerType (info { _onEffects = Just region }) rest
209−
210− Just ("onSelfMsg", region) ->
211− checkManagerImpl tagRegion managerType (info { _onSelfMsg = Just region }) rest
212−
213− Just ("cmdMap", _) ->
214− checkManagerImpl tagRegion managerType (info { _cmdMap = True }) rest
215−
216− Just ("subMap", _) ->
217− checkManagerImpl tagRegion managerType (info { _subMap = True }) rest
218−
219− _ ->
220− checkManagerImpl tagRegion managerType info rest
195+checkManager tagRegion managerType validDefs =
196+ let
197+ regionDict =
198+ Map.fromList (Maybe.mapMaybe getSimpleDefRegion validDefs)
199+ in
200+ const (,,)
201+ <$> requireMaps tagRegion regionDict managerType
202+ <*> requireRegion tagRegion regionDict "init"
203+ <*> requireRegion tagRegion regionDict "onEffects"
204+ <*> requireRegion tagRegion regionDict "onSelfMsg"
221205
222206
223−getDefInfo :: D.Valid -> Maybe (String, R.Region)
224−getDefInfo decl =
207+getSimpleDefRegion :: A.Commented Valid.Def -> Maybe (String, R.Region)
208+getSimpleDefRegion decl =
225209 case decl of
226− A.A region (D.Def (Valid.Definition (A.A _ (Pattern.Var name)) _ _)) ->
227− Just (name, fst region)
210+ A.A (region, _) (Valid.Def (A.A _ (Pattern.Var name)) _ _) ->
211+ Just (name, region)
228212
229213 _ ->
230214 Nothing
231215
232216
233−requireMaps :: R.Region -> Fx.ManagerType -> Bool -> Bool -> Result.Result w Error.Error ()
234−requireMaps tagRegion managerType hasCmdMap hasSubMap =
217+requireMaps
218+ :: R.Region
219+ -> Map.Map String R.Region
220+ -> Effects.ManagerType
221+ -> Result.Result w Error.Error ()
222+requireMaps tagRegion regionDict managerType =
235223 let
236− check hasIt name =
237− when (not hasIt) (Result.throw tagRegion (Error.MissingManagerOnEffectModule name))
224+ check name =
225+ when (Map.notMember name regionDict) $
226+ Result.throw tagRegion (Error.MissingManagerOnEffectModule name)
238227 in
239228 case managerType of
240− Fx.CmdManager _ ->
241− check hasCmdMap "cmdMap"
229+ Effects.CmdManager _ ->
230+ check "cmdMap"
242231
243− Fx.SubManager _ ->
244− check hasSubMap "subMap"
232+ Effects.SubManager _ ->
233+ check "subMap"
245234
246− Fx.FxManager _ _ ->
247− (\_ _ -> ())
248− <$> check hasCmdMap "cmdMap"
249− <*> check hasSubMap "subMap"
235+ Effects.FxManager _ _ ->
236+ check "cmdMap" <* check "subMap"
250237
251238
252−requireRegion :: R.Region -> String -> Maybe R.Region -> Result.Result w Error.Error R.Region
253−requireRegion tagRegion name maybeRegion =
254− case maybeRegion of
239+requireRegion
240+ :: R.Region
241+ -> Map.Map String R.Region
242+ -> String
243+ -> Result.Result w Error.Error R.Region
244+requireRegion tagRegion regionDict name =
245+ case Map.lookup name regionDict of
255246 Just region ->
256247 return region
257248
@@ -263,30 +254,23 @@ requireRegion tagRegion name maybeRegion =
263254-- COLLAPSE COMMENTS
264255
265256
266−type Commented a =
267− A.Annotated (R.Region, Maybe (A.Located String)) a
268−
269−
270−collapseComments
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]
273258collapseComments listWithComments =
274259 case listWithComments of
275260 [] ->
276261 Result.ok []
277262
278− D.Comment msg : D.Whatever (A.A region a) : rest ->
263+ D.Comment (A.A _ msg) : D.Whatever (A.A region a) : rest ->
279264 let
280265 entry =
281266 A.A (region, Just msg) a
282267 in
283268 fmap (entry:) (collapseComments rest)
284269
285− D.Comment (A.A region _) : D.Comment _ : _ ->
286− Result.throw region Error.CommentOnComment
270+ D.Comment (A.A region _) : rest ->
271+ collapseComments rest
272+ <* Result.throw region Error.CommentOnNothing
287273
288− [D.Comment (A.A region _)] ->
289− Result.throw region Error.CommentOnNothing
290274
291275 D.Whatever (A.A region a) : rest ->
292276 let
@@ -300,87 +284,92 @@ collapseComments listWithComments =
300284-- VALIDATE STRUCTURED SOURCE
301285
302286
303−declarations :: [D.Source] -> Result.Result wrn Error.Error [D.Valid]
304−declarations sourceDecls =
305− do decls <-
306− collapseComments sourceDecls
287+validateDecls :: [D.Source] -> Result.Result wrn Error.Error ValidStuff
288+validateDecls sourceDecls =
289+ do rawDecls <- collapseComments sourceDecls
307290
308− validDecls <-
309− validateDecls decls
291+ validStuff <- validateRawDecls rawDecls
310292
311− F.traverse_ id
312− (declDuplicates validDecls : map findBadTypeVars validDecls)
293+ let (D.Decls _ unions aliases _) = _structure validStuff
313294
314− return validDecls
295+ return validStuff
296+ <* F.traverse_ checkTypeVarsInUnion unions
297+ <* F.traverse_ checkTypeVarsInAlias aliases
298+ <* checkDuplicates validStuff
315299
316300
317301
318302-- VALIDATE DECLARATIONS
319303
320304
321−validateDecls
322− :: [Commented D.Source']
323− -> Result.Result wrn Error.Error [D.Valid]
324−validateDecls commentedDecls =
305+data ValidStuff =
306+ ValidStuff
307+ { _foreigns :: [A.Commented Effects.ForeignRaw]
308+ , _structure :: D.Valid
309+ }
310+
311+
312+validateRawDecls :: [A.Commented D.Raw] -> Result.Result wrn Error.Error ValidStuff
313+validateRawDecls commentedDecls =
314+ vrdHelp commentedDecls [] (D.Decls [] [] [] [])
315+
316+
317+vrdHelp
318+ :: [A.Commented D.Raw]
319+ -> [A.Commented Effects.ForeignRaw]
320+ -> D.Valid
321+ -> Result.Result wrn Error.Error ValidStuff
322+vrdHelp commentedDecls foreigns structure =
325323 case commentedDecls of
326324 [] ->
327− Result.ok []
325+ Result.ok (ValidStuff foreigns structure)
328326
329− A.A (region, maybeComment) decl : rest ->
330− let
331− addRest validDecl =
332− let
333− entry =
334− A.A (region, fmap A.drop maybeComment) validDecl
335− in
336− fmap (entry:) (validateDecls rest)
337− in
338− case decl of
339− D.Union name tvars ctors ->
340− addRest (D.Union name tvars ctors)
327+ A.A ann decl : rest ->
328+ case decl of
329+ D.Union (D.Type name tvars ctors) ->
330+ vrdHelp rest foreigns (D.addUnion (A.A ann (D.Type name tvars ctors)) structure)
341331
342− D.Alias name tvars alias ->
343− addRest (D.Alias name tvars alias)
332+ D.Alias (D.Type name tvars alias) ->
333+ vrdHelp rest foreigns (D.addAlias (A.A ann (D.Type name tvars alias)) structure)
344334
345− D.Fixity assoc prec op ->
346− addRest (D.Fixity assoc prec op)
335+ D.Fixity fixity ->
336+ vrdHelp rest foreigns (D.addInfix fixity structure)
347337
348− D.Def def ->
349− validateDeclsHelp maybeComment def rest
338+ D.Def (A.A region def) ->
339+ vrdDefHelp rest (A.A (region, snd ann) def) foreigns structure
350340
341+ D.Foreign name tipe ->
342+ vrdHelp rest (A.A ann (Effects.ForeignRaw name tipe) : foreigns) structure
351343
352−validateDeclsHelp
353− :: Maybe (A.Located String)
354− -> Source.Def
355− -> [Commented D.Source']
356− -> Result.Result wrn Error.Error [D.Valid]
357−validateDeclsHelp maybeComment (A.A region def) decls =
358− let
359− ann =
360− (region, fmap A.drop maybeComment)
361344
362− makeDef pat expr maybeType =
363− D.Def (Valid.Definition pat expr maybeType)
345+vrdDefHelp
346+ :: [A.Commented D.Raw]
347+ -> A.Commented Source.Def'
348+ -> [A.Commented Effects.ForeignRaw]
349+ -> D.Valid
350+ -> Result.Result wrn Error.Error ValidStuff
351+vrdDefHelp remainingDecls (A.A ann def) foreigns structure =
352+ let
353+ addDef validDef (ValidStuff finalForeigns struct) =
354+ ValidStuff finalForeigns (D.addDef (A.A ann validDef) struct)
364355 in
365356 case def of
366357 Source.Definition pat expr ->
367− (:)
368− <$> validateDef makeDef ann pat expr Nothing
369− <*> validateDecls decls
358+ addDef
359+ <$> validateDef pat expr Nothing
360+ <*> vrdHelp remainingDecls foreigns structure
370361
371362 Source.Annotation name tipe ->
372− case decls of
373− A.A (_, Just (A.A commentRegion _)) _ : _ ->
374− Result.throw commentRegion (Error.CommentAfterAnnotation name)
375−
363+ case remainingDecls of
376364 A.A _ (D.Def (A.A _ (Source.Definition pat expr))) : rest
377365 | Pattern.isVar name pat ->
378− (:)
379− <$> validateDef makeDef ann pat expr (Just tipe)
380− <*> validateDecls rest
366+ addDef
367+ <$> validateDef pat expr (Just tipe)
368+ <*> vrdHelp rest foreigns structure
381369
382370 _ ->
383− Result.throw region (Error.TypeWithoutDefinition name)
371+ vrdHelp remainingDecls foreigns structure
372+ <* Result.throw (fst ann) (Error.TypeWithoutDefinition name)
384373
385374
386375
@@ -390,8 +379,12 @@ validateDeclsHelp maybeComment (A.A region def) decls =
390379definitions :: [Source.Def] -> Result.Result wrn Error.Error [Valid.Def]
391380definitions sourceDefs =
392381 do validDefs <- definitionsHelp sourceDefs
393− let patterns = map (\(Valid.Definition p _ _) -> p) validDefs
394− defDuplicates patterns
382+
383+ validDefs
384+ |> map Valid.getPattern
385+ |> concatMap Pattern.boundVars
386+ |> detectDuplicates Error.DuplicateDefinition
387+
395388 return validDefs
396389
397390
@@ -401,34 +394,32 @@ definitionsHelp sourceDefs =
401394 [] ->
402395 return []
403396
404− A.A region (Source.Definition pat expr) : rest ->
397+ A.A _ (Source.Definition pat expr) : rest ->
405398 (:)
406− <$> fmap A.drop (validateDef Valid.Definition region pat expr Nothing)
399+ <$> validateDef pat expr Nothing
407400 <*> definitionsHelp rest
408401
409− A.A r1 (Source.Annotation name tipe) : rest ->
402+ A.A region (Source.Annotation name tipe) : rest ->
410403 case rest of
411− A.A r2 (Source.Definition pat expr) : rest'
404+ A.A _ (Source.Definition pat expr) : rest'
412405 | Pattern.isVar name pat ->
413406 (:)
414− <$> fmap A.drop (validateDef Valid.Definition (R.merge r1 r2) pat expr (Just tipe))
407+ <$> validateDef pat expr (Just tipe)
415408 <*> definitionsHelp rest'
416409
417410 _ ->
418− Result.throw r1 (Error.TypeWithoutDefinition name)
411+ Result.throw region (Error.TypeWithoutDefinition name)
419412
420413
421414validateDef
422− :: (Pattern.Raw -> Valid.Expr -> Maybe Type.Raw -> def)
423− -> annotation
424− -> Pattern.Raw
415+ :: Pattern.Raw
425416 -> Source.Expr
426417 -> Maybe Type.Raw
427− -> Result.Result wrn Error.Error (A.Annotated annotation def)
428−validateDef makeDef annotation pat expr maybeType =
418+ -> Result.Result wrn Error.Error Valid.Def
419+validateDef pat expr maybeType =
429420 do validExpr <- expression expr
430421 validateDefPattern pat validExpr
431− return $ A.A annotation (makeDef pat validExpr maybeType)
422+ return $ Valid.Def pat validExpr maybeType
432423
433424
434425validateDefPattern :: Pattern.Raw -> Valid.Expr -> Result.Result wrn Error.Error ()
@@ -528,11 +519,17 @@ expression (A.A ann sourceExpression) =
528519 <$> definitions defs
529520 <*> expression body
530521
531− Cmd moduleName typeName ->
532− return (Cmd moduleName typeName)
522+ Cmd moduleName ->
523+ return (Cmd moduleName)
533524
534− Sub moduleName typeName ->
535− return (Sub moduleName typeName)
525+ Sub moduleName ->
526+ return (Sub moduleName)
527+
528+ ForeignCmd name tipe ->
529+ return (ForeignCmd name tipe)
530+
531+ ForeignSub name tipe ->
532+ return (ForeignSub name tipe)
536533
537534 SaveEnv moduleName effects ->
538535 return (SaveEnv moduleName effects)
@@ -567,112 +564,105 @@ validatePattern pattern =
567564-- DETECT DUPLICATES
568565
569566
570−detectDuplicates
571− :: (String -> Error.Error)
572− -> [A.Located String]
573− -> Result.Result wrn Error.Error ()
574−detectDuplicates tag names =
575− let add (A.A region name) dict =
576− Map.insertWith (++) name [region] dict
567+checkDuplicates :: ValidStuff -> Result.Result wrn Error.Error ()
568+checkDuplicates (ValidStuff foreigns (D.Decls defs unions aliases _)) =
569+ let
570+ -- SIMPLE NAMES
577571
578− makeGroups pairs =
579− Map.toList (foldr add Map.empty pairs)
572+ defValues =
573+ concatMap (Pattern.boundVars . Valid.getPattern . A.drop) defs
580574
581− check (name, regions) =
582− case regions of
583− _ : region : _ ->
584− Result.throw region (tag name)
575+ foreignValues =
576+ map fromForeign foreigns
585577
586− _ ->
587− return ()
588− in
589− F.traverse_ check (makeGroups names)
578+ fromForeign (A.A (region, _) (Effects.ForeignRaw name _)) =
579+ A.A region name
590580
581+ -- TYPE NAMES
591582
592−defDuplicates :: [Pattern.Raw] -> Result.Result wrn Error.Error ()
593−defDuplicates patterns =
594− concatMap Pattern.boundVars patterns
595− |> detectDuplicates Error.DuplicateDefinition
583+ (types, typeValues) =
584+ unzip (map fromUnion unions ++ map fromAlias aliases)
596585
586+ fromUnion (A.A (region, _) (D.Type name _ ctors)) =
587+ ( A.A region name
588+ , map (A.A region . fst) ctors
589+ )
597590
598−declDuplicates :: [D.Valid] -> Result.Result wrn Error.Error ()
599−declDuplicates decls =
600− let
601− (valueLists, typeLists) =
602− unzip (map extractValues decls)
603− in
604− (\_ _ -> ())
605− <$> detectDuplicates Error.DuplicateValueDeclaration (concat valueLists)
606− <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
591+ fromAlias (A.A (region, _) (D.Type name _ (A.A _ tipe))) =
592+ (,) (A.A region name) $
593+ case tipe of
594+ Type.RRecord _ _ ->
595+ [A.A region name]
607596
597+ _ ->
598+ []
599+ in
600+ F.sequenceA_
601+ [ detectDuplicates Error.DuplicateValueDeclaration (foreignValues ++ defValues)
602+ , detectDuplicates Error.DuplicateValueDeclaration (concat typeValues)
603+ , detectDuplicates Error.DuplicateTypeDeclaration types
604+ ]
608605
609−extractValues :: D.Valid -> ([A.Located String], [A.Located String])
610−extractValues (A.A (region, _) decl) =
611− case decl of
612− D.Def (Valid.Definition pattern _ _) ->
613− ( Pattern.boundVars pattern
614− , []
615− )
616606
617− D.Union name _ ctors ->
618− ( map (A.A region . fst) ctors
619− , [A.A region name]
620− )
607+detectDuplicates
608+ :: (String -> Error.Error)
609+ -> [A.Located String]
610+ -> Result.Result wrn Error.Error ()
611+detectDuplicates tag names =
612+ let
613+ add (A.A region name) dict =
614+ Map.insertWith (++) name [region] dict
621615
622− D.Alias name _ (A.A _ (Type.RRecord _ _)) ->
623− ( [A.A region name]
624− , [A.A region name]
625− )
616+ makeGroups pairs =
617+ Map.toList (foldr add Map.empty pairs)
626618
627− D.Alias name _ _ ->
628− ( []
629− , [A.A region name]
630− )
619+ check (name, regions) =
620+ case regions of
621+ _ : region : _ ->
622+ Result.throw region (tag name)
631623
632− D.Fixity _ _ _ ->
633− ( []
634− , []
635− )
624+ _ ->
625+ return ()
626+ in
627+ F.traverse_ check (makeGroups names)
636628
637629
638630
639631-- UNBOUND TYPE VARIABLES
640632
641633
642−findBadTypeVars :: D.Valid -> Result.Result wrn Error.Error ()
643−findBadTypeVars (A.A (region,_) decl) =
644− case decl of
645− D.Def _ ->
634+checkTypeVarsInUnion
635+ :: A.Commented (D.Union Type.Raw)
636+ -> Result.Result wrn Error.Error ()
637+checkTypeVarsInUnion (A.A (region,_) (D.Type name boundVars ctors)) =
638+ case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
639+ (_, []) ->
646640 return ()
647641
648− D.Union name boundVars ctors ->
649− case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
650− (_, []) ->
651− return ()
642+ (_, unbound) ->
643+ Result.throw region
644+ (Error.UnboundTypeVarsInUnion name boundVars unbound)
652645
653− (_, unbound) ->
654− Result.throw region
655− (Error.UnboundTypeVarsInUnion name boundVars unbound)
656−
657− D.Alias name boundVars tipe ->
658− case diff boundVars (freeVars tipe) of
659− ([], []) ->
660− return ()
661646
662− ([], unbound) ->
663− Result.throw region
664− (Error.UnboundTypeVarsInAlias name boundVars unbound)
647+checkTypeVarsInAlias
648+ :: A.Commented (D.Alias Type.Raw)
649+ -> Result.Result wrn Error.Error ()
650+checkTypeVarsInAlias (A.A (region,_) (D.Type name boundVars tipe)) =
651+ case diff boundVars (freeVars tipe) of
652+ ([], []) ->
653+ return ()
665654
666− (unused, []) ->
667− Result.throw region
668− (Error.UnusedTypeVarsInAlias name boundVars unused)
655+ ([], unbound) ->
656+ Result.throw region
657+ (Error.UnboundTypeVarsInAlias name boundVars unbound)
669658
670− (unused, unbound) ->
671− Result.throw region
672− (Error.MessyTypeVarsInAlias name boundVars unused unbound)
659+ (unused, []) ->
660+ Result.throw region
661+ (Error.UnusedTypeVarsInAlias name boundVars unused)
673662
674− D.Fixity _ _ _ ->
675− return ()
663+ (unused, unbound) ->
664+ Result.throw region
665+ (Error.MessyTypeVarsInAlias name boundVars unused unbound)
676666
677667
678668diff :: [String] -> [A.Located String] -> ([String], [String])
@@ -689,7 +679,6 @@ diff left right =
689679 )
690680
691681
692−
693682freeVars :: Type.Raw -> [A.Located String]
694683freeVars (A.A region tipe) =
695684 case tipe of