--- /dev/null
+// 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 regtest
+
+import (
+ "encoding/json"
+ "fmt"
+
+ "golang.org/x/tools/internal/lsp/fake"
+ "golang.org/x/tools/internal/lsp/protocol"
+)
+
+// expSymbolInformation and the types it references are pointer-based versions
+// of fake.SymbolInformation, used to make it easier to partially assert
+// against values of type fake.SymbolInformation
+
+// expSymbolInformation is a pointer-based version of fake.SymbolInformation
+type expSymbolInformation struct {
+ Name *string
+ Kind *protocol.SymbolKind
+ Location *expLocation
+}
+
+func (e *expSymbolInformation) matchAgainst(sis []fake.SymbolInformation) bool {
+ for _, si := range sis {
+ if e.match(si) {
+ return true
+ }
+ }
+ return false
+}
+
+func (e *expSymbolInformation) match(si fake.SymbolInformation) bool {
+ if e.Name != nil && *e.Name != si.Name {
+ return false
+ }
+ if e.Kind != nil && *e.Kind != si.Kind {
+ return false
+ }
+ if e.Location != nil && !e.Location.match(si.Location) {
+ return false
+ }
+ return true
+}
+
+func (e *expSymbolInformation) String() string {
+ byts, err := json.MarshalIndent(e, "", " ")
+ if err != nil {
+ panic(fmt.Errorf("failed to json.Marshal *expSymbolInformation: %v", err))
+ }
+ return string(byts)
+}
+
+// expLocation is a pointer-based version of fake.Location
+type expLocation struct {
+ Path *string
+ Range *expRange
+}
+
+func (e *expLocation) match(l fake.Location) bool {
+ if e.Path != nil && *e.Path != l.Path {
+ return false
+ }
+ if e.Range != nil && !e.Range.match(l.Range) {
+ return false
+ }
+ return true
+}
+
+// expRange is a pointer-based version of fake.Range
+type expRange struct {
+ Start *expPos
+ End *expPos
+}
+
+func (e *expRange) match(l fake.Range) bool {
+ if e.Start != nil && !e.Start.match(l.Start) {
+ return false
+ }
+ if e.End != nil && !e.End.match(l.End) {
+ return false
+ }
+ return true
+}
+
+// expPos is a pointer-based version of fake.Pos
+type expPos struct {
+ Line *int
+ Column *int
+}
+
+func (e *expPos) match(l fake.Pos) bool {
+ if e.Line != nil && *e.Line != l.Line {
+ return false
+ }
+ if e.Column != nil && *e.Column != l.Column {
+ return false
+ }
+ return true
+}
+
+func pString(s string) *string {
+ return &s
+}
+
+func pInt(i int) *int {
+ return &i
+}
+
+func pKind(k protocol.SymbolKind) *protocol.SymbolKind {
+ return &k
+}