MCP Language Server
by isaacphi
- internal
- protocol
package protocol
import "fmt"
// TextEditResult is an interface for types that represent workspace symbols
type WorkspaceSymbolResult interface {
GetName() string
GetLocation() Location
isWorkspaceSymbol() // marker method
}
func (ws *WorkspaceSymbol) GetName() string { return ws.Name }
func (ws *WorkspaceSymbol) GetLocation() Location {
switch v := ws.Location.Value.(type) {
case Location:
return v
case LocationUriOnly:
return Location{URI: v.URI}
}
return Location{}
}
func (ws *WorkspaceSymbol) isWorkspaceSymbol() {}
func (si *SymbolInformation) GetName() string { return si.Name }
func (si *SymbolInformation) GetLocation() Location { return si.Location }
func (si *SymbolInformation) isWorkspaceSymbol() {}
// Results converts the Value to a slice of WorkspaceSymbolResult
func (r Or_Result_workspace_symbol) Results() ([]WorkspaceSymbolResult, error) {
if r.Value == nil {
return make([]WorkspaceSymbolResult, 0), nil
}
switch v := r.Value.(type) {
case []WorkspaceSymbol:
results := make([]WorkspaceSymbolResult, len(v))
for i := range v {
results[i] = &v[i]
}
return results, nil
case []SymbolInformation:
results := make([]WorkspaceSymbolResult, len(v))
for i := range v {
results[i] = &v[i]
}
return results, nil
default:
return nil, fmt.Errorf("unknown symbol type: %T", r.Value)
}
}
// TextEditResult is an interface for types that represent document symbols
type DocumentSymbolResult interface {
GetRange() Range
GetName() string
isDocumentSymbol() // marker method
}
func (ds *DocumentSymbol) GetRange() Range { return ds.Range }
func (ds *DocumentSymbol) GetName() string { return ds.Name }
func (ds *DocumentSymbol) isDocumentSymbol() {}
func (si *SymbolInformation) GetRange() Range { return si.Location.Range }
// Note: SymbolInformation already has GetName() implemented above
func (si *SymbolInformation) isDocumentSymbol() {}
// Results converts the Value to a slice of DocumentSymbolResult
func (r Or_Result_textDocument_documentSymbol) Results() ([]DocumentSymbolResult, error) {
if r.Value == nil {
return make([]DocumentSymbolResult, 0), nil
}
switch v := r.Value.(type) {
case []DocumentSymbol:
results := make([]DocumentSymbolResult, len(v))
for i := range v {
results[i] = &v[i]
}
return results, nil
case []SymbolInformation:
results := make([]DocumentSymbolResult, len(v))
for i := range v {
results[i] = &v[i]
}
return results, nil
default:
return nil, fmt.Errorf("unknown document symbol type: %T", v)
}
}
// TextEditResult is an interface for types that can be used as text edits
type TextEditResult interface {
GetRange() Range
GetNewText() string
isTextEdit() // marker method
}
func (te *TextEdit) GetRange() Range { return te.Range }
func (te *TextEdit) GetNewText() string { return te.NewText }
func (te *TextEdit) isTextEdit() {}
// Convert Or_TextDocumentEdit_edits_Elem to TextEdit
func (e Or_TextDocumentEdit_edits_Elem) AsTextEdit() (TextEdit, error) {
if e.Value == nil {
return TextEdit{}, fmt.Errorf("nil text edit")
}
switch v := e.Value.(type) {
case TextEdit:
return v, nil
case AnnotatedTextEdit:
return TextEdit{
Range: v.Range,
NewText: v.NewText,
}, nil
default:
return TextEdit{}, fmt.Errorf("unknown text edit type: %T", e.Value)
}
}