diff --git a/internal/langserver/handlers/did_change_workspace_folders_test.go b/internal/langserver/handlers/did_change_workspace_folders_test.go new file mode 100644 index 000000000..2efec9f12 --- /dev/null +++ b/internal/langserver/handlers/did_change_workspace_folders_test.go @@ -0,0 +1,53 @@ +package handlers + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-ls/internal/langserver" + "github.com/hashicorp/terraform-ls/internal/terraform/exec" + "github.com/stretchr/testify/mock" +) + +func TestDidChangeWorkspaceFolders(t *testing.T) { + rootDir := TempDir(t) + ls := langserver.NewLangServerMock(t, NewMockSession(&MockSessionInput{ + TerraformCalls: &exec.TerraformMockCalls{ + PerWorkDir: map[string][]*mock.Call{ + rootDir.Dir(): validTfMockCalls(), + }, + }, + })) + stop := ls.Start(t) + defer stop() + + ls.Call(t, &langserver.CallRequest{ + Method: "initialize", + ReqParams: fmt.Sprintf(`{ + "capabilities": {}, + "rootUri": %q, + "processId": 12345, + "workspaceFolders": [ + { + "uri": %q, + "name": "first" + } + ] + }`, rootDir.URI(), rootDir.URI())}) + ls.Notify(t, &langserver.CallRequest{ + Method: "initialized", + ReqParams: "{}", + }) + ls.Call(t, &langserver.CallRequest{ + Method: "workspace/didChangeWorkspaceFolders", + ReqParams: fmt.Sprintf(`{ + "event": { + "added": [ + {"uri": %q, "name": "second"} + ], + "removed": [ + {"uri": %q, "name": "first"} + ] + } + }`, rootDir.URI(), rootDir.URI())}) +} diff --git a/internal/langserver/handlers/hooks_module.go b/internal/langserver/handlers/hooks_module.go index f26c37e80..b0ae8c4d0 100644 --- a/internal/langserver/handlers/hooks_module.go +++ b/internal/langserver/handlers/hooks_module.go @@ -11,6 +11,12 @@ import ( func sendModuleTelemetry(ctx context.Context, store *state.StateStore, telemetrySender telemetry.Sender) state.ModuleChangeHook { return func(_, newMod *state.Module) { + if newMod == nil { + // module is being removed + // TODO: Track module removal as an event + return + } + modId, err := store.GetModuleID(newMod.Path) if err != nil { return diff --git a/internal/langserver/handlers/service.go b/internal/langserver/handlers/service.go index 98ec0bd74..71bdbb12e 100644 --- a/internal/langserver/handlers/service.go +++ b/internal/langserver/handlers/service.go @@ -300,6 +300,7 @@ func (svc *service) Assigner() (jrpc2.Assigner, error) { } ctx = lsctx.WithModuleWalker(ctx, svc.walker) + ctx = lsctx.WithModuleManager(ctx, svc.modMgr) ctx = lsctx.WithWatcher(ctx, svc.watcher) return handle(ctx, req, lh.DidChangeWorkspaceFolders)