diff options
author | mniip <mniip@mniip.com> | 2019-01-20 20:48:13 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-08-07 10:18:07 -0400 |
commit | 2073745c70d830373c67b908e5c42d3cd18c057a (patch) | |
tree | 5f89a76cc92a05c75183223c3878d7446945758c /compiler/iface/MkIface.hs | |
parent | 6f116005a144b3f09381e0a5967a364eb57a5aa5 (diff) | |
download | haskell-2073745c70d830373c67b908e5c42d3cd18c057a.tar.gz |
Add a -fprint-axiom-incomps option (#15546)
Supply branch incomps when building an IfaceClosedSynFamilyTyCon
`pprTyThing` now has access to incomps. This also causes them to be
written out to .hi files, but that doesn't pose an issue other than a
more faithful bijection between `tyThingToIfaceDecl` and `tcIfaceDecl`.
The machinery for displaying axiom incomps was already present but not
in use. Since this is now a thing that pops up in ghci's :info the
format was modified to look like a haskell comment.
Documentation and a test for the new feature included.
Test Plan: T15546
Reviewers: simonpj, bgamari, goldfire
Reviewed By: simonpj
Subscribers: rwbarton, carter
GHC Trac Issues: #15546
Differential Revision: https://phabricator.haskell.org/D5097
Diffstat (limited to 'compiler/iface/MkIface.hs')
-rw-r--r-- | compiler/iface/MkIface.hs | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/compiler/iface/MkIface.hs b/compiler/iface/MkIface.hs index 261a8bfca2..e3be840006 100644 --- a/compiler/iface/MkIface.hs +++ b/compiler/iface/MkIface.hs @@ -1804,33 +1804,30 @@ coAxiomToIfaceDecl ax@(CoAxiom { co_ax_tc = tycon, co_ax_branches = branches where branch_list = fromBranches branches --- 2nd parameter is the list of branch LHSs, for conversion from incompatible branches --- to incompatible indices +-- 2nd parameter is the list of branch LHSs, in case of a closed type family, +-- for conversion from incompatible branches to incompatible indices. +-- For an open type family the list should be empty. -- See Note [Storing compatibility] in CoAxiom coAxBranchToIfaceBranch :: TyCon -> [[Type]] -> CoAxBranch -> IfaceAxBranch coAxBranchToIfaceBranch tc lhs_s - branch@(CoAxBranch { cab_incomps = incomps }) - = (coAxBranchToIfaceBranch' tc branch) { ifaxbIncomps = iface_incomps } + (CoAxBranch { cab_tvs = tvs, cab_cvs = cvs + , cab_eta_tvs = eta_tvs + , cab_lhs = lhs, cab_roles = roles + , cab_rhs = rhs, cab_incomps = incomps }) + + = IfaceAxBranch { ifaxbTyVars = toIfaceTvBndrs tvs + , ifaxbCoVars = map toIfaceIdBndr cvs + , ifaxbEtaTyVars = toIfaceTvBndrs eta_tvs + , ifaxbLHS = toIfaceTcArgs tc lhs + , ifaxbRoles = roles + , ifaxbRHS = toIfaceType rhs + , ifaxbIncomps = iface_incomps } where iface_incomps = map (expectJust "iface_incomps" - . (flip findIndex lhs_s - . eqTypes) + . flip findIndex lhs_s + . eqTypes . coAxBranchLHS) incomps --- use this one for standalone branches without incompatibles -coAxBranchToIfaceBranch' :: TyCon -> CoAxBranch -> IfaceAxBranch -coAxBranchToIfaceBranch' tc (CoAxBranch { cab_tvs = tvs, cab_cvs = cvs - , cab_eta_tvs = eta_tvs - , cab_lhs = lhs - , cab_roles = roles, cab_rhs = rhs }) - = IfaceAxBranch { ifaxbTyVars = toIfaceTvBndrs tvs - , ifaxbCoVars = map toIfaceIdBndr cvs - , ifaxbEtaTyVars = toIfaceTvBndrs eta_tvs - , ifaxbLHS = toIfaceTcArgs tc lhs - , ifaxbRoles = roles - , ifaxbRHS = toIfaceType rhs - , ifaxbIncomps = [] } - ----------------- tyConToIfaceDecl :: TidyEnv -> TyCon -> (TidyEnv, IfaceDecl) -- We *do* tidy TyCons, because they are not (and cannot @@ -1911,7 +1908,8 @@ tyConToIfaceDecl env tycon to_if_fam_flav (ClosedSynFamilyTyCon (Just ax)) = IfaceClosedSynFamilyTyCon (Just (axn, ibr)) where defs = fromBranches $ coAxiomBranches ax - ibr = map (coAxBranchToIfaceBranch' tycon) defs + lhss = map coAxBranchLHS defs + ibr = map (coAxBranchToIfaceBranch tycon lhss) defs axn = coAxiomName ax ifaceConDecls (NewTyCon { data_con = con }) = IfNewTyCon (ifaceConDecl con) |