| // 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 |
| } |