| // Copyright 2019 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 tests |
| |
| import ( |
| "fmt" |
| "go/token" |
| |
| "golang.org/x/tools/internal/lsp/protocol" |
| "golang.org/x/tools/internal/span" |
| ) |
| |
| // DiffLinks takes the links we got and checks if they are located within the source or a Note. |
| // If the link is within a Note, the link is removed. |
| // Returns an diff comment if there are differences and empty string if no diffs |
| func DiffLinks(mapper *protocol.ColumnMapper, wantLinks []Link, gotLinks []protocol.DocumentLink) string { |
| var notePositions []token.Position |
| links := make(map[span.Span]string, len(wantLinks)) |
| for _, link := range wantLinks { |
| links[link.Src] = link.Target |
| notePositions = append(notePositions, link.NotePosition) |
| } |
| for _, link := range gotLinks { |
| spn, err := mapper.RangeSpan(link.Range) |
| if err != nil { |
| return fmt.Sprintf("%v", err) |
| } |
| linkInNote := false |
| for _, notePosition := range notePositions { |
| // Drop the links found inside expectation notes arguments as this links are not collected by expect package |
| if notePosition.Line == spn.Start().Line() && |
| notePosition.Column <= spn.Start().Column() { |
| delete(links, spn) |
| linkInNote = true |
| } |
| } |
| if linkInNote { |
| continue |
| } |
| if target, ok := links[spn]; ok { |
| delete(links, spn) |
| if target != link.Target { |
| return fmt.Sprintf("for %v want %v, got %v\n", spn, link.Target, target) |
| } |
| } else { |
| return fmt.Sprintf("unexpected link %v:%v\n", spn, link.Target) |
| } |
| } |
| for spn, target := range links { |
| return fmt.Sprintf("missing link %v:%v\n", spn, target) |
| } |
| return "" |
| } |