1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts
index a3b6131252b1b5d0b45dbedb2e189db4f6ce5c36..d98ab34cbba69391205ffaf7f6be1f5b49e83546 100644
--- a/packages/tailwindcss-language-server/src/server.ts
+++ b/packages/tailwindcss-language-server/src/server.ts
@@ -27,6 +27,9 @@ DidChangeWatchedFilesNotification,
FileChangeType,
Disposable,
TextDocumentIdentifier,
+ DocumentLinkRequest,
+ DocumentLinkParams,
+ DocumentLink,
} from 'vscode-languageserver/node'
import { TextDocument } from 'vscode-languageserver-textdocument'
import { URI } from 'vscode-uri'
@@ -68,6 +71,7 @@ clearAllDiagnostics,
} from './lsp/diagnosticsProvider'
import { doCodeActions } from 'tailwindcss-language-service/src/codeActions/codeActionProvider'
import { getDocumentColors } from 'tailwindcss-language-service/src/documentColorProvider'
+import { getDocumentLinks } from 'tailwindcss-language-service/src/documentLinksProvider'
import { debounce } from 'debounce'
import { getModuleDependencies } from './util/getModuleDependencies'
import assert from 'assert'
@@ -188,6 +192,7 @@ provideDiagnostics(document: TextDocument): void
onDocumentColor(params: DocumentColorParams): Promise<ColorInformation[]>
onColorPresentation(params: ColorPresentationParams): Promise<ColorPresentation[]>
onCodeAction(params: CodeActionParams): Promise<CodeAction[]>
+ onDocumentLinks(params: DocumentLinkParams): DocumentLink[]
}
type ProjectConfig = { folder: string; configPath?: string; documentSelector?: string[] }
@@ -299,6 +304,27 @@ getConfiguration,
getDocumentSymbols: (uri: string) => {
return connection.sendRequest('@/tailwindCSS/getDocumentSymbols', { uri })
},
+ async readDirectory(document, directory) {
+ try {
+ directory = path.resolve(path.dirname(getFileFsPath(document.uri)), directory)
+ let dirents = await fs.promises.readdir(directory, { withFileTypes: true })
+ let result: Array<[string, { isDirectory: boolean }] | null> = await Promise.all(
+ dirents.map(async (dirent) => {
+ let isDirectory = dirent.isDirectory()
+ return (await isExcluded(
+ state,
+ document,
+ path.join(directory, dirent.name, isDirectory ? '/' : '')
+ ))
+ ? null
+ : [dirent.name, { isDirectory }]
+ })
+ )
+ return result.filter((item) => item !== null)
+ } catch {
+ return []
+ }
+ },
},
}
@@ -1028,6 +1054,14 @@ let settings = await state.editor.getConfiguration(document.uri)
if (!settings.tailwindCSS.codeActions) return null
return doCodeActions(state, params)
},
+ onDocumentLinks(params: DocumentLinkParams): DocumentLink[] {
+ if (!state.enabled) return null
+ let document = documentService.getDocument(params.textDocument.uri)
+ if (!document) return null
+ return getDocumentLinks(state, document, (linkPath) =>
+ URI.file(path.resolve(path.dirname(URI.parse(document.uri).fsPath), linkPath)).toString()
+ )
+ },
provideDiagnostics: debounce((document: TextDocument) => {
if (!state.enabled) return
provideDiagnostics(state, document)
@@ -1485,6 +1519,7 @@ this.connection.onCompletionResolve(this.onCompletionResolve.bind(this))
this.connection.onDocumentColor(this.onDocumentColor.bind(this))
this.connection.onColorPresentation(this.onColorPresentation.bind(this))
this.connection.onCodeAction(this.onCodeAction.bind(this))
+ this.connection.onDocumentLinks(this.onDocumentLinks.bind(this))
}
private updateCapabilities() {
@@ -1499,6 +1534,7 @@
capabilities.add(HoverRequest.type, { documentSelector: null })
capabilities.add(DocumentColorRequest.type, { documentSelector: null })
capabilities.add(CodeActionRequest.type, { documentSelector: null })
+ capabilities.add(DocumentLinkRequest.type, { documentSelector: null })
capabilities.add(CompletionRequest.type, {
documentSelector: null,
@@ -1564,6 +1600,10 @@ onCodeAction(params: CodeActionParams): Promise<CodeAction[]> {
return this.getProject(params.textDocument)?.onCodeAction(params) ?? null
}
+ onDocumentLinks(params: DocumentLinkParams): DocumentLink[] {
+ return this.getProject(params.textDocument)?.onDocumentLinks(params) ?? null
+ }
+
listen() {
this.connection.listen()
}
@@ -1605,7 +1645,8 @@ connection.onInitialized &&
params.capabilities.textDocument.hover?.dynamicRegistration &&
params.capabilities.textDocument.colorProvider?.dynamicRegistration &&
params.capabilities.textDocument.codeAction?.dynamicRegistration &&
- params.capabilities.textDocument.completion?.dynamicRegistration
+ params.capabilities.textDocument.completion?.dynamicRegistration &&
+ params.capabilities.textDocument.documentLink?.dynamicRegistration
)
}
@@ -1630,6 +1671,7 @@ textDocumentSync: TextDocumentSyncKind.Full,
hoverProvider: true,
colorProvider: true,
codeActionProvider: true,
+ documentLinkProvider: {},
completionProvider: {
resolveProvider: true,
triggerCharacters: [...TRIGGER_CHARACTERS, ':'],
|