@@ -65,6 +65,7 @@ import Foreword hiding (mod)
65
65
import Control.Monad.Fresh (MonadFresh (.. ))
66
66
import Control.Monad.Log (MonadLog , WithSeverity )
67
67
import Control.Monad.NestedError (MonadNestedError , throwError' )
68
+ import Data.Data (Data )
68
69
import Data.Generics.Uniplate.Operations (transform , transformM )
69
70
import Data.Generics.Uniplate.Zipper (
70
71
fromZipper ,
@@ -135,7 +136,8 @@ import Primer.Core (
135
136
TyConName ,
136
137
Type ,
137
138
Type' (.. ),
138
- TypeCache (TCSynthed ),
139
+ TypeCache (TCChkedAt , TCEmb , TCSynthed ),
140
+ TypeCacheBoth (TCBoth ),
139
141
TypeMeta ,
140
142
ValConName ,
141
143
getID ,
@@ -146,8 +148,10 @@ import Primer.Core (
146
148
unsafeMkGlobalName ,
147
149
unsafeMkLocalName ,
148
150
_chkedAt ,
151
+ _exprMeta ,
149
152
_exprMetaLens ,
150
153
_synthed ,
154
+ _type ,
151
155
_typeMetaLens ,
152
156
)
153
157
import Primer.Core.DSL (S , ann , create , emptyHole , hole , tEmptyHole , tvar )
@@ -667,21 +671,26 @@ applyProgAction prog mdefName = \case
667
671
updateRefsInTypes =
668
672
over
669
673
(traversed % # _TypeDefAST % # astTypeDefConstructors % traversed % # valConArgs % traversed)
670
- $ transform
671
- $ over (# _TCon % _2) updateName
672
- updateDefType =
673
- over
674
- # astDefType
675
- $ transform
676
- $ over (# _TCon % _2) updateName
674
+ updateType'
675
+ updateDefType = over # astDefType updateType'
677
676
updateDefBody =
678
677
over
679
678
# astDefExpr
680
679
$ transform
681
- $ over typesInExpr
682
- $ transform
683
- $ over (# _TCon % _2) updateName
680
+ ( over typesInExpr updateType'
681
+ . over
682
+ (_exprMeta % _type % _Just)
683
+ ( \ case
684
+ -- TODO is there a better way to do this? maybe I should define a getter
685
+ TCSynthed t -> TCSynthed $ updateType' t
686
+ TCChkedAt t -> TCChkedAt $ updateType' t
687
+ TCEmb (TCBoth t1 t2) -> TCEmb (TCBoth (updateType' t1) (updateType' t2))
688
+ )
689
+ )
684
690
updateName n = if n == old then new else n
691
+ -- TODO rename `updateType` to `updateTypeDef` and this to `updateType`? in all branches?
692
+ updateType' :: Data a => Type' a -> Type' a
693
+ updateType' = transform $ over (# _TCon % _2) updateName
685
694
RenameCon type_ old (unsafeMkGlobalName . (fmap unName (unModuleName (qualifiedModule type_)),) -> new) ->
686
695
editModuleCross (qualifiedModule type_) prog $ \ (m, ms) -> do
687
696
when (new `elem` allValConNames prog) $ throwError $ ConAlreadyExists new
@@ -706,6 +715,7 @@ applyProgAction prog mdefName = \case
706
715
over (# _Con % _2) updateName
707
716
. over (# _Case % _3 % traversed % # _CaseBranch % _1) updateName
708
717
updateName n = if n == old then new else n
718
+ --
709
719
RenameTypeParam type_ old (unsafeMkLocalName -> new) ->
710
720
editModule (qualifiedModule type_) prog $ \ m -> do
711
721
m' <- updateType m
@@ -721,6 +731,8 @@ applyProgAction prog mdefName = \case
721
731
updateParam def = do
722
732
when (new `elem` map fst (astTypeDefParameters def)) $ throwError $ ParamAlreadyExists new
723
733
let nameRaw = unLocalName new
734
+ -- TODO we may as welll remove these, since we don't consistently check this sort of thing
735
+ -- as evidenced by code I've just commented out elsewhere
724
736
when (nameRaw == baseName type_) $ throwError $ TyConParamClash nameRaw
725
737
when (nameRaw `elem` map (baseName . valConName) (astTypeDefConstructors def)) $ throwError $ ValConParamClash nameRaw
726
738
def
@@ -737,6 +749,7 @@ applyProgAction prog mdefName = \case
737
749
% traversed
738
750
)
739
751
$ traverseOf _freeVarsTy
752
+ -- TODO respect scope i.e. avoid capture by not going under forall
740
753
$ \ (_, v) -> tvar $ updateName v
741
754
updateName n = if n == old then new else n
742
755
AddCon type_ index (unsafeMkGlobalName . (fmap unName (unModuleName (qualifiedModule type_)),) -> con) ->
@@ -753,6 +766,27 @@ applyProgAction prog mdefName = \case
753
766
, Just $ SelectionTypeDef $ TypeDefSelection type_ $ Just $ TypeDefConsNodeSelection $ TypeDefConsSelection con Nothing
754
767
)
755
768
where
769
+ -- transformCaseBranches' ::
770
+ -- MonadEdit m ProgError =>
771
+ -- Prog ->
772
+ -- TyConName ->
773
+ -- Maybe TypeCache ->
774
+ -- ([CaseBranch] -> m [CaseBranch]) ->
775
+ -- Expr ->
776
+ -- m Expr
777
+ -- transformCaseBranches' prog type_ t f = transformM $ \case
778
+ -- Case m scrut bs -> do
779
+ -- scrutType <-
780
+ -- fst
781
+ -- <$> runReaderT
782
+ -- (liftError (ActionError . TypeError) $ synth scrut)
783
+ -- (progCxt prog)
784
+ -- Case (m & _type .~ t) scrut
785
+ -- <$> if fst (unfoldTApp scrutType) == TCon () type_
786
+ -- then f bs
787
+ -- else pure bs
788
+ -- e -> pure e
789
+ -- updateDefs = transformCaseBranches' prog type_ (Just (TCChkedAt $ TApp () (TEmptyHole ()) (TEmptyHole ()))) $ \bs -> do
756
790
updateDefs = transformCaseBranches prog type_ $ \ bs -> do
757
791
m' <- DSL. meta
758
792
maybe (throwError $ IndexOutOfRange index) pure $ insertAt index (CaseBranch con [] (EmptyHole m')) bs
@@ -923,7 +957,8 @@ applyProgAction prog mdefName = \case
923
957
let smartHoles = progSmartHoles prog
924
958
applyActionsToField smartHoles (progImports prog) ms (defName, con, index, def) actions >>= \ case
925
959
Left err -> throwError $ ActionError err
926
- Right (mod', zt) ->
960
+ Right (mod', _zt) ->
961
+ -- Right (mod', zt) ->
927
962
pure
928
963
( mod'
929
964
, Just $
@@ -936,11 +971,13 @@ applyProgAction prog mdefName = \case
936
971
TypeDefConsSelection
937
972
{ con
938
973
, field =
939
- Just
940
- TypeDefConsFieldSelection
941
- { index
942
- , meta = Right $ zt ^. _target % _typeMetaLens
943
- }
974
+ -- TODO if we set selection, we get weird metadata errors
975
+ Nothing
976
+ -- Just
977
+ -- TypeDefConsFieldSelection
978
+ -- { index
979
+ -- , meta = Right $ zt ^. _target % _typeMetaLens
980
+ -- }
944
981
}
945
982
}
946
983
)
0 commit comments