1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
9import Control.Applicative (liftA2)
10import Control.Monad (forM_)
11import qualified Data.Map as Map
12import Data.Text (Text)
14import qualified AST.Source as Src
15import qualified AST.Valid as Valid
16import qualified Elm.Name as N
17import qualified Reporting.Annotation as A
18import qualified Reporting.Error.Syntax as Error
19import qualified Reporting.Region as R
20import qualified Reporting.Result as Result
28 Result.Result i w Error.Error a
31validate :: Src.Module [Src.Decl] -> Result i w Valid.Module
32validate (Src.Module header imports srcDecls) =
33 do (Stuff decls unions aliases binops ports docs) <- validateDecls srcDecls
36 return $ Valid.defaultModule docs imports decls unions aliases binops
38 Just (Src.Header name srcEffects exports overview) ->
39 do effects <- validateEffects srcEffects ports
40 return $ Valid.Module name overview docs exports imports decls unions aliases binops effects
44-- VALIDATE DECLARATIONS
49 { _decls :: [A.Located Valid.Decl]
50 , _unions :: [Valid.Union]
51 , _aliases :: [Valid.Alias]
52 , _binops :: [Valid.Binop]
53 , _ports :: [Valid.Port]
54 , _docs :: Map.Map N.Name Text
58validateDecls :: [Src.Decl] -> Result i w Stuff
60 vsdHelp decls (Stuff [] [] [] [] [] Map.empty)
63vsdHelp :: [Src.Decl] -> Stuff -> Result i w Stuff
69 A.At region decl : otherDecls ->
71 Src.Union name tvars ctors ->
72 do let union = Valid.Union name tvars ctors
73 vsdHelp otherDecls $ stuff { _unions = union : _unions stuff }
75 Src.Alias name tvars tipe ->
76 do let alias = Valid.Alias name tvars tipe
77 vsdHelp otherDecls $ stuff { _aliases = alias : _aliases stuff }
79 Src.Binop op assoc prec val ->
80 do let binop = Valid.Binop op assoc prec val
81 vsdHelp otherDecls $ stuff { _binops = binop : _binops stuff }
84 do let port_ = Valid.Port name tipe
85 vsdHelp otherDecls $ stuff { _ports = port_ : _ports stuff }
88 validateDocs docs otherDecls stuff
90 Src.Annotation (A.At _ name) tipe ->
91 validateAnnotation region name tipe otherDecls stuff
93 Src.Definition name args body ->
94 do validBody <- expression body
95 let validDecl = A.At region (Valid.Decl name args validBody Nothing)
96 vsdHelp otherDecls $ stuff { _decls = validDecl : _decls stuff }
103validateDocs :: Text -> [Src.Decl] -> Stuff -> Result i w Stuff
104validateDocs docs decls stuff =
107 error "TODO no docs on nothing"
110 do name <- getNameForDocs decl
111 vsdHelp decls $ stuff { _docs = Map.insert name docs (_docs stuff) }
114getNameForDocs :: Src.Decl_ -> Result i w N.Name
117 Src.Union (A.At _ name) _ _ ->
120 Src.Alias (A.At _ name) _ _ ->
124 error "TODO no docs on binop"
127 error "TODO no docs on ports"
130 error "TODO no docs on docs"
132 Src.Annotation (A.At _ name) _ ->
135 Src.Definition (A.At _ name) _ _ ->
140-- VALIDATE ANNOTATION
143validateAnnotation :: R.Region -> N.Name -> Src.Type -> [Src.Decl] -> Stuff -> Result i w Stuff
144validateAnnotation annRegion annotationName tipe decls stuff =
147 error "TODO no attotations on nothing"
149 A.At defRegion decl : otherDecls ->
151 Src.Definition name@(A.At _ definitionName) args body ->
152 if annotationName == definitionName then
153 do validBody <- expression body
154 let region = R.merge annRegion defRegion
155 let validDecl = A.At region (Valid.Decl name args validBody (Just tipe))
156 vsdHelp otherDecls $ stuff { _decls = validDecl : _decls stuff }
159 error "TODO annotation does not match following definition"
162 error "TODO annotation needs to be on a definition"
166-- VALIDATE EXPRESSIONS
169expression :: Src.Expr -> Result i w Valid.Expr
170expression (A.At region sourceExpression) =
172 case sourceExpression of
173 Src.Var prefix name ->
174 pure (Valid.Var prefix name)
176 Src.Lambda pattern body ->
177 Valid.Lambda pattern <$> expression body
183 Valid.Negate <$> expression expr
185 Src.Binops ops lastExpr ->
187 <$> traverse (\(expr,op) -> (,) <$> expression expr <*> pure op) ops
188 <*> expression lastExpr
190 Src.Case expr branches ->
193 <*> traverse (traverse expression) branches
205 pure (Valid.Float float)
208 Valid.List <$> traverse expression exprs
210 Src.Call func args ->
213 <*> traverse expression args
215 Src.If branches finally ->
217 <$> traverse both branches
218 <*> expression finally
220 Src.Accessor field ->
221 pure (Valid.Accessor field)
223 Src.Access record field ->
225 <$> expression record
228 Src.Update record fields ->
229 Valid.Update record <$> traverse (traverse expression) fields
232 Valid.Record <$> traverse (traverse expression) fields
241 <*> traverse expression cs
248 Src.Shader uid src gltipe ->
249 pure (Valid.Shader uid src gltipe)
252both :: (Src.Expr, Src.Expr) -> Result i w (Valid.Expr, Valid.Expr)
254 liftA2 (,) (expression a) (expression b)
258-- VALIDATE DEFINITIONS
261definitions :: [A.Located Src.Def] -> Result i w [Valid.Def]
262definitions sourceDefs =
267 A.At region (Src.Destruct pattern expr) : otherDefs ->
269 <$> validateDestruct region pattern expr
270 <*> definitions otherDefs
272 A.At region (Src.Define name args expr) : otherDefs ->
274 <$> validateDefinition region name args expr Nothing
275 <*> definitions otherDefs
277 A.At annRegion (Src.Annotate annotationName tipe) : otherDefs ->
279 A.At defRegion (Src.Define name@(A.At _ definitionName) args expr) : otherOtherDefs
280 | definitionName == annotationName ->
282 <$> validateDefinition (R.merge annRegion defRegion) name args expr (Just tipe)
283 <*> definitions otherOtherDefs
286 Result.throw (Error.TypeWithoutDefinition annRegion annotationName)
289validateDefinition :: R.Region -> A.Located Text -> [Src.Pattern] -> Src.Expr -> Maybe Src.Type -> Result i w Valid.Def
290validateDefinition region name args expr maybeType =
291 do validExpr <- expression expr
292 return $ Valid.Define region name args validExpr maybeType
295validateDestruct :: R.Region -> Src.Pattern -> Src.Expr -> Result i w Valid.Def
296validateDestruct region pattern expr =
297 Valid.Destruct region pattern <$> expression expr
304validateEffects :: Src.Effects -> [Valid.Port] -> Result i w Valid.Effects
305validateEffects effects ports =
309 return Valid.NoEffects
312 return (Valid.Ports ports)
314 Src.Manager region manager ->
316 return $ Valid.Manager region $
328noPorts :: [Valid.Port] -> Result i w ()
330 forM_ ports $ \(Valid.Port (A.At region name) _) ->
331 Result.throw (Error.UnexpectedPort 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