// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package source import ( "context" "fmt" "go/token" "go/types" ) func Hover(ctx context.Context, f File, pos token.Pos) (string, Range, error) { fAST, err := f.GetAST() if err != nil { return "", Range{}, err } pkg, err := f.GetPackage() if err != nil { return "", Range{}, err } i, err := findIdentifier(fAST, pos) if err != nil { return "", Range{}, err } if i.ident == nil { return "", Range{}, fmt.Errorf("not a valid identifier") } obj := pkg.TypesInfo.ObjectOf(i.ident) if obj == nil { return "", Range{}, fmt.Errorf("no object") } if i.wasEmbeddedField { // the original position was on the embedded field declaration // so we try to dig out the type and jump to that instead if v, ok := obj.(*types.Var); ok { if n, ok := v.Type().(*types.Named); ok { obj = n.Obj() } } } // TODO(rstambler): Add documentation and improve quality of object string. content := types.ObjectString(obj, qualifier(fAST, pkg.Types, pkg.TypesInfo)) markdown := "```go\n" + content + "\n```" return markdown, Range{ Start: i.ident.Pos(), End: i.ident.End(), }, nil }