My issue was caused by running the program in a dirty tree :) Find the modified program here - https://gist.github.com/df64f8cda24dd0c66137f10ad9488912
I compiled it with HEAD. Hope you can make sense of it, I think it's simpler than before. Cheers, Matt On Mon, Jun 20, 2022 at 5:47 PM Matthew Pickering <matthewtpicker...@gmail.com> wrote: > > Gergo, I rewrote your example program for the new API but didn't quite > manage to finish today. I will finish it off and post it tomorrow. > > Matt > > On Mon, Jun 20, 2022 at 6:16 AM Erdi, Gergo <gergo.e...@sc.com> wrote: > > > > PUBLIC > > > > I managed to get this working, but I would like some feedback from Matt or > > others on whether this is the intended way of doing this. > > > > 1. The `extendMG` change can be brute-forced just to keep things going, by > > looking up dependency `ModSummary`s by `ModName` (we don't have full > > `Module`s at this point yet!): > > > > registerModSummary :: (GhcMonad m) => ModSummary -> m () registerModSummary > > ms = modifySession \env -> > > let mg = hsc_mod_graph env > > -- TODO: of course with a bit more housekeeping we can do better > > than this... > > edges = [ NodeKey_Module $ msKey ms' | dep <- deps, ms' <- > > mgModSummaries mg, ms_mod_name ms' == dep ] > > mg' = extendMG mg edges ms > > in env{ hsc_mod_graph = mg' } > > where > > deps = map (unLoc . snd) $ ms_textual_imps ms > > > > 2. `registerModule` can be kept mostly as-is, since it only uses > > `modifyUnitState` to change the active unit: > > > > registerModule :: (GhcMonad m) => ModDetails -> ModIface -> m () > > registerModule details iface = modifySession $ extendHpt . addModule > > where > > hmi = HomeModInfo iface details Nothing > > > > mod = mi_module iface > > modOrig = ModOrigin (Just True) [] [] True > > > > addModule = modifyUnitState $ \us -> us > > { moduleNameProvidersMap = M.insert (moduleName mod) (M.singleton > > mod modOrig) $ moduleNameProvidersMap us > > } > > > > extendHpt = hscUpdateHUG $ addHomeModInfoToHug hmi > > > > modifyUnitState :: (UnitState -> UnitState) -> HscEnv -> HscEnv > > modifyUnitState f env = env > > { hsc_unit_env = let ue = hsc_unit_env env in > > let units = ue_units ue > > units' = f units > > in ue_setUnits units' ue > > } > > > > 3. The tricky part is getting `addUnit` right. For this, based on the > > implementation of `initUnits`, I came up with the following: > > > > modifyUnitEnv :: (UnitEnv -> UnitEnv) -> HscEnv -> HscEnv modifyUnitEnv f > > env = env > > { hsc_unit_env = let ue = hsc_unit_env env in f ue > > } > > > > addUnit :: DynFlags -> UnitId -> HscEnv -> HscEnv addUnit dflags unitId = > > modifyUnitEnv $ \ue -> > > let dbs = ue_unit_dbs ue > > unit_state = ue_units ue > > home_unit = ue_homeUnit ue > > in flip updateHug ue $ unitEnv_insert unitId $ HomeUnitEnv > > { homeUnitEnv_units = unit_state > > , homeUnitEnv_unit_dbs = dbs > > , homeUnitEnv_dflags = dflags > > , homeUnitEnv_hpt = emptyHomePackageTable > > , homeUnitEnv_home_unit = home_unit > > } > > > > setCurrentUnit :: UnitId -> HscEnv -> HscEnv setCurrentUnit unitId = > > modifyUnitEnv $ ue_setActiveUnit unitId > > > > > > So my questions about this: > > > > 1. How does setting the home unit make sense? By doing this, I am > > effectively setting the home unit to `main` for all units, since that's the > > initial `ue_homeUnit` of the initial unit environment. Or does it not > > matter because after `addUnit`, I call `setCurrentUnit` anyway? I've found > > that I can't use the unit I am just adding as its own home unit, because > > that then leads to module name resolution problems in `main`: every > > imported module from `main` is searched for in `main` instead of its > > correct unit. > > > > 2. Speaking of `main`, why is it that when adding units, I have to skip > > `mainUnitId`, otherwise module resolution breaks again? > > > > 3. Unlike the previous version, I am no longer creating and putting > > `UnitInfo`s anywhere. Where is this going to bite me? Where (if anywhere) > > should I put `UnitInfo`s with the new setup? > > > > Thanks, > > Gergo > > > > > > -----Original Message----- > > From: ÉRDI Gergő <ge...@erdi.hu> > > Sent: Sunday, June 19, 2022 12:32 PM > > To: Erdi, Gergo <gergo.e...@sc.com> > > Cc: GHC Devs <ghc-devs@haskell.org>; Montelatici, Raphael Laurent > > <raphael.montelat...@sc.com> > > Subject: [External] Re: Migration guide for multiple home units > > > > > > On Thu, 16 Jun 2022, Erdi, Gergo via ghc-devs wrote: > > > > > Is there a migration guide for GHC API clients for the new “multiple home > > > units” > > > feature? > > > > OK so in concrete terms, please see my attached program which is a heavily > > cut-down, standalone version of my real program. On commit > > fd42ab5fa1df847a6b595dfe4b63d9c7eecbf400^ (i.e. > > 3219610e3ba6cb6a5cd1f4e32e2b4befea5bd384) it compiles and works as > > expected. On commit fd42ab5fa1df847a6b595dfe4b63d9c7eecbf400 onwards, two > > problems pop up: > > > > 1. `extendMG` has changed and now requires manually specifying outgoing > > dependency edges. I thought the whole point of `summariseFile` was to > > collect this information? The reason I need to `extendMG` at that point is > > to get intra-unit orphan instances working. > > > > 2. `modifyUnitState` and its two uses (`addUnit` and `registerModule`) need > > to be updated to the new API. I think it makes sense that these need > > changing, since they touch exactly on the issue of which units are being > > compiled right now. However, I don't know how to update these. Also, I > > guess `setHomeUnit` should change the `CurrentUnit` instead of the > > `HomeUnit` now? > > > > Thanks, > > Gergo > > > > This email and any attachments are confidential and may also be privileged. > > If you are not the intended recipient, please delete all copies and notify > > the sender immediately. You may wish to refer to the incorporation details > > of Standard Chartered PLC, Standard Chartered Bank and their subsidiaries > > at https: //www.sc.com/en/our-locations > > > > Where you have a Financial Markets relationship with Standard Chartered > > PLC, Standard Chartered Bank and their subsidiaries (the "Group"), > > information on the regulatory standards we adhere to and how it may affect > > you can be found in our Regulatory Compliance Statement at https: > > //www.sc.com/rcs/ and Regulatory Compliance Disclosures at http: > > //www.sc.com/rcs/fm > > > > Insofar as this communication is not sent by the Global Research team and > > contains any market commentary, the market commentary has been prepared by > > the sales and/or trading desk of Standard Chartered Bank or its affiliate. > > It is not and does not constitute research material, independent research, > > recommendation or financial advice. Any market commentary is for > > information purpose only and shall not be relied on for any other purpose > > and is subject to the relevant disclaimers available at https: > > //www.sc.com/en/regulatory-disclosures/#market-disclaimer. > > > > Insofar as this communication is sent by the Global Research team and > > contains any research materials prepared by members of the team, the > > research material is for information purpose only and shall not be relied > > on for any other purpose, and is subject to the relevant disclaimers > > available at https: > > //research.sc.com/research/api/application/static/terms-and-conditions. > > > > Insofar as this e-mail contains the term sheet for a proposed transaction, > > by responding affirmatively to this e-mail, you agree that you have > > understood the terms and conditions in the attached term sheet and > > evaluated the merits and risks of the transaction. We may at times also > > request you to sign the term sheet to acknowledge the same. > > > > Please visit https: //www.sc.com/en/regulatory-disclosures/dodd-frank/ for > > important information with respect to derivative products. _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs