1
0
mirror of https://github.com/golang/go synced 2024-11-18 14:54:40 -07:00

internal/lsp: process configuration per workspace folder

Change-Id: Ibd72a13166b65e418a40bf850401573a6b9caf0f
Reviewed-on: https://go-review.googlesource.com/c/tools/+/187819
Run-TryBot: Ian Cottrell <iancottrell@google.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Ian Cottrell 2019-07-27 11:59:14 -07:00 committed by Ian Cottrell
parent db2fa46ec3
commit fc6e2057e7
3 changed files with 42 additions and 17 deletions

View File

@ -23,10 +23,10 @@ import (
func (s *Server) initialize(ctx context.Context, params *protocol.InitializeParams) (*protocol.InitializeResult, error) {
s.initializedMu.Lock()
defer s.initializedMu.Unlock()
if s.isInitialized {
if s.state >= serverInitializing {
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidRequest, "server already initialized")
}
s.isInitialized = true // mark server as initialized now
s.state = serverInitializing
// TODO: Remove the option once we are certain there are no issues here.
s.textDocumentSyncKind = protocol.Incremental
@ -140,16 +140,7 @@ func (s *Server) initialized(ctx context.Context, params *protocol.InitializedPa
})
}
for _, view := range s.session.Views() {
config, err := s.client.Configuration(ctx, &protocol.ConfigurationParams{
Items: []protocol.ConfigurationItem{{
ScopeURI: protocol.NewURI(view.Folder()),
Section: "gopls",
}},
})
if err != nil {
return err
}
if err := s.processConfig(ctx, view, config[0]); err != nil {
if err := s.fetchConfig(ctx, view); err != nil {
return err
}
}
@ -160,6 +151,28 @@ func (s *Server) initialized(ctx context.Context, params *protocol.InitializedPa
return nil
}
func (s *Server) fetchConfig(ctx context.Context, view source.View) error {
configs, err := s.client.Configuration(ctx, &protocol.ConfigurationParams{
Items: []protocol.ConfigurationItem{{
ScopeURI: protocol.NewURI(view.Folder()),
Section: "gopls",
}, {
ScopeURI: protocol.NewURI(view.Folder()),
Section: view.Name(),
},
},
})
if err != nil {
return err
}
for _, config := range configs {
if err := s.processConfig(ctx, view, config); err != nil {
return err
}
}
return nil
}
func (s *Server) processConfig(ctx context.Context, view source.View, config interface{}) error {
// TODO: We should probably store and process more of the config.
if config == nil {
@ -238,17 +251,17 @@ func (s *Server) processConfig(ctx context.Context, view source.View, config int
func (s *Server) shutdown(ctx context.Context) error {
s.initializedMu.Lock()
defer s.initializedMu.Unlock()
if !s.isInitialized {
if s.state < serverInitialized {
return jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidRequest, "server not initialized")
}
// drop all the active views
s.session.Shutdown(ctx)
s.isInitialized = false
s.state = serverShutDown
return nil
}
func (s *Server) exit(ctx context.Context) error {
if s.isInitialized {
if s.state != serverShutDown {
os.Exit(1)
}
os.Exit(0)

View File

@ -60,12 +60,21 @@ func (s *Server) Run(ctx context.Context) error {
return s.Conn.Run(ctx)
}
type serverState int
const (
serverCreated = serverState(iota)
serverInitializing // set once the server has received "initialize" request
serverInitialized // set once the server has received "initialized" request
serverShutDown
)
type Server struct {
Conn *jsonrpc2.Conn
client protocol.Client
initializedMu sync.Mutex
isInitialized bool // set once the server has received "initialize" request
state serverState
// Configurations.
// TODO(rstambler): Separate these into their own struct?

View File

@ -31,6 +31,9 @@ func (s *Server) changeFolders(ctx context.Context, event protocol.WorkspaceFold
}
func (s *Server) addView(ctx context.Context, name string, uri span.URI) error {
s.session.NewView(ctx, name, uri)
view := s.session.NewView(ctx, name, uri)
if s.state >= serverInitialized {
s.fetchConfig(ctx, view)
}
return nil
}