1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Module
8import qualified Data.Graph as Graph
9import qualified Data.Map as Map
10import qualified Data.Set as Set
12import qualified AST.Expression.Canonical as Can
13import qualified AST.Expression.Valid as Valid
14import qualified AST.Module.Name as ModuleName
15import qualified AST.Type as Type
16import qualified Canonicalize.Environment as Env
17import qualified Canonicalize.Expression as Expr
18import qualified Canonicalize.Pattern as Pattern
19import qualified Canonicalize.Type as Type
20import qualified Elm.Interface as I
21import qualified Elm.Name as N
22import qualified Elm.Package as Pkg
23import qualified Reporting.Annotation as A
24import qualified Reporting.Error.Canonicalize as Error
25import qualified Reporting.Region as R
26import qualified Reporting.Result as Result
27import qualified Reporting.Warning as Warning
35 Result.Result () Warning.Warning Error.Error a
44 -> Map.Map ModuleName.Raw ModuleName.Canonical
48canonicalize pkg importDict interfaces module_ =
49 do env <- Env.create pkg importDict interfaces module_
50 let (Valid.Module name _ _ _ _ decls unions aliases binops _) = module_
51 Can.Module (ModuleName.Canonical pkg name)
53 <*> error "TODO imports"
54 <*> canonicalizeDecls env decls
55 <*> (Map.fromList <$> traverse (canonicalizeUnion env) unions)
56 <*> (Map.fromList <$> traverse (canonicalizeAlias env) aliases)
57 <*> return (Map.fromList (map canonicalizeBinop binops))
58 <*> error "TODO effects"
65canonicalizeAlias :: Env.Env -> Valid.Alias -> Result ( N.Name, Can.Alias )
66canonicalizeAlias env (Valid.Alias (A.A _ name) args tipe) =
67 do ctipe <- Type.canonicalize env tipe
68 return (name, Can.Alias (map A.drop args) ctipe)
75canonicalizeUnion :: Env.Env -> Valid.Union -> Result ( N.Name, Can.Union )
76canonicalizeUnion env (Valid.Union (A.A _ name) args ctors) =
78 canonicalizeCtor (A.A _ ctor, tipes) =
79 do ctipes <- traverse (Type.canonicalize env) tipes
82 do cctors <- traverse canonicalizeCtor ctors
83 return ( name, Can.Union (map A.drop args) cctors )
90canonicalizeBinop :: Valid.Binop -> ( N.Name, Can.Binop )
91canonicalizeBinop (Valid.Binop (A.A _ op) associativity precedence func) =
92 ( op, Can.Binop_ associativity precedence func )
96-- CANONICALIZE DECLARATIONS
99canonicalizeDecls :: Env.Env -> [A.Located Valid.Decl] -> Result Can.Decls
100canonicalizeDecls env decls =
101 do nodes <- traverse (toNode env) decls
102 detectCycles (Graph.stronglyConnComp nodes)
105detectCycles :: [Graph.SCC Decl] -> Result Can.Decls
109 Result.ok Can.SaveTheEnvironment
113 Graph.AcyclicSCC decl ->
114 Can.Declare (toCanDecl decl)
115 <$> detectCycles otherSccs
117 Graph.CyclicSCC [] ->
118 detectCycles otherSccs
120 Graph.CyclicSCC (decl:decls) ->
121 do detectBadCycles decl decls
122 Can.DeclareRec (toCanDecl decl) (map toCanDecl decls)
123 <$> detectCycles otherSccs
126toNode :: Env.Env -> A.Located Valid.Decl -> Result (Decl, N.Name, [N.Name])
127toNode env (A.A region (Valid.Decl name@(A.A _ key) args body tipe)) =
130 do ctipe <- traverse (Type.canonicalize env) tipe
131 (cbody, freeLocals) <- Expr.removeLocals Map.empty $ Expr.canonicalize env body
132 return (Value region name cbody ctipe, key, Set.toList freeLocals)
135 do ctipe <- traverse (Type.canonicalize env) tipe
136 cargs@(Can.Args _ destructors) <- Pattern.canonicalizeArgs env args
137 newEnv <- Env.addLocals destructors env
138 (cbody, freeLocals) <- Expr.removeLocals destructors $ Expr.canonicalize newEnv body
139 return (Function key cargs cbody ctipe, key, Set.toList freeLocals)
143 = Value R.Region (A.Located N.Name) Can.Expr (Maybe Type.Canonical)
144 | Function N.Name Can.Args Can.Expr (Maybe Type.Canonical)
147toCanDecl :: Decl -> Can.Decl
150 Value _ (A.A _ name) body tipe ->
151 Can.Value name body tipe
153 Function name args body tipe ->
154 Can.Function name args body tipe
157detectBadCycles :: Decl -> [Decl] -> Result ()
158detectBadCycles decl decls =
159 case traverse detectBadCyclesHelp (decl:decls) of
168 (declRegion, A.A region name) : otherInfo ->
169 let otherNames = map (A.drop . snd) otherInfo in
170 Result.throw declRegion (Error.RecursiveDecl region name otherNames)
173detectBadCyclesHelp :: Decl -> Maybe (R.Region, A.Located N.Name)
174detectBadCyclesHelp decl =
176 Value region 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