@@ -1,18 +1,25 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2−module Validate (declarations) where
2+module Validate (Result, module') where
4+import Prelude hiding (init)
4−import Control.Monad (foldM)
5+import 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
13+import qualified AST.Effects as Effects
11import qualified AST.Expression.Source as Source
14import qualified AST.Expression.Source as Source
12import qualified AST.Expression.Valid as Valid
15import qualified AST.Expression.Valid as Valid
13import qualified AST.Declaration as D
16import qualified AST.Declaration as D
17+import qualified AST.Module as Module
18+import qualified AST.Module.Name as ModuleName
14import qualified AST.Pattern as Pattern
19import qualified AST.Pattern as Pattern
15import qualified AST.Type as Type
20import qualified AST.Type as Type
21+import qualified Elm.Compiler.Imports as Imports
22+import qualified Elm.Package as Package
16import Elm.Utils ((|>))
23import Elm.Utils ((|>))
17import qualified Reporting.Annotation as A
24import qualified Reporting.Annotation as A
18import qualified Reporting.Error.Syntax as Error
25import qualified Reporting.Error.Syntax as Error
@@ -20,163 +27,401 @@ import qualified Reporting.Region as R
20import qualified Reporting.Result as Result
27import qualified Reporting.Result as Result
23−-- VALIDATE DECLARATIONS
25−declarations
31+type Result warning a =
26− :: Bool
32+ Result.Result () warning Error.Error a
28− -> Result.Result wrn Error.Error [D.ValidDecl]
34+
29−declarations isRoot sourceDecls =
35+
30− do validDecls <- validateDecls Nothing sourceDecls
36+-- MODULES
31− (\_ _ -> validDecls)
37+
32− <$> declDuplicates validDecls
38+
33− <*> T.traverse (checkDecl isRoot) validDecls
39+module' :: Module.Source -> Result wrn Module.Valid
34−
40+module' (Module.Module name path info) =
36−validateDecls
42+ (ModuleName.Canonical pkgName _) =
37− :: Maybe String
43+ name
39− -> Result.Result wrn Error.Error [D.ValidDecl]
45+ (Module.Source tag settings docs exports imports decls) =
40−validateDecls maybeComment sourceDecls =
46+ info
41− case sourceDecls of
47+ in
48+ do (ValidStuff ports structure) <- validateDecls decls
50+ validEffects <- validateEffects tag settings ports (D._defs structure)
52+ return $ Module.Module name path $
53+ Module.Valid docs exports (addDefaults pkgName imports) structure validEffects
62+ -> [Module.UserImport]
63+ -> ([Module.DefaultImport], [Module.UserImport])
64+addDefaults pkgName imports =
66+ if pkgName == Package.core then
79+ -> Module.SourceSettings
80+ -> [A.Commented Effects.PortRaw]
81+ -> [A.Commented Valid.Def]
82+ -> Result wrn Effects.Raw
83+validateEffects tag settings@(A.A _ pairs) ports validDefs =
86+ do noSettings Error.SettingsOnNormalModule settings
91+ do noSettings Error.SettingsOnPortModule settings
92+ return (Effects.Port ports)
94+ Module.Effect tagRegion ->
96+ collectSettings (A.A region setting, userValue) dict =
97+ Map.insertWith (++) setting [(region, userValue)] dict
100+ foldr collectSettings Map.empty pairs
103+ managerType <- toManagerType tagRegion settingsDict
104+ (r0, r1, r2) <- checkManager tagRegion managerType validDefs
105+ return (Effects.Manager () (Effects.Info tagRegion r0 r1 r2 managerType))
108+noSettings :: Error.Error -> Module.SourceSettings -> Result wrn ()
109+noSettings errorMsg (A.A region settings) =
43− return []
112+ Result.ok ()
45− sourceDecl : decls ->
114+ _ : _ ->
115+ Result.throw region errorMsg
118+noPorts :: [A.Commented Effects.PortRaw] -> Result wrn ()
46− case sourceDecl of
120+ case ports of
47− D.Comment comment ->
121+ [] ->
48− validateDecls (Just comment) decls
122+ Result.ok ()
50− D.Decl decl ->
124+ _ : _ ->
51− validateDeclsHelp maybeComment decl decls
125+ let
52−
126+ toError (A.A (region, _) (Effects.PortRaw name _)) =
53−
127+ A.A region (Error.UnexpectedPort name)
54−validateDeclsHelp
128+ in
55− :: Maybe String
129+ Result.throwMany (map toError ports)
56− -> A.Located D.SourceDecl'
130+
57− -> [D.SourceDecl]
131+
58− -> Result.Result wrn Error.Error [D.ValidDecl]
132+toManagerType
59−validateDeclsHelp comment (A.A region decl) decls =
133+ :: R.Region
60− let addRest validDecl =
134+ -> Map.Map String [(R.Region, A.Located String)]
61− (:) (A.A (region, comment) validDecl)
135+ -> Result wrn Effects.ManagerType
62− <$> validateDecls Nothing decls
136+toManagerType tagRegion settingsDict =
138+ toErrors name entries =
139+ map (\entry -> A.A (fst entry) (Error.BadSettingOnEffectModule name)) entries
143+ |> Map.delete "command"
144+ |> Map.delete "subscription"
145+ |> Map.mapWithKey toErrors
149+ do when (not (null errors)) (Result.throwMany errors)
151+ (,) <$> extractOne "command" settingsDict
152+ <*> extractOne "subscription" settingsDict
154+ -- TODO check that cmd and sub types exist?
64− case decl of
155+ case maybeEffects of
65− D.Datatype name tvars ctors ->
156+ (Nothing, Nothing) ->
66− addRest (D.Datatype name tvars ctors)
157+ Result.throw tagRegion Error.NoSettingsOnEffectModule
159+ (Just cmd, Nothing) ->
160+ return (Effects.CmdManager cmd)
162+ (Nothing, Just sub) ->
163+ return (Effects.SubManager sub)
165+ (Just cmd, Just sub) ->
166+ return (Effects.FxManager cmd sub)
68− D.TypeAlias name tvars alias ->
69− addRest (D.TypeAlias name tvars alias)
71− D.Fixity assoc prec op ->
169+extractOne
72− addRest (D.Fixity assoc prec op)
170+ :: String
171+ -> Map.Map String [(R.Region, A.Located String)]
172+ -> Result wrn (Maybe (A.Located String))
173+extractOne name settingsDict =
174+ case Map.lookup name settingsDict of
74− D.Definition def ->
178+ Just [] ->
75− defHelp comment def decls
179+ error "Empty lists should never be added to the dictionary of effect module settings."
77− D.Port port ->
181+ Just [(_, userType)] ->
78− portHelp comment region port decls
182+ return (Just userType)
184+ Just ((region, _) : _) ->
185+ Result.throw region (Error.DuplicateSettingOnEffectModule name)
81−-- VALIDATE DEFINITIONS IN DECLARATIONS
84− :: Maybe String
189+-- CHECK EFFECT MANAGER
86− -> [D.SourceDecl]
191+
87− -> Result.Result wrn Error.Error [D.ValidDecl]
192+checkManager
88−defHelp comment (A.A region def) decls =
193+ :: R.Region
89− let addRest def' rest =
194+ -> Effects.ManagerType
90− (:) (A.A (region, comment) (D.Definition def'))
195+ -> [A.Commented Valid.Def]
91− <$> validateDecls Nothing rest
196+ -> Result wrn (R.Region, R.Region, R.Region)
197+checkManager tagRegion managerType validDefs =
200+ Map.fromList (Maybe.mapMaybe getSimpleDefRegion validDefs)
93− case def of
202+ const (,,)
94− Source.Definition pat expr ->
203+ <$> requireMaps tagRegion regionDict managerType
95− do expr' <- expression expr
204+ <*> requireRegion tagRegion regionDict "init"
96− let def' = Valid.Definition pat expr' Nothing
205+ <*> requireRegion tagRegion regionDict "onEffects"
97− checkDefinition def'
206+ <*> requireRegion tagRegion regionDict "onSelfMsg"
100− Source.TypeAnnotation name tipe ->
102− D.Decl (A.A _ (D.Definition (A.A _
103− (Source.Definition pat@(A.A _ (Pattern.Var name')) expr)))) : rest
105− do expr' <- expression expr
106− let def' = Valid.Definition pat expr' (Just tipe)
107− checkDefinition def'
111− Result.throw region (Error.TypeWithoutDefinition name)
209+getSimpleDefRegion :: A.Commented Valid.Def -> Maybe (String, R.Region)
210+getSimpleDefRegion decl =
212+ A.A (region, _) (Valid.Def (A.A _ (Pattern.Var name)) _ _) ->
114−-- VALIDATE PORTS IN DECLARATIONS
116−portHelp
219+requireMaps
117− :: Maybe String
220+ :: R.Region
118− -> R.Region
221+ -> Map.Map String R.Region
119− -> D.SourcePort
222+ -> Effects.ManagerType
121− -> Result.Result wrn Error.Error [D.ValidDecl]
223+ -> Result wrn ()
122−portHelp comment region port decls =
224+requireMaps tagRegion regionDict managerType =
123− let addRest port' rest =
225+ let
124− (:) (A.A (region,comment) (D.Port port'))
226+ check name =
125− <$> validateDecls Nothing rest
227+ when (Map.notMember name regionDict) $
228+ Result.throw tagRegion (Error.MissingManagerOnEffectModule name)
127− case port of
230+ case managerType of
128− D.PortDefinition name _ ->
231+ Effects.CmdManager _ ->
129− Result.throw region (Error.PortWithoutAnnotation name)
232+ check "cmdMap"
131− D.PortAnnotation name tipe ->
234+ Effects.SubManager _ ->
132− case decls of
235+ check "subMap"
133− D.Decl (A.A _ (D.Port (D.PortDefinition name' expr))) : rest
236+
134− | name == name' ->
237+ Effects.FxManager _ _ ->
135− do expr' <- expression expr
238+ check "cmdMap" <* check "subMap"
136− let port' = D.Out name expr' tipe
239+
137− addRest port' rest
240+
241+requireRegion :: R.Region -> Map.Map String R.Region -> String -> Result wrn R.Region
242+requireRegion tagRegion regionDict name =
243+ case Map.lookup name regionDict of
248+ Result.throw tagRegion (Error.MissingManagerOnEffectModule name)
255+collapseComments :: [D.CommentOr (A.Located a)] -> Result wrn [A.Commented a]
256+collapseComments listWithComments =
257+ case listWithComments of
261+ D.Comment (A.A _ msg) : D.Whatever (A.A region a) : rest ->
264+ A.A (region, Just msg) a
266+ fmap (entry:) (collapseComments rest)
268+ D.Comment (A.A region _) : rest ->
269+ collapseComments rest
270+ <* Result.throw region Error.CommentOnNothing
273+ D.Whatever (A.A region a) : rest ->
276+ A.A (region, Nothing) a
278+ fmap (entry:) (collapseComments rest)
282+-- VALIDATE STRUCTURED SOURCE
285+validateDecls :: [D.Source] -> Result wrn ValidStuff
286+validateDecls sourceDecls =
287+ do rawDecls <- collapseComments sourceDecls
289+ validStuff <- validateRawDecls rawDecls
291+ let (D.Decls _ unions aliases _) = _structure validStuff
294+ <* F.traverse_ checkTypeVarsInUnion unions
295+ <* F.traverse_ checkTypeVarsInAlias aliases
296+ <* checkDuplicates validStuff
300+-- VALIDATE DECLARATIONS
305+ { _ports :: [A.Commented Effects.PortRaw]
306+ , _structure :: D.Valid
310+validateRawDecls :: [A.Commented D.Raw] -> Result wrn ValidStuff
311+validateRawDecls commentedDecls =
312+ vrdHelp commentedDecls [] (D.Decls [] [] [] [])
316+ :: [A.Commented D.Raw]
317+ -> [A.Commented Effects.PortRaw]
319+ -> Result wrn ValidStuff
320+vrdHelp commentedDecls ports structure =
321+ case commentedDecls of
323+ Result.ok (ValidStuff ports structure)
325+ A.A ann decl : rest ->
327+ D.Union (D.Type name tvars ctors) ->
328+ vrdHelp rest ports (D.addUnion (A.A ann (D.Type name tvars ctors)) structure)
330+ D.Alias (D.Type name tvars alias) ->
331+ vrdHelp rest ports (D.addAlias (A.A ann (D.Type name tvars alias)) structure)
334+ vrdHelp rest ports (D.addInfix fixity structure)
336+ D.Def (A.A region def) ->
337+ vrdDefHelp rest (A.A (region, snd ann) def) ports structure
340+ vrdHelp rest (A.A ann (Effects.PortRaw name tipe) : ports) structure
344+ :: [A.Commented D.Raw]
345+ -> A.Commented Source.Def'
346+ -> [A.Commented Effects.PortRaw]
348+ -> Result wrn ValidStuff
349+vrdDefHelp remainingDecls (A.A ann def) ports structure =
351+ addDef validDef (ValidStuff finalPorts struct) =
352+ ValidStuff finalPorts (D.addDef (A.A ann validDef) struct)
355+ Source.Definition pat expr ->
357+ <$> validateDef pat expr Nothing
358+ <*> vrdHelp remainingDecls ports structure
360+ Source.Annotation name tipe ->
361+ case remainingDecls of
362+ A.A _ (D.Def (A.A _ (Source.Definition pat expr))) : rest
363+ | Pattern.isVar name pat ->
365+ <$> validateDef pat expr (Just tipe)
366+ <*> vrdHelp rest ports structure
140− addRest (D.In name tipe) decls
369+ vrdHelp remainingDecls ports structure
370+ <* Result.throw (fst ann) (Error.TypeWithoutDefinition name)
143-- VALIDATE DEFINITIONS
374-- VALIDATE DEFINITIONS
145−definitions :: [Source.Def] -> Result.Result wrn Error.Error [Valid.Def]
377+definitions :: [Source.Def] -> Result wrn [Valid.Def]
146definitions sourceDefs =
378definitions sourceDefs =
147 do validDefs <- definitionsHelp sourceDefs
379 do validDefs <- definitionsHelp sourceDefs
148− let patterns = map (\(Valid.Definition p _ _) -> p) validDefs
380+
149− defDuplicates patterns
381+ validDefs
382+ |> map Valid.getPattern
383+ |> concatMap Pattern.boundVars
384+ |> detectDuplicates Error.DuplicateDefinition
150 return validDefs
386 return validDefs
153−definitionsHelp :: [Source.Def] -> Result.Result wrn Error.Error [Valid.Def]
389+definitionsHelp :: [Source.Def] -> Result wrn [Valid.Def]
154definitionsHelp sourceDefs =
390definitionsHelp sourceDefs =
155 case sourceDefs of
391 case sourceDefs of
157− return []
393+ return []
159 A.A _ (Source.Definition pat expr) : rest ->
395 A.A _ (Source.Definition pat expr) : rest ->
160− do expr' <- expression expr
396+ (:)
161− let def = Valid.Definition pat expr' Nothing
397+ <$> validateDef pat expr Nothing
163− (:) def <$> definitionsHelp rest
398+ <*> definitionsHelp rest
165− A.A region (Source.TypeAnnotation name tipe) : rest ->
400+ A.A region (Source.Annotation name tipe) : rest ->
166− case rest of
401+ case rest of
167− A.A _ (Source.Definition pat@(A.A _ (Pattern.Var name')) expr) : rest'
402+ A.A _ (Source.Definition pat expr) : rest'
168− | name == name' ->
403+ | Pattern.isVar name pat ->
169− do expr' <- expression expr
404+ (:)
170− let def = Valid.Definition pat expr' (Just tipe)
405+ <$> validateDef pat expr (Just tipe)
172− (:) def <$> definitionsHelp rest'
406+ <*> definitionsHelp rest'
175− Result.throw region (Error.TypeWithoutDefinition name)
409+ Result.throw region (Error.TypeWithoutDefinition name)
178−checkDefinition :: Valid.Def -> Result.Result wrn Error.Error ()
412+validateDef
179−checkDefinition (Valid.Definition pattern body _) =
413+ :: Pattern.Raw
416+ -> Result wrn Valid.Def
417+validateDef pat expr maybeType =
418+ do validExpr <- expression expr
419+ validateDefPattern pat validExpr
420+ return $ Valid.Def pat validExpr maybeType
423+validateDefPattern :: Pattern.Raw -> Valid.Expr -> Result wrn ()
424+validateDefPattern pattern body =
180 case fst (Expr.collectLambdas body) of
425 case fst (Expr.collectLambdas body) of
182 return ()
427 return ()
@@ -194,9 +439,11 @@ checkDefinition (Valid.Definition pattern body _) =
194 Result.throw (R.merge start end) (Error.BadFunctionName (length args))
439 Result.throw (R.merge start end) (Error.BadFunctionName (length args))
197-- VALIDATE EXPRESSIONS
443-- VALIDATE EXPRESSIONS
199−expression :: Source.Expr -> Result.Result wrn Error.Error Valid.Expr
446+expression :: Source.Expr -> Result wrn Valid.Expr
200expression (A.A ann sourceExpression) =
447expression (A.A ann sourceExpression) =
201 A.A ann <$>
448 A.A ann <$>
202 case sourceExpression of
449 case sourceExpression of
@@ -270,162 +517,144 @@ expression (A.A ann sourceExpression) =
270 <$> definitions defs
517 <$> definitions defs
271 <*> expression body
518 <*> expression body
273− GLShader uid src gltipe ->
520+ Cmd moduleName ->
274− return (GLShader uid src gltipe)
521+ return (Cmd moduleName)
276− Port impl ->
523+ Sub moduleName ->
277− Port <$>
524+ return (Sub moduleName)
280− return (In name tipe)
282− Out name expr tipe ->
526+ OutgoingPort name tipe ->
283− do expr' <- expression expr
284− return (Out name expr' tipe)
527+ return (OutgoingPort name tipe)
286− Task name expr tipe ->
529+ IncomingPort name tipe ->
287− do expr' <- expression expr
288− return (Task name expr' tipe)
530+ return (IncomingPort name tipe)
533+ error "DANGER - Program AST nodes should not be in validation phase."
535+ SaveEnv moduleName effects ->
536+ return (SaveEnv moduleName effects)
538+ GLShader uid src gltipe ->
539+ return (GLShader uid src gltipe)
291−second :: (a, Source.Expr) -> Result.Result wrn Error.Error (a, Valid.Expr)
542+second :: (a, Source.Expr) -> Result wrn (a, Valid.Expr)
292second (value, expr) =
543second (value, expr) =
293 (,) value <$> expression expr
544 (,) value <$> expression expr
297− :: (Source.Expr, Source.Expr)
298− -> Result.Result wrn Error.Error (Valid.Expr, Valid.Expr)
547+both :: (Source.Expr, Source.Expr) -> Result wrn (Valid.Expr, Valid.Expr)
299both (expr1, expr2) =
548both (expr1, expr2) =
300 (,) <$> expression expr1 <*> expression expr2
549 (,) <$> expression expr1 <*> expression expr2
303-- VALIDATE PATTERNS
553-- VALIDATE PATTERNS
305−validatePattern :: Pattern.RawPattern -> Result.Result wrn Error.Error Pattern.RawPattern
556+validatePattern :: Pattern.Raw -> Result wrn Pattern.Raw
306validatePattern pattern =
557validatePattern pattern =
307 do detectDuplicates Error.BadPattern (Pattern.boundVars pattern)
558 do detectDuplicates Error.BadPattern (Pattern.boundVars pattern)
308 return pattern
559 return pattern
313−detectDuplicates
563+-- DETECT DUPLICATES
314− :: (String -> Error.Error)
315− -> [A.Located String]
316− -> Result.Result wrn Error.Error ()
317−detectDuplicates tag names =
318− let add (A.A region name) dict =
319− Map.insertWith (++) name [region] dict
322− Map.toList (foldr add Map.empty pairs)
324− check (name, regions) =
566+checkDuplicates :: ValidStuff -> Result wrn ()
325− case regions of
567+checkDuplicates (ValidStuff ports (D.Decls defs unions aliases _)) =
326− _ : region : _ ->
568+ let
327− Result.throw region (tag name)
569+ -- SIMPLE NAMES
329− _ ->
571+ defValues =
330− return ()
572+ concatMap (Pattern.boundVars . Valid.getPattern . A.drop) defs
332− F.traverse_ check (makeGroups names)
335−defDuplicates
577+ fromPort (A.A (region, _) (Effects.PortRaw name _)) =
336− :: [Pattern.RawPattern]
578+ A.A region name
337− -> Result.Result wrn Error.Error ()
338−defDuplicates patterns =
339− concatMap Pattern.boundVars patterns
340− |> detectDuplicates Error.DuplicateDefinition
343−declDuplicates :: [D.ValidDecl] -> Result.Result wrn Error.Error ()
582+ (types, typeValues) =
344−declDuplicates decls =
583+ unzip (map fromUnion unions ++ map fromAlias aliases)
345− let (valueLists, typeLists) = unzip (map extractValues decls)
348− <$> detectDuplicates Error.DuplicateValueDeclaration (concat valueLists)
349− <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
585+ fromUnion (A.A (region, _) (D.Type name _ ctors)) =
587+ , map (A.A region . fst) ctors
352−extractValues :: D.ValidDecl -> ([A.Located String], [A.Located String])
590+ fromAlias (A.A (region, _) (D.Type name _ (A.A _ tipe))) =
353−extractValues (A.A (region, _) decl) =
591+ (,) (A.A region name) $
354− case decl of
592+ case tipe of
355− D.Definition (Valid.Definition pattern _ _) ->
593+ Type.RRecord _ _ ->
356− ( Pattern.boundVars pattern
594+ [A.A region name]
360− D.Datatype name _ ctors ->
596+ _ ->
361− ( map (A.A region . fst) ctors
597+ []
362− , [A.A region name]
598+ in
600+ [ detectDuplicates Error.DuplicateValueDeclaration (portValues ++ defValues)
601+ , detectDuplicates Error.DuplicateValueDeclaration (concat typeValues)
602+ , detectDuplicates Error.DuplicateTypeDeclaration types
365− D.TypeAlias name _ (A.A _ (Type.RRecord _ _)) ->
370− D.TypeAlias name _ _ ->
606+detectDuplicates :: (String -> Error.Error) -> [A.Located String] -> Result wrn ()
371− ( []
607+detectDuplicates tag names =
372− , [A.A region name]
608+ let
373− )
609+ add (A.A region name) dict =
610+ Map.insertWith (++) name [region] dict
375− D.Port port ->
612+ makeGroups pairs =
376− ( [A.A region (D.validPortName port)]
613+ Map.toList (foldr add Map.empty pairs)
380− D.Fixity _ _ _ ->
615+ check (name, regions) =
381− ( []
616+ case regions of
382− , []
617+ _ : region : _ ->
383− )
618+ Result.throw region (tag name)
623+ F.traverse_ check (makeGroups names)
386−-- UNBOUND TYPE VARIABLES
388−checkDecl :: Bool -> D.ValidDecl -> Result.Result wrn Error.Error ()
389−checkDecl isRoot (A.A (region,_) decl) =
394− D.Datatype name boundVars ctors ->
627+-- UNBOUND TYPE VARIABLES
395− case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
401− (Error.UnboundTypeVarsInUnion name boundVars unbound)
403− D.TypeAlias name boundVars tipe ->
630+checkTypeVarsInUnion :: A.Commented (D.Union Type.Raw) -> Result wrn ()
631+checkTypeVarsInUnion (A.A (region,_) (D.Type name boundVars ctors)) =
404− case diff boundVars (freeVars tipe) of
632+ case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
405− ([], []) ->
633+ (_, []) ->
406− return ()
634+ return ()
408− ([], unbound) ->
636+ (_, unbound) ->
409− Result.throw region
637+ Result.throw region
410− (Error.UnboundTypeVarsInAlias name boundVars unbound)
638+ (Error.UnboundTypeVarsInUnion name boundVars unbound)
414− (Error.UnusedTypeVarsInAlias name boundVars unused)
416− (unused, unbound) ->
641+checkTypeVarsInAlias :: A.Commented (D.Alias Type.Raw) -> Result wrn ()
417− Result.throw region
642+checkTypeVarsInAlias (A.A (region,_) (D.Type name boundVars tipe)) =
418− (Error.MessyTypeVarsInAlias name boundVars unused unbound)
643+ case diff boundVars (freeVars tipe) of
420− D.Port _ ->
647+ ([], unbound) ->
421− if isRoot then
648+ Result.throw region
422− return ()
649+ (Error.UnboundTypeVarsInAlias name boundVars unbound)
424− else
651+ (unused, []) ->
425− Result.throw region Error.UnexpectedPort
652+ Result.throw region
653+ (Error.UnusedTypeVarsInAlias name boundVars unused)
427− D.Fixity _ _ _ ->
655+ (unused, unbound) ->
428− return ()
656+ Result.throw region
657+ (Error.MessyTypeVarsInAlias name boundVars unused unbound)
431diff :: [String] -> [A.Located String] -> ([String], [String])
660diff :: [String] -> [A.Located String] -> ([String], [String])
@@ -442,23 +671,21 @@ diff left right =
446freeVars :: Type.Raw -> [A.Located String]
674freeVars :: Type.Raw -> [A.Located String]
447freeVars (A.A region tipe) =
675freeVars (A.A region tipe) =
448− case tipe of
676+ case tipe of
449− Type.RLambda t1 t2 ->
677+ Type.RLambda t1 t2 ->
450− freeVars t1 ++ freeVars t2
678+ freeVars t1 ++ freeVars t2
455− Type.RType _ ->
680+ Type.RVar x ->
456− []
681+ [A.A region x]
458− Type.RApp t ts ->
683+ Type.RType _ ->
459− concatMap freeVars (t:ts)
684+ []
461− Type.RRecord fields ext ->
686+ Type.RApp t ts ->
462− maybe [] freeVars ext
687+ concatMap freeVars (t:ts)
463− ++ concatMap (freeVars . snd) fields
689+ Type.RRecord fields ext ->
690+ maybe [] freeVars ext
691+ ++ concatMap (freeVars . snd) fields