internal/lsp/source: check for nil objects in call hierarchy
Fixes golang/go#49125
Change-Id: Id91415377240ab87aeaddb9d668281509d073510
Reviewed-on: https://go-review.googlesource.com/c/tools/+/358549
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/gopls/internal/regtest/misc/call_hierarchy_test.go b/gopls/internal/regtest/misc/call_hierarchy_test.go
new file mode 100644
index 0000000..9d98896
--- /dev/null
+++ b/gopls/internal/regtest/misc/call_hierarchy_test.go
@@ -0,0 +1,35 @@
+// Copyright 2021 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 misc
+
+import (
+ "testing"
+
+ "golang.org/x/tools/internal/lsp/protocol"
+ . "golang.org/x/tools/internal/lsp/regtest"
+)
+
+// Test for golang/go#49125
+func TestCallHierarchy_Issue49125(t *testing.T) {
+ const files = `
+-- go.mod --
+module mod.com
+
+go 1.12
+-- p.go --
+package pkg
+`
+ // TODO(rfindley): this could probably just be a marker test.
+ Run(t, files, func(t *testing.T, env *Env) {
+ env.OpenFile("p.go")
+ pos := env.RegexpSearch("p.go", "pkg")
+
+ var params protocol.CallHierarchyPrepareParams
+ params.TextDocument.URI = env.Sandbox.Workdir.URI("p.go")
+ params.Position = pos.ToProtocolPosition()
+
+ // Check that this doesn't panic.
+ env.Editor.Server.PrepareCallHierarchy(env.Ctx, ¶ms)
+ })
+}
diff --git a/internal/lsp/source/call_hierarchy.go b/internal/lsp/source/call_hierarchy.go
index 26ef07e..991c30a 100644
--- a/internal/lsp/source/call_hierarchy.go
+++ b/internal/lsp/source/call_hierarchy.go
@@ -32,8 +32,9 @@
}
return nil, err
}
+
// The identifier can be nil if it is an import spec.
- if identifier == nil {
+ if identifier == nil || identifier.Declaration.obj == nil {
return nil, nil
}