| // Copyright 2020 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" |
| "go/ast" |
| |
| "golang.org/x/tools/internal/event" |
| "golang.org/x/tools/internal/lsp/debug/tag" |
| "golang.org/x/tools/internal/lsp/protocol" |
| errors "golang.org/x/xerrors" |
| ) |
| |
| // PrepareCallHierarchy returns an array of CallHierarchyItem for a file and the position within the file |
| func PrepareCallHierarchy(ctx context.Context, snapshot Snapshot, fh FileHandle, pos protocol.Position) ([]protocol.CallHierarchyItem, error) { |
| ctx, done := event.Start(ctx, "source.prepareCallHierarchy") |
| defer done() |
| |
| identifier, err := Identifier(ctx, snapshot, fh, pos) |
| if err != nil { |
| if errors.Is(err, ErrNoIdentFound) { |
| event.Log(ctx, err.Error(), tag.Position.Of(pos)) |
| } else { |
| event.Error(ctx, "error getting identifier", err, tag.Position.Of(pos)) |
| } |
| return nil, nil |
| } |
| |
| // if identifier is not of type function |
| _, ok := identifier.Declaration.node.(*ast.FuncDecl) |
| if !ok { |
| event.Log(ctx, "invalid identifier type, expected funtion declaration", tag.Position.Of(pos)) |
| return nil, nil |
| } |
| rng, err := identifier.Range() |
| if err != nil { |
| return nil, err |
| } |
| callHierarchyItem := protocol.CallHierarchyItem{ |
| Name: identifier.Name, |
| Kind: protocol.Function, |
| Tags: []protocol.SymbolTag{}, |
| Detail: "func()", |
| URI: protocol.DocumentURI(fh.URI()), |
| Range: rng, |
| SelectionRange: rng, |
| } |
| return []protocol.CallHierarchyItem{callHierarchyItem}, nil |
| } |
| |
| // IncomingCalls returns an array of CallHierarchyIncomingCall for a file and the position within the file |
| func IncomingCalls(ctx context.Context, snapshot Snapshot, fh FileHandle, pos protocol.Position) ([]protocol.CallHierarchyIncomingCall, error) { |
| ctx, done := event.Start(ctx, "source.incomingCalls") |
| defer done() |
| |
| // TODO: Remove this once the context is used. |
| _ = ctx // avoid staticcheck SA4006 warning |
| |
| return []protocol.CallHierarchyIncomingCall{}, nil |
| } |
| |
| // OutgoingCalls returns an array of CallHierarchyOutgoingCall for a file and the position within the file |
| func OutgoingCalls(ctx context.Context, snapshot Snapshot, fh FileHandle, pos protocol.Position) ([]protocol.CallHierarchyOutgoingCall, error) { |
| ctx, done := event.Start(ctx, "source.outgoingCalls") |
| defer done() |
| |
| // TODO: Remove this once the context is used. |
| _ = ctx // avoid staticcheck SA4006 warning |
| |
| return []protocol.CallHierarchyOutgoingCall{}, nil |
| } |