When using IntelliJ, did you restrict the search to “project files”? Otherwise you will get implantations anywhere in the standard library or other projects.
> On Dec 10, 2018, at 6:21 AM, David Wahlstedt <david.wahlstedt....@gmail.com> > wrote: > > Hi, and thanks for your answers! > Yes, I realize that the possible results of calling an interface method > depends on runtime. But in many cases there is only one possible alternative, > or just a few ones, dependent of the state of the program. It should still be > possible for the tool to compute the possible candidates, and omit irrelevant > matches. In my example there was only one possible alternative, although > go-guru showed a list of many other alternatives. > By the way, I also tried IntelliJ(goland) as well as visual studio and > LiteIDE X X35.2, and none of them gave more information than go-guru in this > matter. > > /David > >> Den fredag 7 december 2018 kl. 17:53:03 UTC+1 skrev David Wahlstedt: >> Hi, >> I am still quite inexperienced in go programming, and I find it quite >> frustrating, sometimes, to find what will actually be executed by a call to >> an interface method found in some arbitrary code. >> Here I have traced the process of finding the definition of "conn.Close()" >> an instance of an interface method call. This is what I would like to have >> automatized by godef, for instance. >> Is there anything like that out there that does it with one command / key >> stroke, etc, automagically ? >> Godef and go-guru does not, as far as I know. >> >> BR, >> David >> >> Here follows some anonymized code: >> (please forgive me if I've made some errors, I hope you get the idea anyway) >> >> In the file file1.go:1234 in the library lib1, I found a call: >> : _ = conn.Close() >> How do i figure out what happens when this line is executed? >> Here is a list of steps to find it "mechanically", so to say: >> 1. file1.go:1234 >> : func returnConn(conn lib2.Conn) { >> : _ = conn.Close() >> : } >> >> Using godef-jump on the Close() will just give me the interface >> declaration. I can use go-guru-implements, and get a list of >> possible implementations of Close, but how do I know which one will >> actually be used? So, let's figure out the actual type of conn. >> I use go-guru-referrers on returnConn, and choose one of the hits, >> which is file1.go:206 >> >> 2. file1.go:206 >> : func (r *Record) Release(foo bar.T1) error { >> : ... >> : var conn lib2.Conn >> : if conn, err = r.foo.getConn(baz); err != nil { >> : return err >> : } >> : defer returnConn(conn) >> conn gets its value from getConn, so I end up in file1.go:1074 >> >> 3. file1.go:1074 >> : func (foo *FOO) getConn(mu T2) (lib2.Conn, error) { >> : ... >> : conn := foo.connBax.Get() >> : ... >> : return conn, nil >> conn gets its value from Get(), so I go to file3.go:178 >> >> 4. file3.go:178 >> : func (p *Bax) Get() Conn { >> : ... >> : return &xooConn{x: p, xc: xc} >> I find the return value and go to its definition in file3.go:371 >> >> 5. file3.go:371 >> : type xooConn struct { >> : x *Bax >> : xc *baxConn >> : s T3 >> : } >> Aaah! This is the type of conn at file1.go:1234! >> >> 6. file1.go:1234 >> : _ = conn.Close() >> Now I can follow the "definition" of Close() using godef-jump, and >> end up in file1.go:30: >> >> 7. file1.go:30 >> : type Conn interface { >> : Close() error >> >> I use go-guru-implements to see a list of possible implementations: >> : PATH1/lib2/dir1/file1.go:30.2-30.6: abstract method func >> (ConnWithTimeout).Close() error >> : PATH1/lib2/dir1/file3.go:394.23-394.27: is implemented by >> method (*xooConn).Close >> : PATH1/lib2/dir1/conn.go:304.16-304.20: is implemented by method >> (*conn).Close >> : PATH1/lib2/dir1/boo.go:12.3-45.6: is implemented by method >> (*booingConn).Close >> : PATH1/lib2/dir1/file3.go:510.21-510.25: is implemented by >> method (errorConn).Close >> : PATH1/lib2/dir1/file1.go:30.2-30.6: implements method (Conn).Close >> : PATH2/bah.go:78.9-101.2: implements method (bah.Closer).Close >> Now, since I know the type is *xooConn, I can jump to the right hit, >> and go to file3.go:394. >> 8. file3.go:394 >> : func (ac *xooConn) Close() error { >> : pc := ac.pc >> : ... >> : return nil >> Yes, here it is, at step 8!!!! >> > > -- > 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. > For more options, visit https://groups.google.com/d/optout. -- 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. For more options, visit https://groups.google.com/d/optout.