@@ -33,8 +33,8 @@ import Language.PureScript.Environment
3333import Language.PureScript.Names
3434import Language.PureScript.Sugar.TypeClasses (typeClassMemberName, superClassDictionaryNames)
3535import Language.PureScript.Types
36+import Language.PureScript.Parser.Lexer
3637import qualified Language.PureScript.AST as A
37−import qualified Language.PureScript.Constants as C
3838
3939-- |
4040-- Desugars a module from AST to CoreFn representation.
@@ -44,7 +44,7 @@ moduleToCoreFn env (A.Module mn decls (Just exps)) =
4444 let imports = nub $ mapMaybe importToCoreFn decls ++ findQualModules decls
4545 exps' = nub $ concatMap exportToCoreFn exps
4646 externs = nub $ mapMaybe externToCoreFn decls
47− decls' = concatMap (declToCoreFn env Nothing) decls
47+ decls' = concatMap (declToCoreFn env Nothing []) decls
4848 in Module mn imports exps' externs decls'
4949moduleToCoreFn _ (A.Module{}) =
5050 error "Module exports were not elaborated before moduleToCoreFn"
@@ -63,7 +63,7 @@ findQualModules decls =
6363--
6464importToCoreFn :: A.Declaration -> Maybe ModuleName
6565importToCoreFn (A.ImportDeclaration name _ _) = Just name
66−importToCoreFn (A.PositionedDeclaration _ d) = importToCoreFn d
66+importToCoreFn (A.PositionedDeclaration _ _ d) = importToCoreFn d
6767importToCoreFn _ = Nothing
6868
6969-- |
@@ -72,7 +72,7 @@ importToCoreFn _ = Nothing
7272externToCoreFn :: A.Declaration -> Maybe ForeignDecl
7373externToCoreFn (A.ExternDeclaration _ name js ty) = Just (name, js, ty)
7474externToCoreFn (A.ExternInstanceDeclaration name _ _ _) = Just (name, Nothing, tyObject)
75−externToCoreFn (A.PositionedDeclaration _ d) = externToCoreFn d
75+externToCoreFn (A.PositionedDeclaration _ _ d) = externToCoreFn d
7676externToCoreFn _ = Nothing
7777
7878-- |
@@ -85,134 +85,134 @@ exportToCoreFn (A.TypeRef _ (Just dctors)) = map properToIdent dctors
8585exportToCoreFn (A.ValueRef name) = [name]
8686exportToCoreFn (A.TypeClassRef name) = [properToIdent name]
8787exportToCoreFn (A.TypeInstanceRef name) = [name]
88−exportToCoreFn (A.PositionedDeclarationRef _ d) = exportToCoreFn d
88+exportToCoreFn (A.PositionedDeclarationRef _ _ d) = exportToCoreFn d
8989exportToCoreFn _ = []
9090
9191-- |
9292-- Desugars member declarations from AST to CoreFn representation.
9393--
94−declToCoreFn :: Environment -> Maybe SourceSpan -> A.Declaration -> [Bind Ann]
95−declToCoreFn _ ss (A.DataDeclaration Newtype _ _ [(ctor, _)]) =
94+declToCoreFn :: Environment -> Maybe SourceSpan -> [Comment] -> A.Declaration -> [Bind Ann]
95+declToCoreFn _ ss com (A.DataDeclaration Newtype _ _ [(ctor, _)]) =
9696 [NonRec (properToIdent ctor) $
97− Abs (ss, Nothing, Just IsNewtype) (Ident "x") (Var nullAnn $ Qualified Nothing (Ident "x"))]
98−declToCoreFn _ _ d@(A.DataDeclaration Newtype _ _ _) =
97+ Abs (ss, com, Nothing, Just IsNewtype) (Ident "x") (Var nullAnn $ Qualified Nothing (Ident "x"))]
98+declToCoreFn _ _ _ d@(A.DataDeclaration Newtype _ _ _) =
9999 error $ "Found newtype with multiple constructors: " ++ show d
100−declToCoreFn _ ss (A.DataDeclaration Data tyName _ ctors) =
100+declToCoreFn _ ss com (A.DataDeclaration Data tyName _ ctors) =
101101 flip map ctors $ \(ctor, tys) ->
102− NonRec (properToIdent ctor) $ Constructor (ss, Nothing, Nothing) tyName ctor (length tys)
103−declToCoreFn env ss (A.DataBindingGroupDeclaration ds) = concatMap (declToCoreFn env ss) ds
104−declToCoreFn env ss (A.ValueDeclaration name _ _ (Right e)) =
105− [NonRec name (exprToCoreFn env ss Nothing e)]
106−declToCoreFn env ss (A.BindingGroupDeclaration ds) =
107− [Rec $ map (\(name, _, e) -> (name, exprToCoreFn env ss Nothing e)) ds]
108−declToCoreFn _ ss (A.TypeClassDeclaration name _ supers members) =
109− [NonRec (properToIdent name) $ mkTypeClassConstructor ss supers members]
110−declToCoreFn env _ (A.PositionedDeclaration ss d) =
111− declToCoreFn env (Just ss) d
112−declToCoreFn _ _ _ = []
102+ NonRec (properToIdent ctor) $ Constructor (ss, com, Nothing, Nothing) tyName ctor (length tys)
103+declToCoreFn env ss _ (A.DataBindingGroupDeclaration ds) = concatMap (declToCoreFn env ss []) ds
104+declToCoreFn env ss com (A.ValueDeclaration name _ _ (Right e)) =
105+ [NonRec name (exprToCoreFn env ss com Nothing e)]
106+declToCoreFn env ss _ (A.BindingGroupDeclaration ds) =
107+ [Rec $ map (\(name, _, e) -> (name, exprToCoreFn env ss [] Nothing e)) ds]
108+declToCoreFn _ ss com (A.TypeClassDeclaration name _ supers members) =
109+ [NonRec (properToIdent name) $ mkTypeClassConstructor ss com supers members]
110+declToCoreFn env _ com (A.PositionedDeclaration ss com1 d) =
111+ declToCoreFn env (Just ss) (com ++ com1) d
112+declToCoreFn _ _ _ _ = []
113113
114114-- |
115115-- Makes a typeclass dictionary constructor function. The returned expression
116116-- is a function that accepts the superclass instances and member
117117-- implementations and returns a record for the instance dictionary.
118118--
119−mkTypeClassConstructor :: Maybe SourceSpan -> [Constraint] -> [A.Declaration] -> Expr Ann
120−mkTypeClassConstructor ss [] [] = Literal (ss, Nothing, Just IsTypeClassConstructor) (ObjectLiteral [])
121−mkTypeClassConstructor ss supers members =
119+mkTypeClassConstructor :: Maybe SourceSpan -> [Comment] -> [Constraint] -> [A.Declaration] -> Expr Ann
120+mkTypeClassConstructor ss com [] [] = Literal (ss, com, Nothing, Just IsTypeClassConstructor) (ObjectLiteral [])
121+mkTypeClassConstructor ss com supers members =
122122 let args@(a:as) = sort $ map typeClassMemberName members ++ superClassDictionaryNames supers
123123 props = [ (arg, Var nullAnn $ Qualified Nothing (Ident arg)) | arg <- args ]
124124 dict = Literal nullAnn (ObjectLiteral props)
125− in Abs (ss, Nothing, Just IsTypeClassConstructor)
125+ in Abs (ss, com, Nothing, Just IsTypeClassConstructor)
126126 (Ident a)
127127 (foldr (Abs nullAnn . Ident) dict as)
128128
129129-- |
130130-- Desugars expressions from AST to CoreFn representation.
131131--
132−exprToCoreFn :: Environment -> Maybe SourceSpan -> Maybe Type -> A.Expr -> Expr Ann
133−exprToCoreFn _ ss ty (A.NumericLiteral v) =
134− Literal (ss, ty, Nothing) (NumericLiteral v)
135−exprToCoreFn _ ss ty (A.StringLiteral v) =
136− Literal (ss, ty, Nothing) (StringLiteral v)
137−exprToCoreFn _ ss ty (A.BooleanLiteral v) =
138− Literal (ss, ty, Nothing) (BooleanLiteral v)
139−exprToCoreFn env ss ty (A.ArrayLiteral vs) =
140− Literal (ss, ty, Nothing) (ArrayLiteral $ map (exprToCoreFn env ss Nothing) vs)
141−exprToCoreFn env ss ty (A.ObjectLiteral vs) =
142− Literal (ss, ty, Nothing) (ObjectLiteral $ map (second (exprToCoreFn env ss Nothing)) vs)
143−exprToCoreFn env ss ty (A.Accessor name v) =
144− Accessor (ss, ty, Nothing) name (exprToCoreFn env ss Nothing v)
145−exprToCoreFn env ss ty (A.ObjectUpdate obj vs) =
146− ObjectUpdate (ss, ty, Nothing) (exprToCoreFn env ss Nothing obj) $ map (second (exprToCoreFn env ss Nothing)) vs
147−exprToCoreFn env ss ty (A.Abs (Left name) v) =
148− Abs (ss, ty, Nothing) name (exprToCoreFn env ss Nothing v)
149−exprToCoreFn _ _ _ (A.Abs _ _) =
132+exprToCoreFn :: Environment -> Maybe SourceSpan -> [Comment] -> Maybe Type -> A.Expr -> Expr Ann
133+exprToCoreFn _ ss com ty (A.NumericLiteral v) =
134+ Literal (ss, com, ty, Nothing) (NumericLiteral v)
135+exprToCoreFn _ ss com ty (A.StringLiteral v) =
136+ Literal (ss, com, ty, Nothing) (StringLiteral v)
137+exprToCoreFn _ ss com ty (A.BooleanLiteral v) =
138+ Literal (ss, com, ty, Nothing) (BooleanLiteral v)
139+exprToCoreFn env ss com ty (A.ArrayLiteral vs) =
140+ Literal (ss, com, ty, Nothing) (ArrayLiteral $ map (exprToCoreFn env ss [] Nothing) vs)
141+exprToCoreFn env ss com ty (A.ObjectLiteral vs) =
142+ Literal (ss, com, ty, Nothing) (ObjectLiteral $ map (second (exprToCoreFn env ss [] Nothing)) vs)
143+exprToCoreFn env ss com ty (A.Accessor name v) =
144+ Accessor (ss, com, ty, Nothing) name (exprToCoreFn env ss [] Nothing v)
145+exprToCoreFn env ss com ty (A.ObjectUpdate obj vs) =
146+ ObjectUpdate (ss, com, ty, Nothing) (exprToCoreFn env ss [] Nothing obj) $ map (second (exprToCoreFn env ss [] Nothing)) vs
147+exprToCoreFn env ss com ty (A.Abs (Left name) v) =
148+ Abs (ss, com, ty, Nothing) name (exprToCoreFn env ss [] Nothing v)
149+exprToCoreFn _ _ _ _ (A.Abs _ _) =
150150 error "Abs with Binder argument was not desugared before exprToCoreFn"
151−exprToCoreFn env ss ty (A.App v1 v2) =
152− App (ss, ty, Nothing) (exprToCoreFn env ss Nothing v1) (exprToCoreFn env ss Nothing v2)
153−exprToCoreFn _ ss ty (A.Var ident) =
154− Var (ss, ty, Nothing) ident
155−exprToCoreFn env ss ty (A.IfThenElse v1 v2 v3) =
156− Case (ss, ty, Nothing) [exprToCoreFn env ss Nothing v1]
151+exprToCoreFn env ss com ty (A.App v1 v2) =
152+ App (ss, com, ty, Nothing) (exprToCoreFn env ss [] Nothing v1) (exprToCoreFn env ss [] Nothing v2)
153+exprToCoreFn _ ss com ty (A.Var ident) =
154+ Var (ss, com, ty, Nothing) ident
155+exprToCoreFn env ss com ty (A.IfThenElse v1 v2 v3) =
156+ Case (ss, com, ty, Nothing) [exprToCoreFn env ss [] Nothing v1]
157157 [ CaseAlternative [LiteralBinder nullAnn $ BooleanLiteral True]
158− (Right $ exprToCoreFn env Nothing Nothing v2)
158+ (Right $ exprToCoreFn env Nothing [] Nothing v2)
159159 , CaseAlternative [LiteralBinder nullAnn $ BooleanLiteral False]
160− (Right $ exprToCoreFn env Nothing Nothing v3) ]
161−exprToCoreFn env ss ty (A.Constructor name) =
162− Var (ss, ty, Just $ getConstructorMeta env name) $ fmap properToIdent name
163−exprToCoreFn env ss ty (A.Case vs alts) =
164− Case (ss, ty, Nothing) (map (exprToCoreFn env ss Nothing) vs) (map (altToCoreFn env ss) alts)
165−exprToCoreFn env ss _ (A.TypedValue _ v ty) =
166− exprToCoreFn env ss (Just ty) v
167−exprToCoreFn env ss ty (A.Let ds v) =
168− Let (ss, ty, Nothing) (concatMap (declToCoreFn env ss) ds) (exprToCoreFn env ss Nothing v)
169−exprToCoreFn env ss ty (A.TypeClassDictionaryConstructorApp name (A.TypedValue _ (A.ObjectLiteral vs) _)) =
170− let args = map (exprToCoreFn env ss Nothing . snd) $ sortBy (compare `on` fst) vs
171− ctor = Var (ss, Nothing, Just IsTypeClassConstructor) (fmap properToIdent name)
172− in foldl (App (ss, Nothing, Nothing)) ctor args
173−exprToCoreFn env _ ty (A.PositionedValue ss v) =
174− exprToCoreFn env (Just ss) ty v
175−exprToCoreFn _ _ _ e =
160+ (Right $ exprToCoreFn env Nothing [] Nothing v3) ]
161+exprToCoreFn env ss com ty (A.Constructor name) =
162+ Var (ss, com, ty, Just $ getConstructorMeta env name) $ fmap properToIdent name
163+exprToCoreFn env ss com ty (A.Case vs alts) =
164+ Case (ss, com, ty, Nothing) (map (exprToCoreFn env ss [] Nothing) vs) (map (altToCoreFn env ss) alts)
165+exprToCoreFn env ss com _ (A.TypedValue _ v ty) =
166+ exprToCoreFn env ss com (Just ty) v
167+exprToCoreFn env ss com ty (A.Let ds v) =
168+ Let (ss, com, ty, Nothing) (concatMap (declToCoreFn env ss []) ds) (exprToCoreFn env ss [] Nothing v)
169+exprToCoreFn env ss com _ (A.TypeClassDictionaryConstructorApp name (A.TypedValue _ (A.ObjectLiteral vs) _)) =
170+ let args = map (exprToCoreFn env ss [] Nothing . snd) $ sortBy (compare `on` fst) vs
171+ ctor = Var (ss, [], Nothing, Just IsTypeClassConstructor) (fmap properToIdent name)
172+ in foldl (App (ss, com, Nothing, Nothing)) ctor args
173+exprToCoreFn env _ com ty (A.PositionedValue ss com1 v) =
174+ exprToCoreFn env (Just ss) (com ++ com1) ty v
175+exprToCoreFn _ _ _ _ e =
176176 error $ "Unexpected value in exprToCoreFn: " ++ show e
177177
178178-- |
179179-- Desugars case alternatives from AST to CoreFn representation.
180180--
181181altToCoreFn :: Environment -> Maybe SourceSpan -> A.CaseAlternative -> CaseAlternative Ann
182−altToCoreFn env ss (A.CaseAlternative bs vs) = CaseAlternative (map (binderToCoreFn env ss) bs) (go vs)
182+altToCoreFn env ss (A.CaseAlternative bs vs) = CaseAlternative (map (binderToCoreFn env ss []) bs) (go vs)
183183 where
184184 go :: Either [(A.Guard, A.Expr)] A.Expr -> Either [(Guard Ann, Expr Ann)] (Expr Ann)
185− go (Left ges) = Left $ map (exprToCoreFn env ss Nothing *** exprToCoreFn env ss Nothing) ges
186− go (Right e) = Right (exprToCoreFn env ss Nothing e)
185+ go (Left ges) = Left $ map (exprToCoreFn env ss [] Nothing *** exprToCoreFn env ss [] Nothing) ges
186+ go (Right e) = Right (exprToCoreFn env ss [] Nothing e)
187187
188188-- |
189189-- Desugars case binders from AST to CoreFn representation.
190190--
191−binderToCoreFn :: Environment -> Maybe SourceSpan -> A.Binder -> Binder Ann
192−binderToCoreFn _ ss (A.NullBinder) =
193− NullBinder (ss, Nothing, Nothing)
194−binderToCoreFn _ ss (A.BooleanBinder b) =
195− LiteralBinder (ss, Nothing, Nothing) (BooleanLiteral b)
196−binderToCoreFn _ ss (A.StringBinder s) =
197− LiteralBinder (ss, Nothing, Nothing) (StringLiteral s)
198−binderToCoreFn _ ss (A.NumberBinder n) =
199− LiteralBinder (ss, Nothing, Nothing) (NumericLiteral n)
200−binderToCoreFn _ ss (A.VarBinder name) =
201− VarBinder (ss, Nothing, Nothing) name
202−binderToCoreFn env ss (A.ConstructorBinder dctor@(Qualified mn _) bs) =
191+binderToCoreFn :: Environment -> Maybe SourceSpan -> [Comment] -> A.Binder -> Binder Ann
192+binderToCoreFn _ ss com (A.NullBinder) =
193+ NullBinder (ss, com, Nothing, Nothing)
194+binderToCoreFn _ ss com (A.BooleanBinder b) =
195+ LiteralBinder (ss, com, Nothing, Nothing) (BooleanLiteral b)
196+binderToCoreFn _ ss com (A.StringBinder s) =
197+ LiteralBinder (ss, com, Nothing, Nothing) (StringLiteral s)
198+binderToCoreFn _ ss com (A.NumberBinder n) =
199+ LiteralBinder (ss, com, Nothing, Nothing) (NumericLiteral n)
200+binderToCoreFn _ ss com (A.VarBinder name) =
201+ VarBinder (ss, com, Nothing, Nothing) name
202+binderToCoreFn env ss com (A.ConstructorBinder dctor@(Qualified mn _) bs) =
203203 let (_, tctor, _) = lookupConstructor env dctor
204− in ConstructorBinder (ss, Nothing, Just $ getConstructorMeta env dctor) (Qualified mn tctor) dctor (map (binderToCoreFn env ss) bs)
205−binderToCoreFn env ss (A.ObjectBinder bs) =
206− LiteralBinder (ss, Nothing, Nothing) (ObjectLiteral $ map (second (binderToCoreFn env ss)) bs)
207−binderToCoreFn env ss (A.ArrayBinder bs) =
208− LiteralBinder (ss, Nothing, Nothing) (ArrayLiteral $ map (binderToCoreFn env ss) bs)
209−binderToCoreFn env ss (A.ConsBinder b1 b2) =
204+ in ConstructorBinder (ss, com, Nothing, Just $ getConstructorMeta env dctor) (Qualified mn tctor) dctor (map (binderToCoreFn env ss []) bs)
205+binderToCoreFn env ss com (A.ObjectBinder bs) =
206+ LiteralBinder (ss, com, Nothing, Nothing) (ObjectLiteral $ map (second (binderToCoreFn env ss [])) bs)
207+binderToCoreFn env ss com (A.ArrayBinder bs) =
208+ LiteralBinder (ss, com, Nothing, Nothing) (ArrayLiteral $ map (binderToCoreFn env ss []) bs)
209+binderToCoreFn env ss com (A.ConsBinder b1 b2) =
210210 let arrCtor = Qualified (Just $ ModuleName [ProperName "Prim"]) (ProperName "Array")
211− in ConstructorBinder (ss, Nothing, Nothing) arrCtor arrCtor $ map (binderToCoreFn env ss) [b1, b2]
212−binderToCoreFn env ss (A.NamedBinder name b) =
213− NamedBinder (ss, Nothing, Nothing) name (binderToCoreFn env ss b)
214−binderToCoreFn env _ (A.PositionedBinder ss b) =
215− binderToCoreFn env (Just ss) b
211+ in ConstructorBinder (ss, com, Nothing, Nothing) arrCtor arrCtor $ map (binderToCoreFn env ss []) [b1, b2]
212+binderToCoreFn env ss com (A.NamedBinder name b) =
213+ NamedBinder (ss, com, Nothing, Nothing) name (binderToCoreFn env ss [] b)
214+binderToCoreFn env _ com (A.PositionedBinder ss com1 b) =
215+ binderToCoreFn env (Just ss) (com ++ com1) b
216216
217217-- |
218218-- Converts a ProperName to an Ident.