1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
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)
}
|