on master help sign in
Properly parse and validate define construct
commit4da491bc9c13e2fe06223f47f4adcbc25b9c519a authorEvan Czaplicki <info@elm-lang.org> dateThu 4 Feb 2016, 17:45 (11 years ago) parent455dcb2
8 files changed+328−128
src/AST/Declaration.hs+54−26 src/AST/Expression/Valid.hs+13−6 src/AST/Module.hs+4−4 src/Parse/Declaration.hs+13−4 src/Parse/Module.hs+10−5 src/Parse/Parse.hs+3−4 src/Reporting/Error/Syntax.hs+21−14 src/Validate.hs+210−65
src/AST/Declaration.hs+54−26
@@ -22,24 +22,32 @@ data Decl def tipe expr
2222
2323
2424
25−-- INFIX STUFF
25+-- DECLARATION PHASES
2626
2727
28−data Assoc = L | N | R
29− deriving (Eq)
28+type Source =
29+ CommentOr (A.Located SourceOrDefine)
3030
3131
32−assocToString :: Assoc -> String
33−assocToString assoc =
34− case assoc of
35− L ->
36− "left"
32+data SourceOrDefine
33+ = Source Source'
34+ | Define EffectType [CommentOr (A.Located Source.Effect)]
3735
38− N ->
39− "non"
4036
41− R ->
42− "right"
37+type Source' =
38+ Decl Source.Def Type.Raw Source.Expr
39+
40+
41+type Valid =
42+ A.Commented Valid'
43+
44+
45+type Valid' =
46+ Decl Valid.Def Type.Raw Valid.Expr
47+
48+
49+type Canonical =
50+ A.Commented (Decl Canonical.Def Type.Canonical Canonical.Expr)
4351
4452
4553
@@ -52,32 +60,52 @@ data CommentOr a
5260
5361
5462
55−-- DECLARATION PHASES
63+-- EFFECTS
5664
5765
58−type Source =
59− CommentOr (A.Located SourceOrDefine)
66+data EffectType
67+ = Cmd
68+ | Sub
69+ | ForeignCmd
70+ | ForeignSub
71+ deriving (Eq, Ord)
6072
6173
62−data SourceOrDefine
63− = Source Source'
64− | Define String [CommentOr (A.Located Source.Effect)]
74+effectTypeToString :: EffectType -> String
75+effectTypeToString tipe =
76+ case tipe of
77+ Cmd ->
78+ "commands"
6579
80+ Sub ->
81+ "subscriptions"
6682
67−type Source' =
68− Decl Source.Def Type.Raw Source.Expr
83+ ForeignCmd ->
84+ "foreign commands"
6985
86+ ForeignSub ->
87+ "foreign subscriptions"
7088
71−type Valid =
72− A.Commented Valid'
7389
7490
75−type Valid' =
76− Decl Valid.Def Type.Raw Valid.Expr
91+-- INFIX STUFF
7792
7893
79−type Canonical =
80− A.Commented (Decl Canonical.Def Type.Canonical Canonical.Expr)
94+data Assoc = L | N | R
95+ deriving (Eq)
96+
97+
98+assocToString :: Assoc -> String
99+assocToString assoc =
100+ case assoc of
101+ L ->
102+ "left"
103+
104+ N ->
105+ "non"
106+
107+ R ->
108+ "right"
81109
82110
83111
src/AST/Expression/Valid.hs+13−6
@@ -5,6 +5,7 @@ import qualified AST.Expression.General as General
55import qualified AST.Pattern as Pattern
66import qualified AST.Type as Type
77import qualified AST.Variable as Var
8+import qualified Reporting.Annotation as A
89import qualified Reporting.Region as R
910
1011
@@ -21,14 +22,20 @@ type Expr' =
2122
2223
2324data Def
24− = Definition Pattern.Raw Expr (Maybe Type.Raw)
25+ = Definition Pattern.Raw Expr (Maybe Type.Raw)
2526
2627
27−data Effect
28− = Def Pattern.Raw Expr (Maybe Type.Raw)
28+data Effects
29+ = None
30+ | Effects [A.Commented Def] [A.Commented Def]
31+ | ForeignEffects [A.Commented ForeignCmd] [A.Commented ForeignSub]
2932
3033
31−data Foreign
32− = Type String Type.Raw
33− | With String Expr
34+data ForeignCmd
35+ = Cmd String Type.Raw
36+
37+
38+data ForeignSub
39+ = Sub String Type.Raw
40+ | SubWith String Expr
3441
src/AST/Module.hs+4−4
@@ -30,6 +30,7 @@ import qualified Docs.AST as Docs
3030import qualified Elm.Package as Package
3131import qualified Elm.Compiler.Version as Compiler
3232import qualified Reporting.Annotation as A
33+import qualified Reporting.Region as R
3334
3435
3536
@@ -62,8 +63,8 @@ data Module phase =
6263
6364data Tag
6465 = None
65− | Effect
66− | Foreign
66+ | Effect R.Region
67+ | Foreign R.Region
6768
6869
6970type Source =
@@ -89,8 +90,7 @@ data ValidInfo =
8990 , validExports :: Var.Listing (A.Located Var.Value)
9091 , validImports :: ([DefaultImport], [UserImport])
9192 , validDecls :: [Decl.Valid]
92− , validCmds :: [A.Commented Valid.Effect]
93− , validSubs :: [A.Commented Valid.Effect]
93+ , validEffects :: Valid.Effects
9494 }
9595
9696
src/Parse/Declaration.hs+13−4
@@ -1,7 +1,7 @@
11{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
22module Parse.Declaration where
33
4−import Text.Parsec ( (<|>), (<?>), choice, digit, optionMaybe, string, try )
4+import Text.Parsec ( (<?>), choice, digit, optionMaybe, string, try )
55import qualified Text.Parsec.Indent as Indent
66
77import qualified AST.Declaration as Decl
@@ -95,15 +95,24 @@ defineDecl =
9595 do try (reserved "define")
9696 forcedWS
9797
98− name <-
99− string "commands" <|> string "subscriptions"
98+ effectType <-
99+ choice
100+ [ string "commands" >> return Decl.Cmd
101+ , string "subscriptions" >> return Decl.Sub
102+ , do string "foreign"
103+ whitespace
104+ choice
105+ [ string "commands" >> return Decl.ForeignCmd
106+ , string "subscriptions" >> return Decl.ForeignSub
107+ ]
108+ ]
100109
101110 padded (reserved "as")
102111
103112 effects <-
104113 Indent.block (commentOr effectDef <* whitespace)
105114
106− return (Decl.Define name effects)
115+ return (Decl.Define effectType effects)
107116
108117
109118effectDef :: IParser (A.Located Source.Effect)
src/Parse/Module.hs+10−5
@@ -7,7 +7,8 @@ import Parse.Helpers
77import qualified AST.Module as Module
88import qualified AST.Module.Name as ModuleName
99import qualified AST.Variable as Var
10−import Reporting.Annotation as A
10+import qualified Reporting.Annotation as A
11+import qualified Reporting.Region as R
1112
1213
1314getModuleName :: String -> Maybe String
@@ -53,16 +54,20 @@ moduleDecl =
5354 choice
5455 [ do try (reserved "module")
5556 return Module.None
56− , do try (reserved "effect")
57+ , do start <- getMyPosition
58+ try (reserved "effect")
5759 whitespace
5860 reserved "module"
59− return Module.Effect
60− , do reserved "foreign"
61+ end <- getMyPosition
62+ return $ Module.Effect (R.Region start end)
63+ , do start <- getMyPosition
64+ reserved "foreign"
6165 whitespace
6266 reserved "effect"
6367 whitespace
6468 reserved "module"
65− return Module.Foreign
69+ end <- getMyPosition
70+ return $ Module.Foreign (R.Region start end)
6671 ]
6772
6873 whitespace
src/Parse/Parse.hs+3−4
@@ -34,8 +34,8 @@ program pkgName table src =
3434 (Module.Source docs exports imports sourceDecls) =
3535 Module.info modul
3636
37− validDecls <-
38− Validate.declarations sourceDecls
37+ (validDecls, validEffects) <-
38+ Validate.declarations (Module.tag modul) sourceDecls
3939
4040 return $
4141 modul
@@ -45,8 +45,7 @@ program pkgName table src =
4545 exports
4646 (addDefaults pkgName imports)
4747 validDecls
48− (error "TODO")
49− (error "TODO")
48+ validEffects
5049 }
5150
5251
src/Reporting/Error/Syntax.hs+21−14
@@ -6,6 +6,7 @@ import qualified Data.Set as Set
66import qualified Text.Parsec.Error as Parsec
77import Text.PrettyPrint.ANSI.Leijen (dullyellow, hsep, text)
88
9+import qualified AST.Declaration as Decl
910import qualified Reporting.Error.Helpers as Help
1011import qualified Reporting.Render.Type as RenderType
1112import qualified Reporting.Report as Report
@@ -15,11 +16,19 @@ data Error
1516 = Parse [Parsec.Message]
1617 | BadFunctionName Int
1718 | BadPattern String
19+
1820 | CommentAfterAnnotation String
1921 | CommentOnComment
2022 | CommentOnNothing
21− | DefineDuplicate String
22− | DefineUnknown String
23+
24+ | BadDefineInNormalModule Decl.EffectType
25+ | BadDefineInEffectModule Decl.EffectType
26+ | BadDefineInForeignModule Decl.EffectType
27+ | WithInEffectDefine Decl.EffectType String
28+ | NoDefineInEffectModule
29+ | NoDefineInForeignModule
30+ | DuplicateDefines Decl.EffectType Int
31+
2332 | InfixDuplicate String
2433 | TypeWithoutDefinition String
2534 | DuplicateFieldName String
@@ -95,22 +104,20 @@ toReport _localizer err =
95104 ("This documentation comment is not followed by anything.")
96105 ( text "What is it documenting? Maybe it should just be removed?" )
97106
98− DefineDuplicate name ->
107+ DuplicateDefines effectType n ->
108+ let
109+ name =
110+ Decl.effectTypeToString effectType
111+ in
99112 Report.report
100113 "DUPLICATE DEFINE"
101114 Nothing
102− ("A module can have only one `define " ++ name ++ "` declaration.")
103− ( text "This module has two though. You should combine them or remove one." )
104−
105− DefineUnknown name ->
106− Report.report
107− "UNKNOWN DEFINE"
108− Nothing
109− ("You are trying to `define " ++ name ++ "`, but that is not recognized.")
115+ ("There can only be one `define " ++ name ++ "` per module.")
110116 ( Help.reflowParagraph $
111− "You can only define `commands` and `subscriptions` with this syntax.\
112− \ Furthermore, you must be in an `effect module` or `foreign effect module` to\
113− \ even have access to this syntax."
117+ "The `define` shown above is the last of " ++ show n ++ " in this module.\
118+ \ They all say `define "++ name ++ "`, but maybe some are supposed to define\
119+ \ something else? Could be a copy paste error. If they really are supposed\
120+ \ to define the same kind of thing, just combine them and you should be all set!"
114121 )
115122
116123 InfixDuplicate opName ->
src/Validate.hs+210−65
@@ -1,9 +1,9 @@
11{-# OPTIONS_GHC -Wall #-}
22module Validate (declarations) where
33
4+import qualified Control.Arrow as Arrow
45import Control.Monad (foldM)
56import qualified Data.Map as Map
6−import qualified Data.Maybe as Maybe
77import qualified Data.Set as Set
88import qualified Data.Foldable as F
99import qualified Data.Traversable as T
@@ -12,6 +12,7 @@ import AST.Expression.General as Expr
1212import qualified AST.Expression.Source as Source
1313import qualified AST.Expression.Valid as Valid
1414import qualified AST.Declaration as D
15+import qualified AST.Module as Module
1516import qualified AST.Pattern as Pattern
1617import qualified AST.Type as Type
1718import Elm.Utils ((|>))
@@ -59,73 +60,148 @@ collapseComments listWithComments =
5960
6061
6162
62−-- EXTRACT DEFINES
63+-- PARTITION AND VALIDATE DEFINES
6364
6465
65−data StructuredSource =
66− Src
67− { _decls :: [Commented D.Source']
68− , _cmds :: Maybe [Commented Source.Effect]
69− , _subs :: Maybe [Commented Source.Effect]
70− }
66+type Defines =
67+ Map.Map D.EffectType [A.Located [D.CommentOr (A.Located Source.Effect)]]
7168
7269
73−extractEffects :: [Commented D.SourceOrDefine] -> Result.Result wrn Error.Error StructuredSource
74−extractEffects commentedDecls =
70+partitionEffects :: [Commented D.SourceOrDefine] -> ([Commented D.Source'], Defines)
71+partitionEffects commentedDecls =
7572 case commentedDecls of
7673 [] ->
77− Result.ok (Src [] Nothing Nothing)
74+ ([], Map.empty)
7875
7976 A.A ann (D.Source decl) : rest ->
80− do restSrc <- extractEffects rest
81− return $ restSrc { _decls = A.A ann decl : _decls restSrc }
77+ Arrow.first
78+ ((:) (A.A ann decl))
79+ (partitionEffects rest)
80+
81+ A.A (region, _) (D.Define effectType commentOrEffects) : rest ->
82+ Arrow.second
83+ (Map.insertWith (++) effectType [A.A region commentOrEffects])
84+ (partitionEffects rest)
85+
86+
87+validateDefines
88+ :: Module.Tag
89+ -> Defines
90+ -> Result.Result wrn Error.Error Valid.Effects
91+validateDefines tag defines =
92+ case tag of
93+ Module.None ->
94+ do disallowLeftoverDefines Error.BadDefineInNormalModule defines
95+ return Valid.None
96+
97+ Module.Effect region ->
98+ let
99+ (maybeCmds, smallerDefines) =
100+ extractKey D.Cmd defines
101+
102+ (maybeSubs, leftovers) =
103+ extractKey D.Sub smallerDefines
104+ in
105+ do disallowLeftoverDefines Error.BadDefineInEffectModule leftovers
106+ case (maybeCmds, maybeSubs) of
107+ (Nothing, Nothing) ->
108+ Result.throw region Error.NoDefineInEffectModule
109+
110+ _ ->
111+
112+ Valid.Effects
113+ <$> validateDefineDefs D.Cmd maybeCmds validateEffects
114+ <*> validateDefineDefs D.Sub maybeSubs validateEffects
115+
116+ Module.Foreign region ->
117+ let
118+ (maybeCmds, smallerDefines) =
119+ extractKey D.ForeignCmd defines
82120
83− A.A (region, _) (D.Define name commentOrEffects) : rest ->
84− do restSrc <- extractEffects rest
85− case name of
86− "commands" ->
87− case _cmds restSrc of
88− Nothing ->
89− do effects <- collapseComments commentOrEffects
90− Result.ok $ restSrc { _cmds = Just effects }
121+ (maybeSubs, leftovers) =
122+ extractKey D.ForeignSub smallerDefines
123+ in
124+ do disallowLeftoverDefines Error.BadDefineInForeignModule leftovers
125+ case (maybeCmds, maybeSubs) of
126+ (Nothing, Nothing) ->
127+ Result.throw region Error.NoDefineInForeignModule
128+
129+ (_, _) ->
130+ Valid.ForeignEffects
131+ <$> validateDefineDefs D.ForeignCmd maybeCmds (T.traverse validateForeignCmd)
132+ <*> validateDefineDefs D.ForeignSub maybeSubs (T.traverse validateForeignSub)
133+
134+
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
139+ )
140+
141+
142+validateDefineDefs
143+ :: D.EffectType
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
149+ Nothing ->
150+ validate []
151+
152+ Just [A.A _ sourceDefs] ->
153+ validate =<< collapseComments sourceDefs
154+
155+ Just allRawDefines ->
156+ let
157+ (A.A region _) =
158+ last allRawDefines
91159
92− Just _ ->
93− Result.throw region (Error.DefineDuplicate name)
160+ errorMsg =
161+ Error.DuplicateDefines effectType (length allRawDefines)
162+ in
163+ Result.throw region errorMsg
94164
95− "subscriptions" ->
96− case _subs restSrc of
97− Nothing ->
98− do effects <- collapseComments commentOrEffects
99− Result.ok $ restSrc { _subs = Just effects }
100165
101− Just _ ->
102− Result.throw region (Error.DefineDuplicate name)
166+disallowLeftoverDefines
167+ :: (D.EffectType -> Error.Error)
168+ -> Defines
169+ -> Result.Result wrn Error.Error ()
170+disallowLeftoverDefines errorTagger leftoverDefines =
171+ case Map.toList leftoverDefines of
172+ [] ->
173+ Result.ok ()
103174
104− _ ->
105− Result.throw region (Error.DefineUnknown name)
175+ pairs ->
176+ let
177+ toErrors (key, allDefines) =
178+ map (A.map (\_ -> errorTagger key)) allDefines
179+ in
180+ Result.throwMany (concatMap toErrors pairs)
106181
107182
108183
109184-- VALIDATE STRUCTURED SOURCE
110185
111186
112−declarations :: [D.Source] -> Result.Result wrn Error.Error [D.Valid]
113−declarations sourceDecls =
114− do (Src decls cmds subs) <-
115− extractEffects =<< collapseComments sourceDecls
187+declarations
188+ :: Module.Tag
189+ -> [D.Source]
190+ -> Result.Result wrn Error.Error ([D.Valid], Valid.Effects)
191+declarations tag sourceDecls =
192+ do (decls, defines) <-
193+ partitionEffects <$> collapseComments sourceDecls
116194
117195 validDecls <-
118196 validateDecls decls
119197
120− validCmds <-
121− validateEffects (Maybe.fromMaybe [] cmds)
198+ validEffects <-
199+ validateDefines tag defines
122200
123− validSubs <-
124− validateEffects (Maybe.fromMaybe [] subs)
201+ F.traverse_ id
202+ (declDuplicates validDecls validEffects : map findBadTypeVars validDecls)
125203
126− (\_ _ -> validDecls)
127− <$> declDuplicates validDecls
128− <*> T.traverse checkDecl validDecls
204+ return (validDecls, validEffects)
129205
130206
131207
@@ -170,11 +246,11 @@ validateDeclsHelp
170246 -> Result.Result wrn Error.Error [D.Valid]
171247validateDeclsHelp maybeComment (A.A region def) decls =
172248 let
173− makeDef pat expr maybeType =
174− D.Def (Valid.Definition pat expr maybeType)
175−
176249 ann =
177250 (region, fmap A.drop maybeComment)
251+
252+ makeDef pat expr maybeType =
253+ D.Def (Valid.Definition pat expr maybeType)
178254 in
179255 case def of
180256 Source.Definition pat expr ->
@@ -203,21 +279,21 @@ validateDeclsHelp maybeComment (A.A region def) decls =
203279
204280validateEffects
205281 :: [Commented Source.Effect]
206− -> Result.Result wrn Error.Error [A.Commented Valid.Effect]
282+ -> Result.Result wrn Error.Error [A.Commented Valid.Def]
207283validateEffects effects =
208− case effects of
209− [] ->
210− Result.ok []
284+ case effects of
285+ [] ->
286+ Result.ok []
211287
212− A.A (region, maybeComment) effect : rest ->
213− validateEffectsHelp (region, fmap A.drop maybeComment) effect rest
288+ A.A (region, maybeComment) effect : rest ->
289+ validateEffectsHelp (region, fmap A.drop maybeComment) effect rest
214290
215291
216292validateEffectsHelp
217293 :: (R.Region, Maybe String)
218294 -> Source.Effect
219295 -> [Commented Source.Effect]
220− -> Result.Result wrn Error.Error [A.Commented Valid.Effect]
296+ -> Result.Result wrn Error.Error [A.Commented Valid.Def]
221297validateEffectsHelp ann effect remainingEffects =
222298 case effect of
223299 Source.With _ _ ->
@@ -225,7 +301,7 @@ validateEffectsHelp ann effect remainingEffects =
225301
226302 Source.Def pat expr ->
227303 (:)
228− <$> validateDef Valid.Def ann pat expr Nothing
304+ <$> validateDef Valid.Definition ann pat expr Nothing
229305 <*> validateEffects remainingEffects
230306
231307 Source.Type name tipe ->
@@ -236,13 +312,47 @@ validateEffectsHelp ann effect remainingEffects =
236312 A.A _ (Source.Def pat expr) : rest
237313 | Pattern.isVar name pat ->
238314 (:)
239− <$> validateDef Valid.Def ann pat expr (Just tipe)
315+ <$> validateDef Valid.Definition ann pat expr (Just tipe)
240316 <*> validateEffects rest
241317
242318 _ ->
243319 Result.throw (fst ann) (Error.TypeWithoutDefinition name)
244320
245321
322+validateForeignCmd
323+ :: Commented Source.Effect
324+ -> Result.Result wrn Error.Error (A.Commented Valid.ForeignCmd)
325+validateForeignCmd (A.A (region, maybeComment) effect) =
326+ case effect of
327+ Source.With _ _ ->
328+ Result.throw region (error "TODO")
329+
330+ Source.Def _ _ ->
331+ Result.throw region (error "TODO")
332+
333+ Source.Type name tipe ->
334+ Result.ok $
335+ A.A (region, fmap A.drop maybeComment) (Valid.Cmd name tipe)
336+
337+
338+validateForeignSub
339+ :: Commented Source.Effect
340+ -> Result.Result wrn Error.Error (A.Commented Valid.ForeignSub)
341+validateForeignSub (A.A (region, maybeComment) effect) =
342+ case effect of
343+ Source.With name expr ->
344+ do validExpr <- expression expr
345+ Result.ok $
346+ A.A (region, fmap A.drop maybeComment) (Valid.SubWith name validExpr)
347+
348+ Source.Def _ _ ->
349+ Result.throw region (error "TODO")
350+
351+ Source.Type name tipe ->
352+ Result.ok $
353+ A.A (region, fmap A.drop maybeComment) (Valid.Sub name tipe)
354+
355+
246356
247357-- VALIDATE DEFINITIONS
248358
@@ -398,8 +508,8 @@ second (value, expr) =
398508
399509
400510both
401− :: (Source.Expr, Source.Expr)
402− -> Result.Result wrn Error.Error (Valid.Expr, Valid.Expr)
511+ :: (Source.Expr, Source.Expr)
512+ -> Result.Result wrn Error.Error (Valid.Expr, Valid.Expr)
403513both (expr1, expr2) =
404514 (,) <$> expression expr1 <*> expression expr2
405515
@@ -446,13 +556,18 @@ defDuplicates patterns =
446556 |> detectDuplicates Error.DuplicateDefinition
447557
448558
449−declDuplicates :: [D.Valid] -> Result.Result wrn Error.Error ()
450−declDuplicates decls =
451− let (valueLists, typeLists) = unzip (map extractValues decls)
559+declDuplicates :: [D.Valid] -> Valid.Effects -> Result.Result wrn Error.Error ()
560+declDuplicates decls effects =
561+ let
562+ (valueLists, typeLists) =
563+ unzip (map extractValues decls)
564+
565+ effectValues =
566+ extractEffectValues effects
452567 in
453− (\_ _ -> ())
454− <$> detectDuplicates Error.DuplicateValueDeclaration (concat valueLists)
455− <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
568+ (\_ _ -> ())
569+ <$> detectDuplicates Error.DuplicateValueDeclaration (effectValues ++ concat valueLists)
570+ <*> detectDuplicates Error.DuplicateTypeDeclaration (concat typeLists)
456571
457572
458573extractValues :: D.Valid -> ([A.Located String], [A.Located String])
@@ -484,12 +599,42 @@ extractValues (A.A (region, _) decl) =
484599 )
485600
486601
602+extractEffectValues :: Valid.Effects -> [A.Located String]
603+extractEffectValues effects =
604+ case effects of
605+ Valid.None ->
606+ []
607+
608+ Valid.Effects cmds subs ->
609+ let
610+ extractNames (Valid.Definition pat _ _) =
611+ Pattern.boundVars pat
612+ in
613+ concatMap (extractNames . A.drop) (cmds ++ subs)
614+
615+ Valid.ForeignEffects cmds subs ->
616+ let
617+ extractCmdNames (A.A (region, _) (Valid.Cmd name _)) =
618+ A.A region name
619+
620+ extractSubNames (A.A (region, _) sub) =
621+ A.A region $
622+ case sub of
623+ Valid.Sub name _ ->
624+ name
625+
626+ Valid.SubWith name _ ->
627+ name
628+ in
629+ map extractCmdNames cmds ++ map extractSubNames subs
630+
631+
487632
488633-- UNBOUND TYPE VARIABLES
489634
490635
491−checkDecl :: D.Valid -> Result.Result wrn Error.Error ()
492−checkDecl (A.A (region,_) decl) =
636+findBadTypeVars :: D.Valid -> Result.Result wrn Error.Error ()
637+findBadTypeVars (A.A (region,_) decl) =
493638 case decl of
494639 D.Def _ ->
495640 return ()