1{-# OPTIONS_GHC -Wall #-}
2module Nitpick.TopLevelTypes (topLevelTypes) where
4import Prelude hiding (maybe)
5import qualified Data.Foldable as F
6import qualified Data.Map as Map
8import qualified AST.Expression.Valid as Valid
9import qualified AST.Declaration as Decl
10import qualified AST.Module.Name as ModuleName
11import qualified AST.Pattern as P
12import qualified AST.Type as Type
13import qualified AST.Variable as Var
14import qualified Elm.Package as Pkg
15import qualified Reporting.Annotation as A
16import qualified Reporting.Error.Type as Error
17import qualified Reporting.Result as Result
18import qualified Reporting.Warning as Warning
22 :: Map.Map String Type.Canonical
24 -> Result.Result Warning.Warning Error.Error ()
25topLevelTypes typeEnv validDecls =
26 do F.traverse_ (warnMissingAnnotation typeEnv) validDecls
27 checkMainType typeEnv validDecls
33 :: Map.Map String Type.Canonical
35 -> Result.Result Warning.Warning Error.Error ()
36warnMissingAnnotation typeEnv (A.A (region,_) decl) =
38 Decl.Definition (Valid.Definition (A.A _ (P.Var name)) _ Nothing) ->
39 case Map.lookup name typeEnv of
43 Result.warn region (Warning.MissingTypeAnnotation name tipe)
51 :: Map.Map String Type.Canonical
53 -> Result.Result w Error.Error ()
54checkMainType typeEnv decls =
56 A.A (region,_) (Decl.Definition (Valid.Definition (A.A _ (P.Var "main")) _ _)) : _ ->
57 case Map.lookup "main" typeEnv of
62 let tipe = Type.deepDealias typeOfMain
64 if tipe `elem` validMainTypes
66 else Result.throw region (Error.BadMain typeOfMain)
69 checkMainType typeEnv remainingDecls
75validMainTypes :: [Type.Canonical]
86 Type.Type (Var.fromModule virtualDom "Node")
89virtualDom :: ModuleName.Canonical
91 ModuleName.Canonical (Pkg.Name "evancz" "virtual-dom") ["VirtualDom"]
94element :: Type.Canonical
96 core ["Graphics","Element"] "Element"
99signal :: Type.Canonical -> Type.Canonical
101 Type.App (core ["Signal"] "Signal") [ tipe ]
104core :: [String] -> String -> Type.Canonical
106 Type.Type (Var.inCore home name)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list