@@ -4,59 +4,29 @@ import {
4
4
LanguageClient ,
5
5
type LanguageClientOptions ,
6
6
type ServerOptions ,
7
+ State ,
7
8
} from "vscode-languageclient/node" ;
8
9
import { createLogger } from "./outputChannel" ;
9
10
10
11
interface LanguageServerConfig {
11
12
flags : string [ ] ;
12
13
}
13
14
14
- export let client : LanguageClient ;
15
+ export let client : LanguageClient | undefined = undefined ;
15
16
16
- export async function startSqlsClient ( ) {
17
- const logger = createLogger ( ) ;
17
+ const logger = createLogger ( ) ;
18
18
19
- logger . info ( "[startSqlsClient]" , "Starting sqls client..." ) ;
19
+ export async function startSqlsClient ( ) {
20
+ logger . debug ( "[startSqlsClient]" , "Starting sqls client..." ) ;
20
21
const sqlsConfig = vscode . workspace . getConfiguration ( "sqlsurge" ) ;
21
22
const config : LanguageServerConfig = {
22
23
flags : sqlsConfig . languageServerFlags || [ ] ,
23
24
} ;
24
25
25
- let sqlsInPATH = await findSqlsInPath ( ) ;
26
+ const sqlsInPATH = await findSqlsInPath ( ) ;
26
27
if ( ! sqlsInPATH ) {
27
- // not found sqls, install sqls automatically
28
- const action = await vscode . window . showInformationMessage (
29
- "sqls is not installed yet. You need to install sqls to enable SQL language features." ,
30
- "Install with command" ,
31
- "Install manually (Jump to the installation guide)" ,
32
- ) ;
33
- switch ( action ) {
34
- case "Install with command" :
35
- await vscode . commands . executeCommand ( "sqlsurge.installSqls" ) ;
36
- break ;
37
- case "Install manually (Jump to the installation guide)" :
38
- await vscode . commands . executeCommand (
39
- "vscode.open" ,
40
- vscode . Uri . parse (
41
- "https://github.com/sqls-server/sqls?tab=readme-ov-file#installation" ,
42
- ) ,
43
- ) ;
44
- vscode . window
45
- . createOutputChannel ( "sqlsurge" )
46
- . appendLine ( "sqls is not installed." ) ;
47
- return ;
48
- default :
49
- vscode . window
50
- . createOutputChannel ( "sqlsurge" )
51
- . appendLine ( "sqls is not installed." ) ;
52
- return ;
53
- }
54
-
55
- // check again
56
- sqlsInPATH = await findSqlsInPath ( ) ;
57
- if ( ! sqlsInPATH ) {
58
- throw new Error ( "sqls should be installed but not found in PATH" ) ;
59
- }
28
+ showSqlsNotFoundMessage ( ) ;
29
+ return ;
60
30
}
61
31
62
32
const serverOptions : ServerOptions = {
@@ -74,6 +44,37 @@ export async function startSqlsClient() {
74
44
logger . info ( "[startSqlsClient]" , "Started sqls client." ) ;
75
45
}
76
46
47
+ export async function restartLanguageServer ( ) {
48
+ logger . debug ( "[restartLanguageServer]" , "Restarting SQL language server..." ) ;
49
+ if ( ! client ) {
50
+ await startSqlsClient ( ) ;
51
+ return ;
52
+ }
53
+
54
+ const sqlsInPATH = await findSqlsInPath ( ) ;
55
+ if ( ! sqlsInPATH ) {
56
+ showSqlsNotFoundMessage ( ) ;
57
+ return ;
58
+ }
59
+
60
+ if ( client . state === State . Stopped ) {
61
+ await client . start ( ) ;
62
+ logger . debug ( "[restartLanguageServer]" , "Started SQL language server." ) ;
63
+ }
64
+ if ( client . state === State . Running ) {
65
+ await client . restart ( ) ;
66
+ logger . debug ( "[restartLanguageServer]" , "Restarted SQL language server." ) ;
67
+ }
68
+
69
+ vscode . window . showInformationMessage (
70
+ "Successfully restarted SQL language server." ,
71
+ ) ;
72
+ logger . info (
73
+ "[restartLanguageServer]" ,
74
+ "Successfully restarted SQL language server." ,
75
+ ) ;
76
+ }
77
+
77
78
export async function findSqlsInPath ( ) : Promise < vscode . Uri | undefined > {
78
79
const path = process . env . PATH ;
79
80
if ( ! path ) {
@@ -83,22 +84,49 @@ export async function findSqlsInPath(): Promise<vscode.Uri | undefined> {
83
84
const sqlsFileName = process . platform === "win32" ? "sqls.exe" : "sqls" ;
84
85
for ( const dir of path . split ( delimiter ) ) {
85
86
const sqls = vscode . Uri . joinPath ( vscode . Uri . file ( dir ) , sqlsFileName ) ;
86
- if ( await fileExists ( sqls ) ) {
87
+ if ( await existsFile ( sqls ) ) {
87
88
return sqls ;
88
89
}
89
90
}
90
91
91
92
return ;
92
93
}
93
94
94
- async function fileExists ( path : vscode . Uri ) {
95
- try {
96
- await vscode . workspace . fs . stat ( path ) ;
97
- return true ;
98
- } catch ( err : any ) {
99
- if ( err . code === "ENOENT" || err . code === "FileNotFound" ) {
100
- return false ;
101
- }
102
- throw err ;
95
+ async function existsFile ( path : vscode . Uri ) {
96
+ return vscode . workspace . fs . stat ( path ) . then (
97
+ ( ) => true ,
98
+ ( err ) => {
99
+ logger . debug ( "[existsFile]" , err ) ;
100
+ if ( err . code === "ENOENT" || err . code === "FileNotFound" ) {
101
+ return false ;
102
+ }
103
+ throw err ;
104
+ } ,
105
+ ) ;
106
+ }
107
+
108
+ async function showSqlsNotFoundMessage ( ) {
109
+ // not found sqls, install sqls automatically
110
+ const action = await vscode . window . showInformationMessage (
111
+ "sqls is not installed yet or not found in PATH. Install sqls to enable SQL language features." ,
112
+ "Install with command" ,
113
+ "Install manually (Jump to the installation guide)" ,
114
+ ) ;
115
+ switch ( action ) {
116
+ case "Install with command" :
117
+ await vscode . commands . executeCommand ( "sqlsurge.installSqls" ) ;
118
+ break ;
119
+ case "Install manually (Jump to the installation guide)" :
120
+ await vscode . commands . executeCommand (
121
+ "vscode.open" ,
122
+ vscode . Uri . parse (
123
+ "https://github.com/sqls-server/sqls?tab=readme-ov-file#installation" ,
124
+ ) ,
125
+ ) ;
126
+ logger . info ( "[startSqlsClient]" , "sqls is not installed." ) ;
127
+ return ;
128
+ default :
129
+ logger . info ( "[startSqlsClient]" , "sqls is not installed." ) ;
130
+ return ;
103
131
}
104
132
}
0 commit comments