import { Hover, HoverParams, MarkupKind, TextDocuments, } from 'vscode-languageserver/node'; import { TextDocument } from 'vscode-languageserver-textdocument'; import { parseHtmlDocument, getElementAtOffset, ElementInfo } from '../html-parser'; import { matchDirective, getFilter, getValidator, getDirective, getPatterns, DirectiveMeta, PatternMeta, isHttpDirective, getAnimations, getLifecycleEvents, getLoopContextVars, getEventModifiers, getPluginRequirementNote, } from '../directive-registry'; import type { DevToolsBridge } from '../devtools-bridge'; export function onHover(documents: TextDocuments, getBridge?: () => DevToolsBridge | null) { return async (params: HoverParams): Promise => { const document = documents.get(params.textDocument.uri); if (!document) return null; const text = document.getText(); const offset = document.offsetAt(params.position); const htmlDoc = parseHtmlDocument(document); const element = getElementAtOffset(htmlDoc, offset, text); if (!element) return null; // Find which attribute the cursor is on const attr = element.attributes.find( a => a.nameStart <= offset && offset <= a.nameEnd ); if (attr) { return getAttributeHover(attr.name, element); } // Check if cursor is on an attribute value const valueAttr = element.attributes.find( a => a.valueStart !== -1 && a.valueStart <= offset && offset <= a.valueEnd ); if (valueAttr) { // Wildcard route hover: route="*" on