mirror of
https://github.com/golang/go
synced 2024-11-19 02:34:44 -07:00
56 lines
1.7 KiB
Go
56 lines
1.7 KiB
Go
|
// 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 ""
|
||
|
}
|