Injecting imported functions using a core plugin

Hi ghc-devs, I’m currently writing a core plugin that I could use some help with. Consider the following two modules: ``` module A where foo :: Int bar :: Int module B where baz :: Int baz = bar ``` When compiling module B I run my plugin. The goal of the plugin is to replace the occurrence of `bar` with `foo`. Note that we can be sure that `foo` is actually imported, but unfortunately doesn’t occur anywhere in B before the plugin performs the transformation. The problem I have is that in order to inject `foo` in B I need to have an `Id` which represents `foo` and I’m having some trouble constructing such an `Id`. I’ve looked through the various environments that are available during the core to core transformations but none of them provides enough information to actually produce the `foo` `Id` as far as I can see. I hope I’m missing something. What do I need to do in order to construct the `foo` `Id` in module B? Thanks, Josef PS. The way I’ve phrased my problem in this email it would be possible to solve it with rewrite rules. My actual use case is unfortunately more complicated and rewrite rules don’t provide enough power to do what I want.

Hello Josef,
Do you know the location of foo when building the plugin? Otherwise, how is
the plugin supposed to learn where it comes from?
Facundo
On Tue, Nov 26, 2019 at 8:49 AM Josef Svenningsson
Hi ghc-devs,
I’m currently writing a core plugin that I could use some help with.
Consider the following two modules:
```
module A where
foo :: Int
bar :: Int
module B where
baz :: Int
baz = bar
```
When compiling module B I run my plugin. The goal of the plugin is to replace the occurrence of `bar` with `foo`. Note that we can be sure that `foo` is actually imported, but unfortunately doesn’t occur anywhere in B before the plugin performs the transformation.
The problem I have is that in order to inject `foo` in B I need to have an `Id` which represents `foo` and I’m having some trouble constructing such an `Id`. I’ve looked through the various environments that are available during the core to core transformations but none of them provides enough information to actually produce the `foo` `Id` as far as I can see. I hope I’m missing something. What do I need to do in order to construct the `foo` `Id` in module B?
Thanks,
Josef
PS. The way I’ve phrased my problem in this email it would be possible to solve it with rewrite rules. My actual use case is unfortunately more complicated and rewrite rules don’t provide enough power to do what I want. _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Yes, the plugin is fully aware of module A in my example.
Thanks,
Josef
From: "Domínguez, Facundo"

You can use `thNameToGhcName` to turn a quoted name ('foo) into a GHC
Name and and then use `lookupId` in order to get the `Id` for that
Name.
Cheers,
Matt
On Tue, Nov 26, 2019 at 12:55 PM Josef Svenningsson
Yes, the plugin is fully aware of module A in my example.
Thanks,
Josef
From: "Domínguez, Facundo"
Date: Tuesday, November 26, 2019 at 11:56 AM To: Josef Svenningsson Cc: "ghc-devs@haskell.org" Subject: Re: Injecting imported functions using a core plugin Hello Josef,
Do you know the location of foo when building the plugin? Otherwise, how is the plugin supposed to learn where it comes from?
Facundo
On Tue, Nov 26, 2019 at 8:49 AM Josef Svenningsson
wrote: Hi ghc-devs,
I’m currently writing a core plugin that I could use some help with.
Consider the following two modules:
```
module A where
foo :: Int
bar :: Int
module B where
baz :: Int
baz = bar
```
When compiling module B I run my plugin. The goal of the plugin is to replace the occurrence of `bar` with `foo`. Note that we can be sure that `foo` is actually imported, but unfortunately doesn’t occur anywhere in B before the plugin performs the transformation.
The problem I have is that in order to inject `foo` in B I need to have an `Id` which represents `foo` and I’m having some trouble constructing such an `Id`. I’ve looked through the various environments that are available during the core to core transformations but none of them provides enough information to actually produce the `foo` `Id` as far as I can see. I hope I’m missing something. What do I need to do in order to construct the `foo` `Id` in module B?
Thanks,
Josef
PS. The way I’ve phrased my problem in this email it would be possible to solve it with rewrite rules. My actual use case is unfortunately more complicated and rewrite rules don’t provide enough power to do what I want.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

That works splendidly! Neat!
Thanks,
Josef
On 11/26/19, 1:37 PM, "Matthew Pickering"
participants (3)
-
Domínguez, Facundo
-
Josef Svenningsson
-
Matthew Pickering