@@ -28,6 +28,38 @@ import * as ic from "./incrementalCompilation";
28
28
import config , { extensionConfiguration } from "./config" ;
29
29
import { projectsFiles } from "./projectFiles" ;
30
30
31
+ const notificationLevelMap = new Map ( [
32
+ [ "error" , p . MessageType . Error ] ,
33
+ [ "warning" , p . MessageType . Warning ] ,
34
+ [ "info" , p . MessageType . Info ] ,
35
+ [ "log" , p . MessageType . Log ]
36
+ ] )
37
+
38
+ /**
39
+ * Sends an LSP log notification that will appear in the ReScript Language Server Output window in VSCode.
40
+ * Other LSP clients will also receive this notification,
41
+ * as we utilize LanguageClient in the VSCode extension, providing this functionality at no extra cost.
42
+ */
43
+ function sendLogNotification ( level : p . MessageType , message : string ) {
44
+ const currentLogLevel = notificationLevelMap . get ( config . extensionConfiguration . logLevel ) || p . MessageType . Info ;
45
+
46
+ if ( currentLogLevel >= level ) {
47
+ const logMessageParams : p . LogMessageParams = {
48
+ type : level ,
49
+ message
50
+ }
51
+ const notificationMessage : p . NotificationMessage = {
52
+ method : "window/logMessage" ,
53
+ jsonrpc : c . jsonrpcVersion ,
54
+ params : logMessageParams
55
+ }
56
+
57
+ if ( send ) {
58
+ send ( notificationMessage ) ;
59
+ }
60
+ }
61
+ }
62
+
31
63
// This holds client capabilities specific to our extension, and not necessarily
32
64
// related to the LS protocol. It's for enabling/disabling features that might
33
65
// work in one client, like VSCode, but perhaps not in others, like vim.
@@ -54,18 +86,18 @@ let stupidFileContentCache: Map<string, string> = new Map();
54
86
let codeActionsFromDiagnostics : codeActions . filesCodeActions = { } ;
55
87
56
88
// will be properly defined later depending on the mode (stdio/node-rpc)
57
- let send : ( msg : p . Message ) => void = ( _ ) => { } ;
89
+ let send : ( msg : p . Message ) => void = ( _ ) => { } ;
58
90
59
91
let findRescriptBinary = ( projectRootPath : p . DocumentUri | null ) =>
60
92
config . extensionConfiguration . binaryPath == null
61
93
? lookup . findFilePathFromProjectRoot (
62
- projectRootPath ,
63
- path . join ( c . nodeModulesBinDir , c . rescriptBinName )
64
- )
94
+ projectRootPath ,
95
+ path . join ( c . nodeModulesBinDir , c . rescriptBinName )
96
+ )
65
97
: utils . findBinary (
66
- config . extensionConfiguration . binaryPath ,
67
- c . rescriptBinName
68
- ) ;
98
+ config . extensionConfiguration . binaryPath ,
99
+ c . rescriptBinName
100
+ ) ;
69
101
70
102
let createInterfaceRequest = new v . RequestType <
71
103
p . TextDocumentIdentifier ,
@@ -332,9 +364,9 @@ let openedFile = (fileUri: string, fileContent: string) => {
332
364
message :
333
365
config . extensionConfiguration . binaryPath == null
334
366
? `Can't find ReScript binary in ${ path . join (
335
- projectRootPath ,
336
- c . nodeModulesBinDir
337
- ) } or parent directories. Did you install it? It's required to use "rescript" > 9.1`
367
+ projectRootPath ,
368
+ c . nodeModulesBinDir
369
+ ) } or parent directories. Did you install it? It's required to use "rescript" > 9.1`
338
370
: `Can't find ReScript binary in the directory ${ config . extensionConfiguration . binaryPath } ` ,
339
371
} ,
340
372
} ;
@@ -418,6 +450,7 @@ export default function listen(useStdio = false) {
418
450
send = ( msg : p . Message ) => process . send ! ( msg ) ;
419
451
process . on ( "message" , onMessage ) ;
420
452
}
453
+ utils . setSendLogNotification ( sendLogNotification ) ;
421
454
}
422
455
423
456
function hover ( msg : p . RequestMessage ) {
@@ -1158,15 +1191,15 @@ function onMessage(msg: p.Message) {
1158
1191
inlayHintProvider : config . extensionConfiguration . inlayHints ?. enable ,
1159
1192
codeLensProvider : config . extensionConfiguration . codeLens
1160
1193
? {
1161
- workDoneProgress : false ,
1162
- }
1194
+ workDoneProgress : false ,
1195
+ }
1163
1196
: undefined ,
1164
1197
signatureHelpProvider : config . extensionConfiguration . signatureHelp
1165
1198
?. enabled
1166
1199
? {
1167
- triggerCharacters : [ "(" ] ,
1168
- retriggerCharacters : [ "=" , "," ] ,
1169
- }
1200
+ triggerCharacters : [ "(" ] ,
1201
+ retriggerCharacters : [ "=" , "," ] ,
1202
+ }
1170
1203
: undefined ,
1171
1204
} ,
1172
1205
} ;
@@ -1177,6 +1210,8 @@ function onMessage(msg: p.Message) {
1177
1210
} ;
1178
1211
initialized = true ;
1179
1212
1213
+ sendLogNotification ( p . MessageType . Info , `LSP Server started!` )
1214
+
1180
1215
// Periodically pull configuration from the client.
1181
1216
pullConfigurationPeriodically = setInterval ( ( ) => {
1182
1217
askForAllCurrentConfiguration ( ) ;
0 commit comments