/** * Find References Provider * - Template ID: find all use="id", then="id", else="id", loading="id", error="id", etc. * - Ref name: find all $refs.name references + the ref="name" declaration * - Store name: find all $store.name references + the store="name" declaration */ import { ReferenceParams, Location, Range, } from 'vscode-languageserver/node'; import { TextDocuments } from 'vscode-languageserver/node'; import { TextDocument } from 'vscode-languageserver-textdocument'; import { parseHtmlDocument, getAllElements, getElementAtOffset, findTemplates, findRefs, findStores, ElementInfo, } from '../html-parser'; /** Attributes whose values can reference template IDs */ const TEMPLATE_REF_ATTRS = new Set([ 'use', 'then', 'else', 'loading', 'error', 'empty', 'success', 'error-boundary', 'template', ]); export function onReferences(documents: TextDocuments) { return (params: ReferenceParams): Location[] | null => { 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 elements = getAllElements(htmlDoc, text); const element = getElementAtOffset(htmlDoc, offset, text); if (!element) return null; // 1. Check if cursor is on a template id declaration or a template-referencing value for (const attr of element.attributes) { // On