internal/langserver/handlers/hover_v2.go (41 lines of code) (raw):
package handlers
import (
"context"
"github.com/Azure/azurerm-lsp/internal/parser"
"github.com/Azure/azurerm-lsp/internal/protocol"
"github.com/Azure/azurerm-lsp/provider-schema"
)
func (svc *service) HandleHover(ctx context.Context, params protocol.TextDocumentPositionParams) (*protocol.Hover, error) {
docContent, docFileName, err := parser.GetDocumentContent(ctx, params.TextDocument.URI)
if err != nil {
return nil, err
}
ctxInfo, diags, err := parser.BuildHCLContext(docContent, docFileName, params.Position)
if err != nil || (diags != nil && diags.HasErrors()) {
docContent, fieldName, _, err := parser.AttemptReparse(docContent, params.Position.Line)
if err != nil {
return nil, nil
}
ctxInfo, diags, err = parser.BuildHCLContext(docContent, docFileName, params.Position)
if err != nil || (diags != nil && diags.HasErrors()) {
return nil, nil
}
ctxInfo.ParsedPath += "." + fieldName
}
var content string
switch {
case ctxInfo.ParsedPath != "" && (ctxInfo.SubBlock != nil || ctxInfo.Attribute != nil):
content, _, err = provider_schema.GetAttributeContent(ctxInfo.Resource, ctxInfo.ParsedPath)
default:
content, _, err = provider_schema.GetResourceContent(ctxInfo.Resource)
}
if err != nil {
return nil, nil
}
return &protocol.Hover{
Contents: protocol.MarkupContent{
Kind: protocol.Markdown,
Value: content,
},
}, nil
}