Skip to content

Commit 3bb8454

Browse files
committed
Fix unification pertaining to evidence
1 parent 959da62 commit 3bb8454

File tree

6 files changed

+65
-8
lines changed

6 files changed

+65
-8
lines changed

plugins/hls-tactics-plugin/src/Wingman/CodeGen.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import Data.Bool (bool)
1818
import Data.Functor ((<&>))
1919
import Data.Generics.Labels ()
2020
import Data.List
21-
import Data.Monoid (Endo(..))
2221
import qualified Data.Set as S
2322
import Data.Traversable
2423
import DataCon
@@ -67,7 +66,7 @@ destructMatches use_field_puns f scrut t jdg = do
6766
-- #syn_scoped
6867
method_hy = foldMap evidenceToHypothesis ev
6968
args = conLikeInstOrigArgTys' con apps
70-
modify $ appEndo $ foldMap (Endo . evidenceToSubst) ev
69+
modify $ evidenceToSubst ev
7170
subst <- gets ts_unifier
7271

7372
let names_in_scope = hyNamesInScope hy

plugins/hls-tactics-plugin/src/Wingman/Judgements/Theta.hs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import qualified Data.Set as S
1818
import Development.IDE.Core.UseStale
1919
import Development.IDE.GHC.Compat
2020
import Generics.SYB hiding (tyConName, empty)
21-
import GhcPlugins (mkVarOcc, splitTyConApp_maybe, getTyVar_maybe, zipTvSubst)
21+
import GhcPlugins (mkVarOcc, splitTyConApp_maybe, getTyVar_maybe, zipTvSubst, unionTCvSubst, emptyTCvSubst, TCvSubst)
2222
#if __GLASGOW_HASKELL__ > 806
2323
import GhcPlugins (eqTyCon)
2424
#else
@@ -77,8 +77,8 @@ getEvidenceAtHole (unTrack -> dst)
7777

7878
------------------------------------------------------------------------------
7979
-- | Update our knowledge of which types are equal.
80-
evidenceToSubst :: Evidence -> TacticState -> TacticState
81-
evidenceToSubst (EqualityOfTypes a b) ts =
80+
hi :: Evidence -> TacticState -> TacticState
81+
hi (EqualityOfTypes a b) ts =
8282
let tyvars = S.fromList $ mapMaybe getTyVar_maybe [a, b]
8383
-- If we can unify our skolems, at least one is no longer a skolem.
8484
-- Removing them from this set ensures we can get a subtitution between
@@ -89,7 +89,22 @@ evidenceToSubst (EqualityOfTypes a b) ts =
8989
case tryUnifyUnivarsButNotSkolems skolems (CType a) (CType b) of
9090
Just subst -> updateSubst subst ts
9191
Nothing -> ts
92-
evidenceToSubst HasInstance{} ts = ts
92+
hi HasInstance{} ts = ts
93+
94+
substEvidence :: TCvSubst -> Evidence -> Evidence
95+
substEvidence subst (EqualityOfTypes ty ty') =
96+
EqualityOfTypes (substTy subst ty) (substTy subst ty')
97+
substEvidence _ x = x
98+
99+
allEvidenceToSubst :: [Evidence] -> TCvSubst
100+
allEvidenceToSubst [] = emptyTCvSubst
101+
allEvidenceToSubst (HasInstance{} : evs) = allEvidenceToSubst evs
102+
allEvidenceToSubst (eq@EqualityOfTypes{} : evs) =
103+
let subst = ts_unifier $ hi eq defaultTacticState
104+
in unionTCvSubst subst $ allEvidenceToSubst $ fmap (substEvidence subst) evs
105+
106+
evidenceToSubst :: [Evidence] -> TacticState -> TacticState
107+
evidenceToSubst = updateSubst . allEvidenceToSubst
93108

94109

95110
------------------------------------------------------------------------------

plugins/hls-tactics-plugin/src/Wingman/LanguageServer.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,9 @@ mkJudgementAndContext cfg g (TrackedStale binds bmap) rss (TrackedStale tcg tcgm
270270
already_destructed = getAlreadyDestructed (fmap RealSrcSpan tcg_rss) tcs
271271
local_hy = spliceProvenance top_provs
272272
$ hypothesisFromBindings binds_rss binds
273-
evidence = getEvidenceAtHole (fmap RealSrcSpan tcg_rss) tcs
273+
evidence = traceIdX "evidence" $ getEvidenceAtHole (fmap RealSrcSpan tcg_rss) tcs
274274
cls_hy = foldMap evidenceToHypothesis evidence
275-
subst = ts_unifier $ appEndo (foldMap (Endo . evidenceToSubst) evidence) defaultTacticState
275+
subst = ts_unifier $ evidenceToSubst evidence defaultTacticState
276276
pure $
277277
( disallowing AlreadyDestructed already_destructed
278278
$ fmap (CType . substTyAddInScope subst . unCType) $ mkFirstJudgement

plugins/hls-tactics-plugin/test/CodeAction/AutoSpec.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ spec = do
6565
autoTest 6 8 "AutoThetaEqGADTDestruct"
6666
autoTest 6 10 "AutoThetaRefl"
6767
autoTest 6 8 "AutoThetaReflDestruct"
68+
autoTest 19 30 "AutoThetaMultipleUnification"
6869

6970
describe "known" $ do
7071
autoTest 25 13 "GoldenArbitrary"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE GADTs #-}
3+
{-# LANGUAGE KindSignatures #-}
4+
{-# LANGUAGE TypeOperators #-}
5+
6+
import Data.Kind
7+
8+
data Nat = Z | S Nat
9+
10+
data HList (ls :: [Type]) where
11+
HNil :: HList '[]
12+
HCons :: t -> HList ts -> HList (t ': ts)
13+
14+
data ElemAt (n :: Nat) t (ts :: [Type]) where
15+
AtZ :: ElemAt 'Z t (t ': ts)
16+
AtS :: ElemAt k t ts -> ElemAt ('S k) t (u ': ts)
17+
18+
lookMeUp :: ElemAt i ty tys -> HList tys -> ty
19+
lookMeUp AtZ (HCons t _) = t
20+
lookMeUp (AtS ea') (HCons t hl') = _
21+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE GADTs #-}
3+
{-# LANGUAGE KindSignatures #-}
4+
{-# LANGUAGE TypeOperators #-}
5+
6+
import Data.Kind
7+
8+
data Nat = Z | S Nat
9+
10+
data HList (ls :: [Type]) where
11+
HNil :: HList '[]
12+
HCons :: t -> HList ts -> HList (t ': ts)
13+
14+
data ElemAt (n :: Nat) t (ts :: [Type]) where
15+
AtZ :: ElemAt 'Z t (t ': ts)
16+
AtS :: ElemAt k t ts -> ElemAt ('S k) t (u ': ts)
17+
18+
lookMeUp :: ElemAt i ty tys -> HList tys -> ty
19+
lookMeUp AtZ (HCons t hl') = _
20+
lookMeUp (AtS ea') (HCons t hl') = _
21+

0 commit comments

Comments
 (0)