@@ -16,6 +16,7 @@ import util = require('util');
16
16
import * as lockfile from 'proper-lockfile' ;
17
17
import AbortController from 'abort-controller' ;
18
18
const exec = util . promisify ( require ( 'child_process' ) . exec ) ;
19
+ const output = vscode . window . createOutputChannel ( 'VHDL LS Client' ) ;
19
20
20
21
import {
21
22
LanguageClient ,
@@ -43,14 +44,18 @@ export async function activate(ctx: ExtensionContext) {
43
44
const languageServerDir = ctx . asAbsolutePath (
44
45
path . join ( 'server' , 'vhdl_ls' )
45
46
) ;
47
+ output . appendLine (
48
+ 'Checking for language server executable in ' + languageServerDir
49
+ ) ;
46
50
let languageServerVersion = embeddedVersion ( languageServerDir ) ;
47
51
if ( languageServerVersion == '0.0.0' ) {
48
- console . log ( 'No language server installed' ) ;
49
- window . showInformationMessage ( 'Downloading language server' ) ;
52
+ output . appendLine ( 'No language server installed' ) ;
53
+ window . showInformationMessage ( 'Downloading language server... ' ) ;
50
54
await getLatestLanguageServer ( 60000 , ctx ) ;
51
55
languageServerVersion = embeddedVersion ( languageServerDir ) ;
56
+ } else {
57
+ output . appendLine ( 'Found version ' + languageServerVersion ) ;
52
58
}
53
- console . log ( languageServerVersion ) ;
54
59
languageServer = path . join (
55
60
'server' ,
56
61
'vhdl_ls' ,
@@ -61,51 +66,54 @@ export async function activate(ctx: ExtensionContext) {
61
66
) ;
62
67
63
68
// Get language server configuration and command to start server
64
- let languageServerBinary = vscode . workspace
69
+
70
+ let workspace = vscode . workspace ;
71
+ let languageServerBinary = workspace
65
72
. getConfiguration ( )
66
73
. get ( 'vhdlls.languageServer' ) ;
67
74
let lsBinary = languageServerBinary as keyof typeof LanguageServerBinary ;
68
75
let serverOptions : ServerOptions ;
69
76
switch ( lsBinary ) {
70
77
case 'embedded' :
71
78
serverOptions = getServerOptionsEmbedded ( ctx ) ;
72
- console . log ( 'Using embedded language server' ) ;
79
+ output . appendLine ( 'Using embedded language server' ) ;
73
80
break ;
74
81
75
82
case 'user' :
76
83
serverOptions = getServerOptionsUser ( ctx ) ;
77
- console . log ( 'Using user specified language server' ) ;
78
- console . log ( serverOptions ) ;
84
+ output . appendLine ( 'Using user specified language server' ) ;
79
85
break ;
80
86
81
87
case 'systemPath' :
82
88
serverOptions = getServerOptionsSystemPath ( ) ;
83
- console . log ( 'Running language server from path' ) ;
89
+ output . appendLine ( 'Running language server from path' ) ;
84
90
break ;
85
91
86
92
case 'docker' :
87
93
serverOptions = await getServerOptionsDocker ( ) ;
88
- console . log ( 'Using vhdl_ls from Docker Hub' ) ;
94
+ output . appendLine ( 'Using vhdl_ls from Docker Hub' ) ;
89
95
break ;
90
96
91
97
default :
92
98
serverOptions = getServerOptionsEmbedded ( ctx ) ;
93
- console . log ( 'Using embedded language server (default)' ) ;
99
+ output . appendLine ( 'Using embedded language server (default)' ) ;
94
100
break ;
95
101
}
96
102
97
103
// Options to control the language client
98
104
let clientOptions : LanguageClientOptions = {
99
105
documentSelector : [ { scheme : 'file' , language : 'vhdl' } ] ,
100
- synchronize : {
106
+ } ;
107
+ if ( workspace . workspaceFolders ) {
108
+ clientOptions . synchronize = {
101
109
fileEvents : workspace . createFileSystemWatcher (
102
110
path . join (
103
- vscode . workspace . workspaceFolders [ 0 ] . uri . fsPath ,
111
+ workspace . workspaceFolders [ 0 ] . uri . fsPath ,
104
112
'vhdl_ls.toml'
105
113
)
106
114
) ,
107
- } ,
108
- } ;
115
+ } ;
116
+ }
109
117
110
118
// Create the language client
111
119
client = new LanguageClient (
@@ -123,7 +131,7 @@ export async function activate(ctx: ExtensionContext) {
123
131
ctx . subscriptions . push (
124
132
vscode . commands . registerCommand ( 'vhdlls.restart' , async ( ) => {
125
133
const MSG = 'Restarting VHDL LS' ;
126
- console . log ( MSG ) ;
134
+ output . appendLine ( MSG ) ;
127
135
window . showInformationMessage ( MSG ) ;
128
136
await client . stop ( ) ;
129
137
languageServerDisposable . dispose ( ) ;
@@ -132,23 +140,23 @@ export async function activate(ctx: ExtensionContext) {
132
140
} )
133
141
) ;
134
142
135
- console . log ( 'Checking for updates' ) ;
143
+ output . appendLine ( 'Checking for updates... ' ) ;
136
144
lockfile
137
145
. lock ( ctx . asAbsolutePath ( 'server' ) , {
138
146
lockfilePath : ctx . asAbsolutePath ( path . join ( 'server' , '.lock' ) ) ,
139
147
} )
140
148
. then ( ( release : ( ) => void ) => {
141
149
getLatestLanguageServer ( 60000 , ctx )
142
- . catch ( err => {
143
- console . log ( err ) ;
150
+ . catch ( ( err ) => {
151
+ output . appendLine ( err ) ;
144
152
} )
145
153
. finally ( ( ) => {
146
- console . log ( 'Language server update finished.' ) ;
154
+ output . appendLine ( 'Language server update finished.' ) ;
147
155
return release ( ) ;
148
156
} ) ;
149
157
} ) ;
150
158
151
- console . log ( 'Started ') ;
159
+ output . appendLine ( 'Language server started ') ;
152
160
}
153
161
154
162
export function deactivate ( ) : Thenable < void > | undefined {
@@ -166,7 +174,7 @@ function embeddedVersion(languageServerDir: string): string {
166
174
if ( semver . gt ( dir , version ) ) {
167
175
fs . remove ( path . join ( languageServerDir , version ) ) . catch (
168
176
( err : any ) => {
169
- console . log ( err ) ;
177
+ output . appendLine ( err ) ;
170
178
}
171
179
) ;
172
180
return dir ;
@@ -182,13 +190,12 @@ function embeddedVersion(languageServerDir: string): string {
182
190
async function getServerOptionsDocker ( ) {
183
191
const image = 'kraigher/vhdl_ls:latest' ;
184
192
let pullCmd = 'docker pull ' + image ;
185
- console . log ( `Pulling '${ image } '` ) ;
186
- console . log ( pullCmd ) ;
193
+ output . appendLine ( `Pulling '${ image } '` ) ;
194
+ output . appendLine ( pullCmd ) ;
187
195
const { stdout, stderr } = await exec ( pullCmd ) ;
188
- console . log ( stdout ) ;
189
- console . log ( stderr ) ;
196
+ output . append ( stdout ) ;
197
+ output . append ( stderr ) ;
190
198
191
- console . log ( vscode . workspace . workspaceFolders [ 0 ] ) ;
192
199
let wsPath = vscode . workspace . workspaceFolders [ 0 ] . uri . fsPath ;
193
200
let mountPath = wsPath ;
194
201
if ( isWindows ) {
@@ -213,8 +220,6 @@ async function getServerOptionsDocker() {
213
220
`${ wsPath } :${ mountPath } :ro` ,
214
221
image ,
215
222
] ;
216
- console . log ( serverCommand ) ;
217
- console . log ( serverArgs ) ;
218
223
let serverOptions : ServerOptions = {
219
224
run : {
220
225
command : serverCommand ,
@@ -298,34 +303,34 @@ async function getLatestLanguageServer(
298
303
}
299
304
300
305
let latest = semver . valid ( semver . coerce ( latestRelease . data . name ) ) ;
301
- console . log ( `Current vhdl_ls version: ${ current } ` ) ;
302
- console . log ( `Latest vhdl_ls version: ${ latest } ` ) ;
306
+ output . appendLine ( `Current vhdl_ls version: ${ current } ` ) ;
307
+ output . appendLine ( `Latest vhdl_ls version: ${ latest } ` ) ;
303
308
304
309
// Download new version if available
305
310
if ( semver . prerelease ( latest ) ) {
306
- console . log ( 'Latest is pre-release, skipping' ) ;
311
+ output . appendLine ( 'Latest version is pre-release, skipping' ) ;
307
312
} else if ( semver . lte ( latest , current ) ) {
308
- console . log ( 'Language server is already up-to-date' ) ;
313
+ output . appendLine ( 'Language server is up-to-date' ) ;
309
314
} else {
310
315
const languageServerAssetName = languageServerName + '.zip' ;
311
316
let browser_download_url = latestRelease . data . assets . filter (
312
- asset => asset . name == languageServerAssetName
317
+ ( asset ) => asset . name == languageServerAssetName
313
318
) [ 0 ] . browser_download_url ;
314
319
if ( browser_download_url . length == 0 ) {
315
320
throw new Error (
316
321
`No asset with name ${ languageServerAssetName } in release.`
317
322
) ;
318
323
}
319
324
320
- console . log ( 'Fetching ' + browser_download_url ) ;
325
+ output . appendLine ( 'Fetching ' + browser_download_url ) ;
321
326
const abortController = new AbortController ( ) ;
322
327
const timeout = setTimeout ( ( ) => {
323
328
abortController . abort ( ) ;
324
329
} , timeoutMs ) ;
325
330
let download = await fetch ( browser_download_url , {
326
331
signal : abortController . signal ,
327
- } ) . catch ( err => {
328
- console . log ( err ) ;
332
+ } ) . catch ( ( err ) => {
333
+ output . appendLine ( err ) ;
329
334
throw new Error (
330
335
`Language server download timed out after ${ timeoutMs . toFixed (
331
336
2
@@ -338,7 +343,7 @@ async function getLatestLanguageServer(
338
343
const languageServerAsset = ctx . asAbsolutePath (
339
344
path . join ( 'server' , 'install' , latest , languageServerAssetName )
340
345
) ;
341
- console . log ( `Writing ${ languageServerAsset } ` ) ;
346
+ output . appendLine ( `Writing ${ languageServerAsset } ` ) ;
342
347
if ( ! fs . existsSync ( path . dirname ( languageServerAsset ) ) ) {
343
348
fs . mkdirSync ( path . dirname ( languageServerAsset ) , {
344
349
recursive : true ,
@@ -351,11 +356,11 @@ async function getLatestLanguageServer(
351
356
} ) ;
352
357
download . body . pipe ( dest ) ;
353
358
dest . on ( 'finish' , ( ) => {
354
- console . log ( 'Server download complete' ) ;
359
+ output . appendLine ( 'Server download complete' ) ;
355
360
resolve ( ) ;
356
361
} ) ;
357
362
dest . on ( 'error' , ( err : any ) => {
358
- console . log ( 'Server download error' ) ;
363
+ output . appendLine ( 'Server download error' ) ;
359
364
reject ( err ) ;
360
365
} ) ;
361
366
} ) ;
@@ -364,25 +369,27 @@ async function getLatestLanguageServer(
364
369
const targetDir = ctx . asAbsolutePath (
365
370
path . join ( 'server' , 'vhdl_ls' , latest )
366
371
) ;
367
- console . log ( `Extracting ${ languageServerAsset } to ${ targetDir } ` ) ;
372
+ output . appendLine (
373
+ `Extracting ${ languageServerAsset } to ${ targetDir } `
374
+ ) ;
368
375
if ( ! fs . existsSync ( targetDir ) ) {
369
376
fs . mkdirSync ( targetDir , { recursive : true } ) ;
370
377
}
371
- extract ( languageServerAsset , { dir : targetDir } , err => {
378
+ extract ( languageServerAsset , { dir : targetDir } , ( err ) => {
372
379
try {
373
380
fs . removeSync (
374
381
ctx . asAbsolutePath ( path . join ( 'server' , 'install' ) )
375
382
) ;
376
383
} catch { }
377
384
if ( err ) {
378
- console . log ( 'Error when extracting server' ) ;
379
- console . log ( err ) ;
385
+ output . appendLine ( 'Error when extracting server' ) ;
386
+ output . appendLine ( err ) ;
380
387
try {
381
388
fs . removeSync ( targetDir ) ;
382
389
} catch { }
383
390
reject ( err ) ;
384
391
} else {
385
- console . log ( 'Server extracted' ) ;
392
+ output . appendLine ( 'Server extracted' ) ;
386
393
resolve ( ) ;
387
394
}
388
395
} ) ;
0 commit comments