1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Parse.Declaration where
7import qualified AST.Declaration as Decl
8import qualified AST.Type as Type
9import qualified Parse.Expression as Expr
10import Parse.Helpers as Help
11import qualified Parse.Type as Type
12import qualified Reporting.Annotation as A
13import qualified Reporting.Error.Syntax as E
14import qualified Reporting.Region as R
21declaration :: SParser Decl.Source
24 do start <- getPosition
38docDecl :: R.Position -> SParser Decl.Source
40 do comment <- docComment
43 return ( Decl.Comment (A.at start end comment), end, pos )
46-- TYPE ANNOTATIONS and DEFINITIONS
49defDecl :: R.Position -> SParser Decl.Source
51 do (def, end, pos) <- Expr.definition
52 let decl = A.at start end (Decl.Def def)
53 return ( Decl.Whatever decl, end, pos )
57-- TYPE ALIAS and UNION TYPES
60typeDecl :: R.Position -> SParser Decl.Source
66 inContext start E.TypeAlias $
68 (name, args) <- nameArgsEquals
69 (tipe, end, pos) <- Type.expression
70 let decl = A.at start end (Decl.Alias (Decl.Type name args tipe))
71 return ( Decl.Whatever decl, end, pos )
72 , inContext start E.TypeUnion $
73 do (name, args) <- nameArgsEquals
74 (firstCtor, firstEnd, firstSpace) <- Type.unionConstructor
75 (ctors, end, pos) <- chompConstructors [firstCtor] firstEnd firstSpace
76 let decl = A.at start end (Decl.Union (Decl.Type name args ctors))
77 return ( Decl.Whatever decl, end, pos )
81nameArgsEquals :: Parser (Text, [Text])
85 nameArgsEqualsHelp name []
88nameArgsEqualsHelp :: Text -> [Text] -> Parser (Text, [Text])
89nameArgsEqualsHelp name args =
93 nameArgsEqualsHelp name (arg:args)
96 return ( name, reverse args )
100chompConstructors :: [(Text, [Type.Raw])] -> R.Position -> SPos -> SParser [(Text, [Type.Raw])]
101chompConstructors ctors end pos =
106 (ctor, newEnd, newSpace) <- Type.unionConstructor
107 chompConstructors (ctor:ctors) newEnd newSpace
108 , return ( reverse ctors, end, pos )
116infixDecl :: R.Position -> SParser Decl.Source
119 [ do keyword "infixl"
120 inContext start E.Infix $ infixDeclHelp start Decl.Left
121 , do keyword "infixr"
122 inContext start E.Infix $ infixDeclHelp start Decl.Right
124 inContext start E.Infix $ infixDeclHelp start Decl.Non
128infixDeclHelp :: R.Position -> Decl.Assoc -> SParser Decl.Source
129infixDeclHelp start assoc =
136 let decl = A.at start end (Decl.Fixity (Decl.Infix op assoc n))
137 return ( Decl.Whatever decl, end, pos )
144portDecl :: R.Position -> SParser Decl.Source
147 inContext start E.Port $
153 (tipe, end, pos) <- Type.expression
154 let decl = A.at start end (Decl.Port name tipe)
155 return ( Decl.Whatever decl, end, pos )
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