hi,

it seems you need 
https://godoc.org/golang.org/x/tools/go/loader
https://godoc.org/go/types

then select desired package, get its top scope, loop over public names, 
generate aliases.

but i m unsure it is such a good idea to keep those shallow copies around, 
at least for the case you have found out.

Le lundi 16 septembre 2019 14:27:01 UTC+2, Michel Levieux a écrit :
>
> Hi all,
>
> I'm developing a command that is a utility to move packages around while 
> keeping compatibility with softwares that import those packages. Maybe 
> there are commands and utilities that already do approximately the same 
> thing, but I'm mainly doing this to learn to use the go/ast package and 
> everything. Let me give you a small example:
>
> - Let's say I have a package in my GOPATH that's named 'foo'
> - In this package there is another package 'bar', but this package bar has 
> grown a whole lot since the beginning of the project, and might as well be 
> a project on its own.
> - What I want is extract package 'bar' from 'foo' without having to go 
> through all other projects importing 'bar' to change import paths
> - The process for the command is to first move package 'bar' wherever I 
> tell it to move it and replace anything in previously existing package 
> 'foo/bar' with bindings, so any function's body is replaced with a call to 
> the function in the moved package, any type is transformed into an "alias" 
> of the moved package's corresponding type (TypeA = bar.TypeA), as well as 
> any constant or variable.
>
> The command is not finished yet but I'm running into a certain issue I 
> can't find a solution to:
>
> Whenever the command creates a binding for a given exported variable:
>
> var (
>     Anything = 5.0
> )
>
> becomes
>
> var (
>     Anything = bar.Anything
> )
>
> there's a risk that bar.Anything was originally changed during the 
> program's execution and according to the context. If that was the case, any 
> change to bar.Anything will not be applied in foo/bar.Anything, which 
> breaks the whole thing.
>
> Does anyone have an idea how to programmatically make it so that any 
> changes applied to bar.Anything is applied to foo/bar.Anything, as if they 
> really did share the same memory? Of course this would need to be totally 
> transparent to the user of the package.
>
> Maybe this is not possible but if you guys know anything, please tell me.
>
> Thanks in advance!
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/099b1934-f90f-492a-a620-04c51599a70e%40googlegroups.com.

Reply via email to