| Regression test for 'references' bug golang/go#58506. |
| |
| The 'references' query below, applied to method A.F, implicitly uses |
| the 'implementation' operation. The correct response includes two |
| references to B.F, one from package b and one from package d. |
| However, the incremental 'implementation' algorithm had a bug that |
| cause it to fail to report the reference from package b. |
| |
| The reason was that the incremental implementation uses different |
| algorithms for the local and global cases (with disjoint results), and |
| that when it discovered that type A satisfies interface B and thus |
| that B.F must be included among the global search targets, the |
| implementation forgot to also search package b for local references |
| to B.F. |
| |
| -- go.mod -- |
| module example.com |
| go 1.12 |
| |
| -- a/a.go -- |
| package a |
| |
| type A int |
| |
| func (A) F() {} //@loc(refa, "F"), refs("F", refa, refb, refd) |
| |
| -- b/b.go -- |
| package b |
| |
| import ( |
| "example.com/a" |
| "example.com/c" |
| ) |
| |
| type B interface{ F() } |
| |
| var _ B = a.A(0) |
| var _ B = c.C(0) |
| |
| var _ = B.F //@loc(refb, "F") |
| |
| -- c/c.go -- |
| package c |
| |
| type C int |
| |
| // Even though C.F is "rename coupled" to A.F by B.F, |
| // it should not be among the results. |
| func (C) F() {} |
| |
| -- d/d.go -- |
| package d |
| |
| import "example.com/b" |
| |
| var _ interface{} = b.B.F //@loc(refd, "F") |