aboutsummaryrefslogtreecommitdiff
path: root/gopls/internal/lsp/protocol/tsdocument_changes.go
diff options
context:
space:
mode:
Diffstat (limited to 'gopls/internal/lsp/protocol/tsdocument_changes.go')
-rw-r--r--gopls/internal/lsp/protocol/tsdocument_changes.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/gopls/internal/lsp/protocol/tsdocument_changes.go b/gopls/internal/lsp/protocol/tsdocument_changes.go
new file mode 100644
index 000000000..2c7a524e1
--- /dev/null
+++ b/gopls/internal/lsp/protocol/tsdocument_changes.go
@@ -0,0 +1,42 @@
+// Copyright 2022 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 protocol
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+// DocumentChanges is a union of a file edit and directory rename operations
+// for package renaming feature. At most one field of this struct is non-nil.
+type DocumentChanges struct {
+ TextDocumentEdit *TextDocumentEdit
+ RenameFile *RenameFile
+}
+
+func (d *DocumentChanges) UnmarshalJSON(data []byte) error {
+ var m map[string]interface{}
+
+ if err := json.Unmarshal(data, &m); err != nil {
+ return err
+ }
+
+ if _, ok := m["textDocument"]; ok {
+ d.TextDocumentEdit = new(TextDocumentEdit)
+ return json.Unmarshal(data, d.TextDocumentEdit)
+ }
+
+ d.RenameFile = new(RenameFile)
+ return json.Unmarshal(data, d.RenameFile)
+}
+
+func (d *DocumentChanges) MarshalJSON() ([]byte, error) {
+ if d.TextDocumentEdit != nil {
+ return json.Marshal(d.TextDocumentEdit)
+ } else if d.RenameFile != nil {
+ return json.Marshal(d.RenameFile)
+ }
+ return nil, fmt.Errorf("Empty DocumentChanges union value")
+}