1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Parse.Type (expression, unionConstructor) where
7import qualified AST.Type as Type
8import Parse.Primitives (Parser, SParser, addLocation, checkSpace, getPosition, hint, spaces, oneOf)
9import qualified Parse.Primitives as P
10import qualified Parse.Primitives.Symbol as Symbol
11import qualified Parse.Primitives.Variable as Var
12import Parse.Primitives.Whitespace (SPos, whitespace)
14import qualified Reporting.Annotation as A
15import qualified Reporting.Error.Syntax as E
16import qualified Reporting.Region as R
23term :: Parser Type.Raw
26 do start <- getPosition
39variable :: R.Position -> Parser Type.Raw
43 return (A.at start end (Type.RVar var))
50expression :: SParser Type.Raw
53 do start <- getPosition
54 (tipe1, end1, pos1) <-
57 , (,,) <$> term <*> getPosition <*> whitespace
63 (tipe2, end2, pos2) <- expression
64 let tipe = A.at start end2 (Type.RLambda tipe1 tipe2)
65 return ( tipe, end2, pos2 )
66 , return ( tipe1, end1, pos1 )
74app0 :: Parser Type.Raw
76 do start <- getPosition
77 (maybeQualifier, name) <- Var.foreignUpper
79 return $ A.at start end $
80 Type.RType (R.Region start end) maybeQualifier name []
83app :: R.Position -> SParser Type.Raw
85 do (maybeQualifier, name) <- Var.foreignUpper
86 nameEnd <- getPosition
88 (args, end, pos) <- eatArgs [] nameEnd namePos
89 let tipe = Type.RType (R.Region start nameEnd) maybeQualifier name args
90 return ( A.at start end tipe, end, pos )
93unionConstructor :: SParser (A.Located Text, [Type.Raw])
95 do start <- getPosition
97 nameEnd <- getPosition
99 (args, end, pos) <- eatArgs [] nameEnd namePos
100 return ( (A.at start nameEnd name, args), end, pos )
103eatArgs :: [Type.Raw] -> R.Position -> SPos -> SParser [Type.Raw]
104eatArgs args end pos =
108 newEnd <- getPosition
109 newSpace <- whitespace
110 eatArgs (arg:args) newEnd newSpace
111 , return ( reverse args, end, pos )
119tuple :: R.Position -> Parser Type.Raw
122 P.inContext start E.TypeTuple $
124 [ do Symbol.rightParen
126 return (A.at start end Type.RUnit)
128 (tipe, _, pos) <- expression
130 tupleEnding start tipe []
134tupleEnding :: R.Position -> Type.Raw -> [Type.Raw] -> Parser Type.Raw
135tupleEnding start firstType revTypes =
139 (tipe, _, pos) <- expression
141 tupleEnding start firstType (tipe : revTypes)
142 , do Symbol.rightParen
144 case reverse revTypes of
148 secondType : otherTypes ->
149 return $ A.at start end $
150 Type.RTuple firstType secondType otherTypes
158record :: R.Position -> Parser Type.Raw
161 P.inContext start E.TypeRecord $
164 [ do Symbol.rightCurly
166 return (A.at start end (Type.RRecord [] Nothing))
167 , do var <- addLocation Var.lower
173 fields <- chompFields [firstField]
175 return (A.at start end (Type.RRecord fields (Just (A.map Type.RVar var))))
178 (tipe, _, nextPos) <- expression
180 fields <- chompFields [(var, tipe)]
182 return (A.at start end (Type.RRecord fields Nothing))
187type Field = ( A.Located Text, Type.Raw )
190chompFields :: [Field] -> Parser [Field]
196 chompFields (f : fields)
197 , do Symbol.rightCurly
198 return (reverse fields)
204 do name <- addLocation Var.lower
208 (tipe, _, endPos) <- expression
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