+ Expect one document link to style
+
+
+
+ {{ x }}
+
+
+
+ `)
+ ).toMatchInlineSnapshot(`
+ [
+ {
+ "range": {
+ "end": {
+ "character": 23,
+ "line": 10,
+ },
+ "start": {
+ "character": 16,
+ "line": 10,
+ },
+ },
+ "target": "file://\${testWorkspacePath}/fixture.vue#L19%2C4-L19%2C12",
+ },
+ {
+ "range": {
+ "end": {
+ "character": 42,
+ "line": 3,
+ },
+ "start": {
+ "character": 32,
+ "line": 3,
+ },
+ },
+ "target": "file://\${testWorkspacePath}/fixture.vue#L12%2C15-L12%2C25",
+ },
+ {
+ "range": {
+ "end": {
+ "character": 41,
+ "line": 4,
+ },
+ "start": {
+ "character": 32,
+ "line": 4,
+ },
+ },
+ "target": "file://\${testWorkspacePath}/fixture.vue#L13%2C15-L13%2C24",
+ },
+ {
+ "range": {
+ "end": {
+ "character": 41,
+ "line": 4,
+ },
+ "start": {
+ "character": 32,
+ "line": 4,
+ },
+ },
+ "target": "file://\${testWorkspacePath}/fixture.vue#L14%2C16-L14%2C25",
+ },
+ {
+ "range": {
+ "end": {
+ "character": 39,
+ "line": 5,
+ },
+ "start": {
+ "character": 32,
+ "line": 5,
+ },
+ },
+ "target": "file://\${testWorkspacePath}/fixture.vue#L15%2C38-L15%2C45",
+ },
+ ]
+ `);
+});
+
+const openedDocuments: TextDocument[] = [];
+
+afterEach(async () => {
+ const server = await getLanguageServer();
+ for (const document of openedDocuments) {
+ await server.close(document.uri);
+ }
+ openedDocuments.length = 0;
+});
+
+async function requestDocumentLinks(fileName: string, languageId: string, content: string) {
+ const server = await getLanguageServer();
+ let document = await prepareDocument(fileName, languageId, content);
+
+ const documentLinks = await server.vueserver.sendDocumentLinkRequest(document.uri);
+ expect(documentLinks).toBeDefined();
+ expect(documentLinks!.length).greaterThan(0);
+
+ for (const documentLink of documentLinks!) {
+ documentLink.target = 'file://${testWorkspacePath}' + documentLink.target!.slice(URI.file(testWorkspacePath).toString().length)
+ }
+
+ return documentLinks!;
+}
+
+async function prepareDocument(fileName: string, languageId: string, content: string) {
+ const server = await getLanguageServer();
+ const uri = URI.file(`${testWorkspacePath}/${fileName}`);
+ const document = await server.open(uri.toString(), languageId, content);
+ if (openedDocuments.every(d => d.uri !== document.uri)) {
+ openedDocuments.push(document);
+ }
+ return document;
+}
diff --git a/packages/language-service/lib/plugins/vue-document-links.ts b/packages/language-service/lib/plugins/vue-document-links.ts
index 0db43b4304..aea939a470 100644
--- a/packages/language-service/lib/plugins/vue-document-links.ts
+++ b/packages/language-service/lib/plugins/vue-document-links.ts
@@ -17,7 +17,7 @@ export function create(): LanguageServicePlugin {
const decoded = context.decodeEmbeddedDocumentUri(uri);
const sourceScript = decoded && context.language.scripts.get(decoded[0]);
const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
- if (!sourceScript?.generated || virtualCode?.id !== 'template') {
+ if (!sourceScript?.generated || (virtualCode?.id !== 'template' && virtualCode?.id !== "scriptsetup_raw")) {
return;
}
@@ -26,52 +26,90 @@ export function create(): LanguageServicePlugin {
return;
}
- const result: vscode.DocumentLink[] = [];
-
const { sfc } = root;
const codegen = tsCodegen.get(sfc);
- const scopedClasses = codegen?.getGeneratedTemplate()?.scopedClasses ?? [];
- const styleClasses = new Map