| // Copyright 2024 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" | |
| ) | |
| // InsertReplaceEdit is used instead of TextEdit in CompletionItem | |
| // in editors that support it. These two types are alike in appearance | |
| // but can be differentiated by the presence or absence of | |
| // certain properties. UnmarshalJSON of the sum type tries to | |
| // unmarshal as TextEdit only if unmarshal as InsertReplaceEdit fails. | |
| // However, due to this similarity, unmarshal with the other type | |
| // never fails. This file has a custom JSON unmarshaller for | |
| // InsertReplaceEdit, that fails if the required fields are missing. | |
| // UnmarshalJSON unmarshals InsertReplaceEdit with extra | |
| // checks on the presence of "insert" and "replace" properties. | |
| func (e *InsertReplaceEdit) UnmarshalJSON(data []byte) error { | |
| var required struct { | |
| NewText string | |
| Insert *Range `json:"insert,omitempty"` | |
| Replace *Range `json:"replace,omitempty"` | |
| } | |
| if err := json.Unmarshal(data, &required); err != nil { | |
| return err | |
| } | |
| if required.Insert == nil && required.Replace == nil { | |
| return fmt.Errorf("not InsertReplaceEdit") | |
| } | |
| e.NewText = required.NewText | |
| e.Insert = *required.Insert | |
| e.Replace = *required.Replace | |
| return nil | |
| } |