mirror of
https://github.com/golang/go
synced 2024-11-19 02:34:44 -07:00
20f46356b3
In the ideal future, users will have one or more gopls instances, each serving potentially many LSP clients. In order to have any hope of navigating this web, clients and servers must know about eachother. To allow for such an exchange of information, this CL adds an additional handler layer to the serving configured in the lsprpc package. For now, forwarders just use this layer to execute a handshake with the LSP server, communicating the location of their logs and debug addresses. Updates golang/go#34111 Change-Id: Ic7432062c01a8bbd52fb4a058a95bbf5dc26baa3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/220081 Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Heschi Kreinick <heschi@google.com>
65 lines
1.5 KiB
Go
65 lines
1.5 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 cache
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"golang.org/x/tools/internal/lsp/debug"
|
|
"golang.org/x/tools/internal/span"
|
|
)
|
|
|
|
type debugView struct{ *view }
|
|
|
|
func (v debugView) ID() string { return v.id }
|
|
func (v debugView) Session() debug.Session { return DebugSession{v.session} }
|
|
func (v debugView) Env() []string { return v.Options().Env }
|
|
|
|
type DebugSession struct{ *Session }
|
|
|
|
func (s DebugSession) ID() string { return s.id }
|
|
func (s DebugSession) Cache() debug.Cache { return debugCache{s.cache} }
|
|
func (s DebugSession) Files() []*debug.File {
|
|
var files []*debug.File
|
|
seen := make(map[span.URI]*debug.File)
|
|
s.overlayMu.Lock()
|
|
defer s.overlayMu.Unlock()
|
|
for _, overlay := range s.overlays {
|
|
f, ok := seen[overlay.uri]
|
|
if !ok {
|
|
f = &debug.File{Session: s, URI: overlay.uri}
|
|
seen[overlay.uri] = f
|
|
files = append(files, f)
|
|
}
|
|
f.Data = string(overlay.text)
|
|
f.Error = nil
|
|
f.Hash = overlay.hash
|
|
}
|
|
sort.Slice(files, func(i int, j int) bool {
|
|
return files[i].URI < files[j].URI
|
|
})
|
|
return files
|
|
}
|
|
|
|
func (s DebugSession) File(hash string) *debug.File {
|
|
s.overlayMu.Lock()
|
|
defer s.overlayMu.Unlock()
|
|
for _, overlay := range s.overlays {
|
|
if overlay.hash == hash {
|
|
return &debug.File{
|
|
Session: s,
|
|
URI: overlay.uri,
|
|
Data: string(overlay.text),
|
|
Error: nil,
|
|
Hash: overlay.hash,
|
|
}
|
|
}
|
|
}
|
|
return &debug.File{
|
|
Session: s,
|
|
Hash: hash,
|
|
}
|
|
}
|