@@ -0,0 +1,115 @@
1+{-# OPTIONS_GHC -Wall #-}
2+module Nitpick.TopLevelTypes (topLevelTypes) where
4+import Prelude hiding (maybe)
5+import qualified Data.Foldable as F
6+import qualified Data.Map as Map
8+import qualified AST.Expression.Valid as Valid
9+import qualified AST.Declaration as Decl
10+import qualified AST.Pattern as P
11+import qualified AST.Type as Type
12+import qualified AST.Variable as Var
13+import qualified Reporting.Annotation as A
14+import qualified Reporting.Error.Type as Error
15+import qualified Reporting.Result as Result
16+import qualified Reporting.Warning as Warning
20+ :: Map.Map String Type.Canonical
22+ -> Result.Result Warning.Warning Error.Error ()
23+topLevelTypes typeEnv validDecls =
24+ do F.traverse_ (warnMissingAnnotation typeEnv) validDecls
25+ checkMainType typeEnv validDecls
28+-- MISSING ANNOTATIONS
31+ :: Map.Map String Type.Canonical
33+ -> Result.Result Warning.Warning Error.Error ()
34+warnMissingAnnotation typeEnv (A.A region decl) =
36+ Decl.Definition (Valid.Definition (A.A _ (P.Var name)) _ Nothing) ->
37+ case Map.lookup name typeEnv of
41+ Result.warn region (Warning.MissingTypeAnnotation name tipe)
49+ :: Map.Map String Type.Canonical
51+ -> Result.Result w Error.Error ()
52+checkMainType typeEnv decls =
54+ A.A region (Decl.Definition (Valid.Definition (A.A _ (P.Var "main")) _ _)) : _ ->
55+ case Map.lookup "main" typeEnv of
60+ let tipe = Type.deepDealias typeOfMain
62+ if tipe `elem` validMainTypes
64+ else Result.throw region (Error.BadMain typeOfMain)
66+ _ : remainingDecls ->
67+ checkMainType typeEnv remainingDecls
73+validMainTypes :: [Type.Canonical]
81+ fromModule :: [String] -> String -> Type.Canonical
82+ fromModule home name =
83+ Type.Type (Var.fromModule home name)
86+ fromModule ["VirtualDom"] "Node"
89+ Type.App (fromModule ["Signal"] "Signal") [ tipe ]
93+ Type.Type (Var.builtin name)
96+ Type.App (fromModule ["Maybe"] "Maybe") [ tipe ]
99+ [ ("element", fromModule ["Graphics","Element"] "ElementPrim")
102+ [ ("click" , builtin "_Tuple0")
103+ , ("color" , maybe (fromModule ["Color"] "Color"))
104+ , ("height" , builtin "Int")
105+ , ("hover" , builtin "_Tuple0")
106+ , ("href" , builtin "String")
107+ , ("id" , builtin "Int")
108+ , ("opacity", builtin "Float")
109+ , ("tag" , builtin "String")
110+ , ("width" , builtin "Int")