| Just because a package (e.g. log) is imported by the caller, |
| and the name log is in scope, doesn't mean the name in scope |
| refers to the package: it could be locally shadowed. |
| |
| In all three scenarios below, renaming import with a fresh name is |
| added because the usual name is locally shadowed: in cases 1, 2 an |
| existing import is shadowed by (respectively) a local constant, |
| parameter; in case 3 there is no existing import. |
| |
| -- go.mod -- |
| module testdata |
| go 1.12 |
| |
| -- a/a.go -- |
| package a |
| |
| import "testdata/b" |
| import "log" |
| |
| func A() { |
| const log = "shadow" |
| b.B() //@ inline(re"B", bresult) |
| } |
| |
| var _ log.Logger |
| |
| -- b/b.go -- |
| package b |
| |
| import "log" |
| |
| func B() { |
| log.Printf("") |
| } |
| |
| -- bresult -- |
| package a |
| |
| import ( |
| "log" |
| log0 "log" |
| ) |
| |
| func A() { |
| const log = "shadow" |
| log0.Printf("") //@ inline(re"B", bresult) |
| } |
| |
| var _ log.Logger |
| |
| -- go.mod -- |
| module testdata |
| go 1.12 |
| |
| -- a/a.go -- |
| package a |
| |
| import "testdata/b" |
| |
| var x b.T |
| |
| func A(b int) { |
| x.F() //@ inline(re"F", fresult) |
| } |
| |
| -- b/b.go -- |
| package b |
| |
| type T struct{} |
| |
| func (T) F() { |
| One() |
| Two() |
| } |
| |
| func One() {} |
| func Two() {} |
| |
| -- fresult -- |
| package a |
| |
| import ( |
| "testdata/b" |
| b0 "testdata/b" |
| ) |
| |
| var x b.T |
| |
| func A(b int) { |
| b0.One() |
| b0.Two() //@ inline(re"F", fresult) |
| } |
| |
| -- d/d.go -- |
| package d |
| |
| import "testdata/e" |
| |
| func D() { |
| const log = "shadow" |
| e.E() //@ inline(re"E", eresult) |
| } |
| |
| -- e/e.go -- |
| package e |
| |
| import "log" |
| |
| func E() { |
| log.Printf("") |
| } |
| |
| -- eresult -- |
| package d |
| |
| import ( |
| log0 "log" |
| ) |
| |
| func D() { |
| const log = "shadow" |
| log0.Printf("") //@ inline(re"E", eresult) |
| } |