Hover¶
This implements the textDocument/hover request.
Typically this method will be called when the user places their mouse or cursor over a symbol in a document, allowing you to provide documentation for the selected symbol.
This server implements textDocument/hover for various datetime representations, displaying a table how the selected date would be formatted in each of the supported formats.
import logging
from datetime import datetime
from lsprotocol import types
from pygls.cli import start_server
from pygls.lsp.server import LanguageServer
DATE_FORMATS = [
"%H:%M:%S",
"%d/%m/%y",
"%Y-%m-%d",
"%Y-%m-%dT%H:%M:%S",
]
server = LanguageServer("hover-server", "v1")
@server.feature(types.TEXT_DOCUMENT_HOVER)
def hover(ls: LanguageServer, params: types.HoverParams):
pos = params.position
document_uri = params.text_document.uri
document = ls.workspace.get_text_document(document_uri)
try:
line = document.lines[pos.line]
except IndexError:
return None
for fmt in DATE_FORMATS:
try:
value = datetime.strptime(line.strip(), fmt)
break
except ValueError:
pass
else:
# No valid datetime found.
return None
hover_content = [
f"# {value.strftime('%a %d %b %Y')}",
"",
"| Format | Value |",
"|:-|-:|",
*[f"| `{fmt}` | {value.strftime(fmt)} |" for fmt in DATE_FORMATS],
]
return types.Hover(
contents=types.MarkupContent(
kind=types.MarkupKind.Markdown,
value="\n".join(hover_content),
),
range=types.Range(
start=types.Position(line=pos.line, character=0),
end=types.Position(line=pos.line + 1, character=0),
),
)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, format="%(message)s")
start_server(server)