go.tools/oracle: use TypeString, ObjectString to print relative (unqualified) names when a package is implied by the context.
+ a couple more tests. R=gri, crawshaw CC=golang-dev https://golang.org/cl/26370046
This commit is contained in:
parent
9fcd20e680
commit
f488a2c4f5
|
|
@ -479,10 +479,10 @@ func (r *describeValueResult) display(printf printfFunc) {
|
|||
if r.obj != nil {
|
||||
if r.obj.Pos() == r.expr.Pos() {
|
||||
// defining ident
|
||||
printf(r.expr, "definition of %s%s%s", prefix, r.obj, suffix)
|
||||
printf(r.expr, "definition of %s%s%s", prefix, r.qpos.ObjectString(r.obj), suffix)
|
||||
} else {
|
||||
// referring ident
|
||||
printf(r.expr, "reference to %s%s%s", prefix, r.obj, suffix)
|
||||
printf(r.expr, "reference to %s%s%s", prefix, r.qpos.ObjectString(r.obj), suffix)
|
||||
if def := r.obj.Pos(); def != token.NoPos {
|
||||
printf(def, "defined here")
|
||||
}
|
||||
|
|
@ -494,7 +494,7 @@ func (r *describeValueResult) display(printf printfFunc) {
|
|||
printf(r.expr, "%s%s", desc, suffix)
|
||||
} else {
|
||||
// non-constant expression
|
||||
printf(r.expr, "%s of type %s", desc, r.typ)
|
||||
printf(r.expr, "%s of type %s", desc, r.qpos.TypeString(r.typ))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -514,17 +514,17 @@ func (r *describeValueResult) display(printf printfFunc) {
|
|||
// reflect.Value expression.
|
||||
|
||||
if len(r.ptrs) > 0 {
|
||||
printf(r.qpos, "this %s may contain these dynamic types:", r.typ)
|
||||
printf(r.qpos, "this %s may contain these dynamic types:", r.qpos.TypeString(r.typ))
|
||||
for _, ptr := range r.ptrs {
|
||||
var obj types.Object
|
||||
if nt, ok := deref(ptr.typ).(*types.Named); ok {
|
||||
obj = nt.Obj()
|
||||
}
|
||||
if len(ptr.labels) > 0 {
|
||||
printf(obj, "\t%s, may point to:", ptr.typ)
|
||||
printf(obj, "\t%s, may point to:", r.qpos.TypeString(ptr.typ))
|
||||
printLabels(printf, ptr.labels, "\t\t")
|
||||
} else {
|
||||
printf(obj, "\t%s", ptr.typ)
|
||||
printf(obj, "\t%s", r.qpos.TypeString(ptr.typ))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -567,7 +567,7 @@ func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet)
|
|||
})
|
||||
}
|
||||
pts = append(pts, &serial.DescribePointer{
|
||||
Type: ptr.typ.String(),
|
||||
Type: r.qpos.TypeString(ptr.typ),
|
||||
NamePos: namePos,
|
||||
Labels: labels,
|
||||
})
|
||||
|
|
@ -578,7 +578,7 @@ func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet)
|
|||
Pos: fset.Position(r.expr.Pos()).String(),
|
||||
Detail: "value",
|
||||
Value: &serial.DescribeValue{
|
||||
Type: r.typ.String(),
|
||||
Type: r.qpos.TypeString(r.typ),
|
||||
Value: value,
|
||||
ObjPos: objpos,
|
||||
PTAErr: ptaerr,
|
||||
|
|
@ -620,20 +620,19 @@ func describeType(o *Oracle, qpos *QueryPos, path []ast.Node) (*describeTypeResu
|
|||
t = qpos.info.TypeOf(n)
|
||||
switch t := t.(type) {
|
||||
case *types.Basic:
|
||||
description = "reference to built-in type " + t.String()
|
||||
description = "reference to built-in "
|
||||
|
||||
case *types.Named:
|
||||
isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above
|
||||
if isDef {
|
||||
description = "definition of type " + t.String()
|
||||
description = "definition of "
|
||||
} else {
|
||||
description = "reference to type " + t.String()
|
||||
description = "reference to "
|
||||
}
|
||||
}
|
||||
|
||||
case ast.Expr:
|
||||
t = qpos.info.TypeOf(n)
|
||||
description = "type " + t.String()
|
||||
|
||||
default:
|
||||
// Unreachable?
|
||||
|
|
@ -641,14 +640,16 @@ func describeType(o *Oracle, qpos *QueryPos, path []ast.Node) (*describeTypeResu
|
|||
}
|
||||
|
||||
return &describeTypeResult{
|
||||
qpos: qpos,
|
||||
node: path[0],
|
||||
description: description,
|
||||
description: description + "type " + qpos.TypeString(t),
|
||||
typ: t,
|
||||
methods: accessibleMethods(t, qpos.info.Pkg),
|
||||
}, nil
|
||||
}
|
||||
|
||||
type describeTypeResult struct {
|
||||
qpos *QueryPos
|
||||
node ast.Node
|
||||
description string
|
||||
typ types.Type
|
||||
|
|
@ -660,7 +661,7 @@ func (r *describeTypeResult) display(printf printfFunc) {
|
|||
|
||||
// Show the underlying type for a reference to a named type.
|
||||
if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() {
|
||||
printf(nt.Obj(), "defined as %s", nt.Underlying())
|
||||
printf(nt.Obj(), "defined as %s", r.qpos.TypeString(nt.Underlying()))
|
||||
}
|
||||
|
||||
// Print the method set, if the type kind is capable of bearing methods.
|
||||
|
|
@ -688,7 +689,7 @@ func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) {
|
|||
Pos: fset.Position(r.node.Pos()).String(),
|
||||
Detail: "type",
|
||||
Type: &serial.DescribeType{
|
||||
Type: r.typ.String(),
|
||||
Type: r.qpos.TypeString(r.typ),
|
||||
NamePos: namePos,
|
||||
NameDef: nameDef,
|
||||
Methods: methodsToSerial(r.methods, fset),
|
||||
|
|
|
|||
|
|
@ -110,6 +110,16 @@ type QueryPos struct {
|
|||
path []ast.Node // AST path from query node to root of ast.File
|
||||
}
|
||||
|
||||
// TypeString prints type T relative to the query position.
|
||||
func (qpos *QueryPos) TypeString(T types.Type) string {
|
||||
return types.TypeString(qpos.info.Pkg, T)
|
||||
}
|
||||
|
||||
// ObjectString prints object obj relative to the query position.
|
||||
func (qpos *QueryPos) ObjectString(obj types.Object) string {
|
||||
return types.ObjectString(qpos.info.Pkg, obj)
|
||||
}
|
||||
|
||||
// A Result encapsulates the result of an oracle.Query.
|
||||
type Result struct {
|
||||
fset *token.FileSet
|
||||
|
|
@ -244,7 +254,7 @@ func newOracle(imp *importer.Importer, args []string, ptalog io.Writer, needs in
|
|||
o.typeInfo = m
|
||||
}
|
||||
|
||||
// Create SSA package for the initial package and its dependencies.
|
||||
// Create SSA package for the initial packages and their dependencies.
|
||||
if needs&needSSA != 0 {
|
||||
start = time.Now()
|
||||
|
||||
|
|
|
|||
|
|
@ -101,11 +101,11 @@
|
|||
"pos": "testdata/src/main/describe-json.go:18:6",
|
||||
"detail": "value",
|
||||
"value": {
|
||||
"type": "describe.I",
|
||||
"type": "I",
|
||||
"objpos": "testdata/src/main/describe-json.go:14:6",
|
||||
"pts": [
|
||||
{
|
||||
"type": "*describe.D",
|
||||
"type": "*D",
|
||||
"namepos": "testdata/src/main/describe-json.go:28:6",
|
||||
"labels": [
|
||||
{
|
||||
|
|
@ -115,7 +115,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"type": "describe.C",
|
||||
"type": "C",
|
||||
"namepos": "testdata/src/main/describe-json.go:27:6"
|
||||
}
|
||||
]
|
||||
|
|
@ -133,11 +133,11 @@
|
|||
{
|
||||
"mode": "describe",
|
||||
"describe": {
|
||||
"desc": "definition of type describe.C",
|
||||
"desc": "definition of type C",
|
||||
"pos": "testdata/src/main/describe-json.go:27:6",
|
||||
"detail": "type",
|
||||
"type": {
|
||||
"type": "describe.C",
|
||||
"type": "C",
|
||||
"namepos": "testdata/src/main/describe-json.go:27:6",
|
||||
"namedef": "int",
|
||||
"methods": [
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ package describe // @describe pkgdecl "describe"
|
|||
|
||||
type cake float64 // @describe type-ref-builtin "float64"
|
||||
|
||||
const c = iota // @describe const-ref-iota "iota"
|
||||
|
||||
const pi = 3.141 // @describe const-def-pi "pi"
|
||||
const pie = cake(pi) // @describe const-def-pie "pie"
|
||||
const _ = pi // @describe const-ref-pi "pi"
|
||||
|
|
@ -65,6 +67,8 @@ func main() { // @describe func-def-main "main"
|
|||
|
||||
defer main() // @describe defer-stmt "defer"
|
||||
go main() // @describe go-stmt "go"
|
||||
|
||||
panic(3) // @describe builtin-ref-panic "panic"
|
||||
}
|
||||
|
||||
func deadcode() {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ definition of package "describe"
|
|||
method (describe.D) f()
|
||||
type I interface{f()}
|
||||
method (describe.I) f()
|
||||
const c untyped integer = 0
|
||||
type cake float64
|
||||
func deadcode func()
|
||||
var global *string
|
||||
|
|
@ -16,64 +17,67 @@ definition of package "describe"
|
|||
-------- @describe type-ref-builtin --------
|
||||
reference to built-in type float64
|
||||
|
||||
-------- @describe const-ref-iota --------
|
||||
reference to const iota untyped integer of constant value 0
|
||||
|
||||
-------- @describe const-def-pi --------
|
||||
definition of const pi untyped float
|
||||
|
||||
-------- @describe const-def-pie --------
|
||||
definition of const pie describe.cake
|
||||
definition of const pie cake
|
||||
|
||||
-------- @describe const-ref-pi --------
|
||||
reference to const pi untyped float of constant value 3141/1000
|
||||
defined here
|
||||
|
||||
-------- @describe func-def-main --------
|
||||
definition of func describe.main()
|
||||
definition of func main()
|
||||
|
||||
-------- @describe func-ref-main --------
|
||||
reference to func describe.main()
|
||||
reference to func main()
|
||||
defined here
|
||||
|
||||
-------- @describe func-ref-*C.f --------
|
||||
reference to method func (*describe.C).f()
|
||||
reference to method func (*C).f()
|
||||
defined here
|
||||
|
||||
-------- @describe func-ref-D.f --------
|
||||
reference to method func (describe.D).f()
|
||||
reference to method func (D).f()
|
||||
defined here
|
||||
|
||||
-------- @describe func-ref-I.f --------
|
||||
reference to interface method func (describe.I).f()
|
||||
reference to interface method func (I).f()
|
||||
defined here
|
||||
|
||||
-------- @describe type-D --------
|
||||
reference to type describe.D
|
||||
reference to type D
|
||||
defined as struct{}
|
||||
Method set:
|
||||
method (describe.D) f()
|
||||
|
||||
-------- @describe type-I --------
|
||||
reference to type describe.I
|
||||
reference to type I
|
||||
defined as interface{f()}
|
||||
Method set:
|
||||
method (describe.I) f()
|
||||
|
||||
-------- @describe func-ref-d.f --------
|
||||
reference to method func (describe.D).f()
|
||||
reference to method func (D).f()
|
||||
defined here
|
||||
|
||||
-------- @describe func-ref-i.f --------
|
||||
reference to interface method func (describe.I).f()
|
||||
reference to interface method func (I).f()
|
||||
defined here
|
||||
|
||||
-------- @describe ref-lexical-d --------
|
||||
reference to var d describe.D
|
||||
reference to var d D
|
||||
defined here
|
||||
|
||||
-------- @describe ref-anon --------
|
||||
reference to var anon func()
|
||||
defined here
|
||||
value may point to these labels:
|
||||
func@29.10
|
||||
func@31.10
|
||||
|
||||
-------- @describe ref-global --------
|
||||
reference to var global *string
|
||||
|
|
@ -105,42 +109,42 @@ value may point to these labels:
|
|||
b
|
||||
|
||||
-------- @describe var-ref-i-C --------
|
||||
reference to var i describe.I
|
||||
reference to var i I
|
||||
defined here
|
||||
this describe.I may contain these dynamic types:
|
||||
*describe.C, may point to:
|
||||
this I may contain these dynamic types:
|
||||
*C, may point to:
|
||||
new
|
||||
|
||||
-------- @describe var-ref-i-D --------
|
||||
reference to var i describe.I
|
||||
reference to var i I
|
||||
defined here
|
||||
this describe.I may contain these dynamic types:
|
||||
describe.D
|
||||
this I may contain these dynamic types:
|
||||
D
|
||||
|
||||
-------- @describe var-ref-i --------
|
||||
reference to var i describe.I
|
||||
reference to var i I
|
||||
defined here
|
||||
this describe.I may contain these dynamic types:
|
||||
*describe.C, may point to:
|
||||
this I may contain these dynamic types:
|
||||
*C, may point to:
|
||||
new
|
||||
describe.D
|
||||
D
|
||||
|
||||
-------- @describe const-local-pi --------
|
||||
definition of const localpi untyped float
|
||||
|
||||
-------- @describe const-local-pie --------
|
||||
definition of const localpie describe.cake
|
||||
definition of const localpie cake
|
||||
|
||||
-------- @describe const-ref-localpi --------
|
||||
reference to const localpi untyped float of constant value 3141/1000
|
||||
defined here
|
||||
|
||||
-------- @describe type-def-T --------
|
||||
definition of type describe.T
|
||||
definition of type T
|
||||
No methods.
|
||||
|
||||
-------- @describe type-ref-T --------
|
||||
reference to type describe.T
|
||||
reference to type T
|
||||
defined as int
|
||||
No methods.
|
||||
|
||||
|
|
@ -171,6 +175,9 @@ defer statement
|
|||
-------- @describe go-stmt --------
|
||||
go statement
|
||||
|
||||
-------- @describe builtin-ref-panic --------
|
||||
function call (or conversion) of type ()
|
||||
|
||||
-------- @describe var-decl-stmt --------
|
||||
definition of var a int
|
||||
|
||||
|
|
@ -179,7 +186,7 @@ definition of var b *int
|
|||
no points-to information: PTA did not encounter this expression (dead code?)
|
||||
|
||||
-------- @describe def-iface-I --------
|
||||
definition of type describe.I
|
||||
definition of type I
|
||||
Method set:
|
||||
method (describe.I) f()
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import of package "lib"
|
|||
var Var int
|
||||
|
||||
-------- @describe ref-const --------
|
||||
reference to const Const untyped integer
|
||||
reference to const lib.Const untyped integer
|
||||
defined here
|
||||
|
||||
-------- @describe ref-func --------
|
||||
|
|
@ -15,7 +15,7 @@ reference to func lib.Func()
|
|||
defined here
|
||||
|
||||
-------- @describe ref-var --------
|
||||
reference to var Var int
|
||||
reference to var lib.Var int
|
||||
defined here
|
||||
|
||||
-------- @describe ref-type --------
|
||||
|
|
|
|||
Loading…
Reference in New Issue