diff --git a/oracle/describe.go b/oracle/describe.go index ac36c120..dc409dba 100644 --- a/oracle/describe.go +++ b/oracle/describe.go @@ -448,19 +448,36 @@ type describeValueResult struct { } func (r *describeValueResult) display(printf printfFunc) { - suffix := "" + var prefix, suffix string if r.constVal != nil { suffix = fmt.Sprintf(" of constant value %s", r.constVal) } + switch obj := r.obj.(type) { + case *types.Func: + if recv := obj.Type().(*types.Signature).Recv(); recv != nil { + if _, ok := recv.Type().Underlying().(*types.Interface); ok { + prefix = "interface method " + } else { + prefix = "method " + } + } + + case *types.Var: + // TODO(adonovan): go/types should make it simple to + // ask: IsStructField(*Var)? + if false { + prefix = "struct field " + } + } // Describe the expression. if r.obj != nil { if r.obj.Pos() == r.expr.Pos() { // defining ident - printf(r.expr, "definition of %s%s", r.obj, suffix) + printf(r.expr, "definition of %s%s%s", prefix, r.obj, suffix) } else { // referring ident - printf(r.expr, "reference to %s%s", r.obj, suffix) + printf(r.expr, "reference to %s%s%s", prefix, r.obj, suffix) if def := r.obj.Pos(); def != token.NoPos { printf(def, "defined here") } diff --git a/oracle/json/json.go b/oracle/json/json.go index 96135ce5..bf0efbbe 100644 --- a/oracle/json/json.go +++ b/oracle/json/json.go @@ -116,9 +116,9 @@ type DescribePTALabel struct { // set of "labels" it points to. // type DescribePointer struct { - Type string `json:"type"` // (concrete) type of the pointer - NamePos string `json:"namepos"` // location of type defn, if Named - Labels []DescribePTALabel `json:"labels,omitempty"` // pointed-to objects + Type string `json:"type"` // (concrete) type of the pointer + NamePos string `json:"namepos,omitempty"` // location of type defn, if Named + Labels []DescribePTALabel `json:"labels,omitempty"` // pointed-to objects } // A DescribeValue is the additional result of a 'describe' query diff --git a/oracle/testdata/src/main/describe-json.golden b/oracle/testdata/src/main/describe-json.golden index f623f6e7..3a28beb4 100644 --- a/oracle/testdata/src/main/describe-json.golden +++ b/oracle/testdata/src/main/describe-json.golden @@ -95,7 +95,6 @@ "pts": [ { "type": "*int", - "namepos": "", "labels": [ { "pos": "testdata/src/main/describe-json.go:10:6", diff --git a/oracle/testdata/src/main/describe.golden b/oracle/testdata/src/main/describe.golden index a1e86571..07f64997 100644 --- a/oracle/testdata/src/main/describe.golden +++ b/oracle/testdata/src/main/describe.golden @@ -35,15 +35,15 @@ reference to func describe.main() defined here -------- @describe func-ref-*C.f -------- -reference to func (*describe.C).f() +reference to method func (*describe.C).f() defined here -------- @describe func-ref-D.f -------- -reference to func (describe.D).f() +reference to method func (describe.D).f() defined here -------- @describe func-ref-I.f -------- -reference to func (describe.I).f() +reference to interface method func (describe.I).f() defined here -------- @describe type-D -------- @@ -59,11 +59,11 @@ Method set: method (describe.I) f() -------- @describe func-ref-d.f -------- -reference to func (describe.D).f() +reference to method func (describe.D).f() defined here -------- @describe func-ref-i.f -------- -reference to func (describe.I).f() +reference to interface method func (describe.I).f() defined here -------- @describe ref-lexical-d -------- diff --git a/oracle/testdata/src/main/imports.golden b/oracle/testdata/src/main/imports.golden index 39c13e2e..73f5f9df 100644 --- a/oracle/testdata/src/main/imports.golden +++ b/oracle/testdata/src/main/imports.golden @@ -27,7 +27,7 @@ Method set: method (lib.Type) Method(x *int) *int -------- @describe ref-method -------- -reference to func (lib.Type).Method(x *int) *int +reference to method func (lib.Type).Method(x *int) *int defined here -------- @describe p --------