1
1
import type { UnocssAutocomplete } from '@unocss/autocomplete'
2
2
import { createAutocomplete } from '@unocss/autocomplete'
3
- import type { CompletionItemProvider , ExtensionContext } from 'vscode'
4
- import { CompletionItem , CompletionItemKind , CompletionList , MarkdownString , Range , languages } from 'vscode'
3
+ import type { CompletionItemProvider , Disposable , ExtensionContext } from 'vscode'
4
+ import { CompletionItem , CompletionItemKind , CompletionList , MarkdownString , Range , languages , window , workspace } from 'vscode'
5
5
import type { UnoGenerator , UnocssPluginContext } from '@unocss/core'
6
6
import { getCSS , getColorString , getPrettiedCSS , getPrettiedMarkdown , isSubdir } from './utils'
7
7
import { log } from './log'
8
8
import type { ContextLoader } from './contextLoader'
9
9
import { isCssId } from './integration'
10
10
11
- const languageIds = [
11
+ const defaultLanguageIds = [
12
12
'erb' ,
13
13
'haml' ,
14
14
'hbs' ,
@@ -48,6 +48,7 @@ export async function registerAutoComplete(
48
48
contextLoader : ContextLoader ,
49
49
ext : ExtensionContext ,
50
50
) {
51
+ const allLanguages = await languages . getLanguages ( )
51
52
const autoCompletes = new Map < UnocssPluginContext , UnocssAutocomplete > ( )
52
53
contextLoader . events . on ( 'contextReload' , ( ctx ) => {
53
54
autoCompletes . delete ( ctx )
@@ -71,6 +72,21 @@ export async function registerAutoComplete(
71
72
return new MarkdownString ( await getPrettiedMarkdown ( uno , util ) )
72
73
}
73
74
75
+ function validateLanguages ( targets : string [ ] ) {
76
+ const unValidLanguages : string [ ] = [ ]
77
+ const validLanguages = targets . filter ( ( language ) => {
78
+ if ( ! allLanguages . includes ( language ) ) {
79
+ unValidLanguages . push ( language )
80
+ return false
81
+ }
82
+ return true
83
+ } )
84
+ if ( unValidLanguages . length )
85
+ window . showWarningMessage ( `These language configurations are illegal: ${ unValidLanguages . join ( ',' ) } ` )
86
+
87
+ return validLanguages
88
+ }
89
+
74
90
const provider : CompletionItemProvider < UnoCompletionItem > = {
75
91
async provideCompletionItems ( doc , position ) {
76
92
const id = doc . uri . fsPath
@@ -134,11 +150,32 @@ export async function registerAutoComplete(
134
150
} ,
135
151
}
136
152
137
- ext . subscriptions . push (
138
- languages . registerCompletionItemProvider (
139
- languageIds ,
153
+ let completeUnregister : Disposable
154
+
155
+ const registerProvider = ( ) => {
156
+ completeUnregister ?. dispose ?.( )
157
+
158
+ const languagesIds : string [ ] = workspace . getConfiguration ( ) . get ( 'unocss.languageIds' ) || [ ]
159
+
160
+ const validLanguages = validateLanguages ( languagesIds )
161
+
162
+ completeUnregister = languages . registerCompletionItemProvider (
163
+ defaultLanguageIds . concat ( validLanguages ) ,
140
164
provider ,
141
165
...delimiters ,
142
- ) ,
166
+ )
167
+ return completeUnregister
168
+ }
169
+
170
+ ext . subscriptions . push ( workspace . onDidChangeConfiguration ( async ( event ) => {
171
+ if ( event . affectsConfiguration ( 'unocss.languageIds' ) ) {
172
+ ext . subscriptions . push (
173
+ registerProvider ( ) ,
174
+ )
175
+ }
176
+ } ) )
177
+
178
+ ext . subscriptions . push (
179
+ registerProvider ( ) ,
143
180
)
144
181
}
0 commit comments