mirror of
https://github.com/golang/go
synced 2024-11-18 21:24:44 -07:00
b8f202ca5e
This adds support for calling links from the gopls command line, e.g. $ gopls links ~/tmp/foo/main.go Optional arguments are: -json, which emits range and uri in JSON With no arguments, a unique list of links are emitted. Updates golang/go#32875 Change-Id: I1e7cbf00a636c05ccf21bd544d9a5b7742d5d70b GitHub-Last-Rev: 7ed1e4612186bce4077d3c73f2407cf6def211d9 GitHub-Pull-Request: golang/tools#181 Reviewed-on: https://go-review.googlesource.com/c/tools/+/203297 Reviewed-by: Rebecca Stambler <rstambler@golang.org> Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
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 ""
|
|
}
|