mirror of
https://github.com/laravel-ls/protocol.git
synced 2026-06-21 02:08:19 +02:00
add inline hints
This commit is contained in:
parent
7cebe3d818
commit
5fe36eb7d6
2 changed files with 365 additions and 0 deletions
207
inlay_hints.go
Normal file
207
inlay_hints.go
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
package protocol
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
)
|
||||
|
||||
const (
|
||||
// MethodTextDocumentInlayHint method name of `textDocument/inlayHint`.
|
||||
MethodTextDocumentInlayHint = "textDocument/inlayHint"
|
||||
)
|
||||
|
||||
// InlayHintParams - Parameters for a `textDocument/inlayHint` request.
|
||||
//
|
||||
// @since 3.17.0
|
||||
//
|
||||
// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHintParams
|
||||
type InlayHintParams struct {
|
||||
WorkDoneProgressParams
|
||||
PartialResultParams
|
||||
|
||||
// The text document.
|
||||
TextDocument TextDocumentIdentifier `json:"textDocument"`
|
||||
|
||||
// The visible range for which inlay hints should be computed.
|
||||
Range Range `json:"range"`
|
||||
}
|
||||
|
||||
// InlayHintKind - The kind of an inlay hint.
|
||||
//
|
||||
// @since 3.17.0
|
||||
//
|
||||
// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHintKind
|
||||
type InlayHintKind int
|
||||
|
||||
const (
|
||||
// InlayHintKindType - An inlay hint that shows a type annotation.
|
||||
InlayHintKindType InlayHintKind = 1
|
||||
|
||||
// InlayHintKindParameter - An inlay hint that shows a parameter name.
|
||||
InlayHintKindParameter InlayHintKind = 2
|
||||
)
|
||||
|
||||
// InlayHintTooltip can be a plain string or a MarkupContent object.
|
||||
//
|
||||
// @since 3.17.0
|
||||
type InlayHintTooltip struct {
|
||||
String *string
|
||||
MarkupContent *MarkupContent
|
||||
}
|
||||
|
||||
func (t InlayHintTooltip) MarshalJSON() ([]byte, error) {
|
||||
if t.String != nil {
|
||||
return json.Marshal(*t.String)
|
||||
}
|
||||
if t.MarkupContent != nil {
|
||||
return json.Marshal(t.MarkupContent)
|
||||
}
|
||||
return []byte("null"), nil
|
||||
}
|
||||
|
||||
func (t *InlayHintTooltip) UnmarshalJSON(data []byte) error {
|
||||
*t = InlayHintTooltip{}
|
||||
|
||||
if string(data) == "null" {
|
||||
return nil
|
||||
}
|
||||
|
||||
var str string
|
||||
if err := json.Unmarshal(data, &str); err == nil {
|
||||
t.String = &str
|
||||
return nil
|
||||
}
|
||||
|
||||
var markup MarkupContent
|
||||
if err := json.Unmarshal(data, &markup); err == nil && markup.Kind != "" {
|
||||
t.MarkupContent = &markup
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("invalid InlayHintTooltip: not string, MarkupContent, or null")
|
||||
}
|
||||
|
||||
// InlayHintLabelPart - A segment of an inlay hint label.
|
||||
//
|
||||
// @since 3.17.0
|
||||
//
|
||||
// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHintLabelPart
|
||||
type InlayHintLabelPart struct {
|
||||
// The mandatory label value.
|
||||
Value string `json:"value"`
|
||||
|
||||
// The tooltip text or markup shown when hovering this label part.
|
||||
Tooltip *InlayHintTooltip `json:"tooltip,omitempty"`
|
||||
|
||||
// A source location for this label part.
|
||||
Location *Location `json:"location,omitempty"`
|
||||
|
||||
// A command associated with this label part.
|
||||
Command *Command `json:"command,omitempty"`
|
||||
}
|
||||
|
||||
// InlayHintLabel can be either a string or a list of label parts.
|
||||
//
|
||||
// @since 3.17.0
|
||||
type InlayHintLabel struct {
|
||||
String *string
|
||||
Parts []InlayHintLabelPart
|
||||
}
|
||||
|
||||
func (l InlayHintLabel) MarshalJSON() ([]byte, error) {
|
||||
if l.String != nil {
|
||||
return json.Marshal(*l.String)
|
||||
}
|
||||
if l.Parts != nil {
|
||||
return json.Marshal(l.Parts)
|
||||
}
|
||||
return nil, errors.New("one of InlayHintLabel.String or InlayHintLabel.Parts needs to be set")
|
||||
}
|
||||
|
||||
func (l *InlayHintLabel) UnmarshalJSON(data []byte) error {
|
||||
*l = InlayHintLabel{}
|
||||
|
||||
var str string
|
||||
if err := json.Unmarshal(data, &str); err == nil {
|
||||
l.String = &str
|
||||
return nil
|
||||
}
|
||||
|
||||
var parts []InlayHintLabelPart
|
||||
if err := json.Unmarshal(data, &parts); err == nil {
|
||||
l.Parts = parts
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("invalid InlayHintLabel: not string or []InlayHintLabelPart")
|
||||
}
|
||||
|
||||
// InlayHint represents an inlay hint item.
|
||||
//
|
||||
// @since 3.17.0
|
||||
//
|
||||
// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHint
|
||||
type InlayHint struct {
|
||||
// The position of this hint.
|
||||
Position Position `json:"position"`
|
||||
|
||||
// The label of this hint. A human readable string or an array of label parts.
|
||||
Label InlayHintLabel `json:"label"`
|
||||
|
||||
// The kind of this hint.
|
||||
Kind *InlayHintKind `json:"kind,omitempty"`
|
||||
|
||||
// Optional text edits that are performed when accepting this hint.
|
||||
TextEdits []TextEdit `json:"textEdits,omitempty"`
|
||||
|
||||
// The tooltip text when hovering over this hint.
|
||||
Tooltip *InlayHintTooltip `json:"tooltip,omitempty"`
|
||||
|
||||
// Render padding before this hint.
|
||||
PaddingLeft *bool `json:"paddingLeft,omitempty"`
|
||||
|
||||
// Render padding after this hint.
|
||||
PaddingRight *bool `json:"paddingRight,omitempty"`
|
||||
|
||||
// A data entry field preserved between a hint request and resolve request.
|
||||
Data LSPAny `json:"data,omitempty"`
|
||||
}
|
||||
|
||||
// InlayHintResponse - Result for a `textDocument/inlayHint` request.
|
||||
//
|
||||
// It is either an array of `InlayHint` or `null`.
|
||||
//
|
||||
// @since 3.17.0
|
||||
//
|
||||
// See https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHint
|
||||
type InlayHintResponse struct {
|
||||
Hints []InlayHint
|
||||
Null bool
|
||||
}
|
||||
|
||||
func (r InlayHintResponse) MarshalJSON() ([]byte, error) {
|
||||
if r.Null {
|
||||
return []byte("null"), nil
|
||||
}
|
||||
if r.Hints == nil {
|
||||
return []byte("null"), nil
|
||||
}
|
||||
return json.Marshal(r.Hints)
|
||||
}
|
||||
|
||||
func (r *InlayHintResponse) UnmarshalJSON(data []byte) error {
|
||||
*r = InlayHintResponse{}
|
||||
|
||||
if string(data) == "null" {
|
||||
r.Null = true
|
||||
return nil
|
||||
}
|
||||
|
||||
var hints []InlayHint
|
||||
if err := json.Unmarshal(data, &hints); err == nil {
|
||||
r.Hints = hints
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("invalid inlay hint response: not null or []InlayHint")
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue