@@ -22,8 +22,10 @@ import Language.PureScript.CoreFn.Meta (ConstructorType(..), Meta(..))
2222import Language.PureScript.CoreFn.Module (Module (.. ))
2323import Language.PureScript.Crash (internalError )
2424import Language.PureScript.Environment (DataDeclType (.. ), Environment (.. ), NameKind (.. ), isDictTypeName , lookupConstructor , lookupValue )
25+ import Language.PureScript.Label (Label (.. ))
2526import Language.PureScript.Names (pattern ByNullSourcePos , Ident (.. ), ModuleName , ProperName (.. ), ProperNameType (.. ), Qualified (.. ), QualifiedBy (.. ), getQual )
26- import Language.PureScript.Types (SourceType )
27+ import Language.PureScript.PSString (PSString )
28+ import Language.PureScript.Types (pattern REmptyKinded , SourceType , Type (.. ))
2729import Language.PureScript.AST qualified as A
2830import Language.PureScript.Constants.Prim qualified as C
2931
@@ -57,13 +59,13 @@ moduleToCoreFn env (A.Module modSS coms mn decls (Just exps)) =
5759 dedupeImports = fmap swap . M. toList . M. fromListWith const . fmap swap
5860
5961 ssA :: SourceSpan -> Ann
60- ssA ss = (ss, [] , Nothing , Nothing )
62+ ssA ss = (ss, [] , Nothing )
6163
6264 -- Desugars member declarations from AST to CoreFn representation.
6365 declToCoreFn :: A. Declaration -> [Bind Ann ]
6466 declToCoreFn (A. DataDeclaration (ss, com) Newtype _ _ [ctor]) =
65- [NonRec (ss, [] , Nothing , declMeta) (properToIdent $ A. dataCtorName ctor) $
66- Abs (ss, com, Nothing , Just IsNewtype ) (Ident " x" ) (Var (ssAnn ss) $ Qualified ByNullSourcePos (Ident " x" ))]
67+ [NonRec (ss, [] , declMeta) (properToIdent $ A. dataCtorName ctor) $
68+ Abs (ss, com, Just IsNewtype ) (Ident " x" ) (Var (ssAnn ss) $ Qualified ByNullSourcePos (Ident " x" ))]
6769 where
6870 declMeta = isDictTypeName (A. dataCtorName ctor) `orEmpty` IsTypeClassConstructor
6971 declToCoreFn d@ (A. DataDeclaration _ Newtype _ _ _) =
@@ -73,7 +75,7 @@ moduleToCoreFn env (A.Module modSS coms mn decls (Just exps)) =
7375 let
7476 ctor = A. dataCtorName ctorDecl
7577 (_, _, _, fields) = lookupConstructor env (Qualified (ByModuleName mn) ctor)
76- in NonRec (ssA ss) (properToIdent ctor) $ Constructor (ss, com, Nothing , Nothing ) tyName ctor fields
78+ in NonRec (ssA ss) (properToIdent ctor) $ Constructor (ss, com, Nothing ) tyName ctor fields
7779 declToCoreFn (A. DataBindingGroupDeclaration ds) =
7880 concatMap declToCoreFn ds
7981 declToCoreFn (A. ValueDecl (ss, com) name _ _ [A. MkUnguarded e]) =
@@ -84,18 +86,29 @@ moduleToCoreFn env (A.Module modSS coms mn decls (Just exps)) =
8486
8587 -- Desugars expressions from AST to CoreFn representation.
8688 exprToCoreFn :: SourceSpan -> [Comment ] -> Maybe SourceType -> A. Expr -> Expr Ann
87- exprToCoreFn _ com ty (A. Literal ss lit) =
88- Literal (ss, com, ty, Nothing ) (fmap (exprToCoreFn ss com Nothing ) lit)
89- exprToCoreFn ss com ty (A. Accessor name v) =
90- Accessor (ss, com, ty, Nothing ) name (exprToCoreFn ss [] Nothing v)
89+ exprToCoreFn _ com _ (A. Literal ss lit) =
90+ Literal (ss, com, Nothing ) (fmap (exprToCoreFn ss com Nothing ) lit)
91+ exprToCoreFn ss com _ (A. Accessor name v) =
92+ Accessor (ss, com, Nothing ) name (exprToCoreFn ss [] Nothing v)
9193 exprToCoreFn ss com ty (A. ObjectUpdate obj vs) =
92- ObjectUpdate (ss, com, ty, Nothing ) (exprToCoreFn ss [] Nothing obj) $ fmap (second (exprToCoreFn ss [] Nothing )) vs
93- exprToCoreFn ss com ty (A. Abs (A. VarBinder _ name) v) =
94- Abs (ss, com, ty, Nothing ) name (exprToCoreFn ss [] Nothing v)
94+ ObjectUpdate (ss, com, Nothing ) (exprToCoreFn ss [] Nothing obj) (ty >>= unchangedRecordFields (fmap fst vs)) $ fmap (second (exprToCoreFn ss [] Nothing )) vs
95+ where
96+ -- Return the unchanged labels of a closed record, or Nothing for other types or open records.
97+ unchangedRecordFields :: [PSString ] -> Type a -> Maybe [PSString ]
98+ unchangedRecordFields updated (TypeApp _ (TypeConstructor _ C. Record ) row) =
99+ collect row
100+ where
101+ collect :: Type a -> Maybe [PSString ]
102+ collect (REmptyKinded _ _) = Just []
103+ collect (RCons _ (Label l) _ r) = (if l `elem` updated then id else (l : )) <$> collect r
104+ collect _ = Nothing
105+ unchangedRecordFields _ _ = Nothing
106+ exprToCoreFn ss com _ (A. Abs (A. VarBinder _ name) v) =
107+ Abs (ss, com, Nothing ) name (exprToCoreFn ss [] Nothing v)
95108 exprToCoreFn _ _ _ (A. Abs _ _) =
96109 internalError " Abs with Binder argument was not desugared before exprToCoreFn mn"
97- exprToCoreFn ss com ty (A. App v1 v2) =
98- App (ss, com, ty, (isDictCtor v1 || isSynthetic v2) `orEmpty` IsSyntheticApp ) v1' v2'
110+ exprToCoreFn ss com _ (A. App v1 v2) =
111+ App (ss, com, (isDictCtor v1 || isSynthetic v2) `orEmpty` IsSyntheticApp ) v1' v2'
99112 where
100113 v1' = exprToCoreFn ss [] Nothing v1
101114 v2' = exprToCoreFn ss [] Nothing v2
@@ -108,24 +121,24 @@ moduleToCoreFn env (A.Module modSS coms mn decls (Just exps)) =
108121 A. Var NullSourceSpan _ -> True
109122 A. Unused {} -> True
110123 _ -> False
111- exprToCoreFn ss com ty (A. Unused _) =
112- Var (ss, com, ty, Nothing ) C. I_undefined
113- exprToCoreFn _ com ty (A. Var ss ident) =
114- Var (ss, com, ty, getValueMeta ident) ident
115- exprToCoreFn ss com ty (A. IfThenElse v1 v2 v3) =
116- Case (ss, com, ty, Nothing ) [exprToCoreFn ss [] Nothing v1]
124+ exprToCoreFn ss com _ (A. Unused _) =
125+ Var (ss, com, Nothing ) C. I_undefined
126+ exprToCoreFn _ com _ (A. Var ss ident) =
127+ Var (ss, com, getValueMeta ident) ident
128+ exprToCoreFn ss com _ (A. IfThenElse v1 v2 v3) =
129+ Case (ss, com, Nothing ) [exprToCoreFn ss [] Nothing v1]
117130 [ CaseAlternative [LiteralBinder (ssAnn ss) $ BooleanLiteral True ]
118131 (Right $ exprToCoreFn ss [] Nothing v2)
119132 , CaseAlternative [NullBinder (ssAnn ss)]
120133 (Right $ exprToCoreFn ss [] Nothing v3) ]
121- exprToCoreFn _ com ty (A. Constructor ss name) =
122- Var (ss, com, ty, Just $ getConstructorMeta name) $ fmap properToIdent name
123- exprToCoreFn ss com ty (A. Case vs alts) =
124- Case (ss, com, ty, Nothing ) (fmap (exprToCoreFn ss [] Nothing ) vs) (fmap (altToCoreFn ss) alts)
134+ exprToCoreFn _ com _ (A. Constructor ss name) =
135+ Var (ss, com, Just $ getConstructorMeta name) $ fmap properToIdent name
136+ exprToCoreFn ss com _ (A. Case vs alts) =
137+ Case (ss, com, Nothing ) (fmap (exprToCoreFn ss [] Nothing ) vs) (fmap (altToCoreFn ss) alts)
125138 exprToCoreFn ss com _ (A. TypedValue _ v ty) =
126139 exprToCoreFn ss com (Just ty) v
127- exprToCoreFn ss com ty (A. Let w ds v) =
128- Let (ss, com, ty, getLetMeta w) (concatMap declToCoreFn ds) (exprToCoreFn ss [] Nothing v)
140+ exprToCoreFn ss com _ (A. Let w ds v) =
141+ Let (ss, com, getLetMeta w) (concatMap declToCoreFn ds) (exprToCoreFn ss [] Nothing v)
129142 exprToCoreFn _ com ty (A. PositionedValue ss com1 v) =
130143 exprToCoreFn ss (com ++ com1) ty v
131144 exprToCoreFn _ _ _ e =
@@ -150,16 +163,16 @@ moduleToCoreFn env (A.Module modSS coms mn decls (Just exps)) =
150163 -- Desugars case binders from AST to CoreFn representation.
151164 binderToCoreFn :: SourceSpan -> [Comment ] -> A. Binder -> Binder Ann
152165 binderToCoreFn _ com (A. LiteralBinder ss lit) =
153- LiteralBinder (ss, com, Nothing , Nothing ) (fmap (binderToCoreFn ss com) lit)
166+ LiteralBinder (ss, com, Nothing ) (fmap (binderToCoreFn ss com) lit)
154167 binderToCoreFn ss com A. NullBinder =
155- NullBinder (ss, com, Nothing , Nothing )
168+ NullBinder (ss, com, Nothing )
156169 binderToCoreFn _ com (A. VarBinder ss name) =
157- VarBinder (ss, com, Nothing , Nothing ) name
170+ VarBinder (ss, com, Nothing ) name
158171 binderToCoreFn _ com (A. ConstructorBinder ss dctor@ (Qualified mn' _) bs) =
159172 let (_, tctor, _, _) = lookupConstructor env dctor
160- in ConstructorBinder (ss, com, Nothing , Just $ getConstructorMeta dctor) (Qualified mn' tctor) dctor (fmap (binderToCoreFn ss [] ) bs)
173+ in ConstructorBinder (ss, com, Just $ getConstructorMeta dctor) (Qualified mn' tctor) dctor (fmap (binderToCoreFn ss [] ) bs)
161174 binderToCoreFn _ com (A. NamedBinder ss name b) =
162- NamedBinder (ss, com, Nothing , Nothing ) name (binderToCoreFn ss [] b)
175+ NamedBinder (ss, com, Nothing ) name (binderToCoreFn ss [] b)
163176 binderToCoreFn _ com (A. PositionedBinder ss com1 b) =
164177 binderToCoreFn ss (com ++ com1) b
165178 binderToCoreFn ss com (A. TypedBinder _ b) =
@@ -232,7 +245,7 @@ findQualModules decls =
232245
233246-- | Desugars import declarations from AST to CoreFn representation.
234247importToCoreFn :: A. Declaration -> Maybe (Ann , ModuleName )
235- importToCoreFn (A. ImportDeclaration (ss, com) name _ _) = Just ((ss, com, Nothing , Nothing ), name)
248+ importToCoreFn (A. ImportDeclaration (ss, com) name _ _) = Just ((ss, com, Nothing ), name)
236249importToCoreFn _ = Nothing
237250
238251-- | Desugars foreign declarations from AST to CoreFn representation.
0 commit comments