@@ -149,15 +149,30 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
149
149
inoURI = p .TextDocument .URI
150
150
log .Printf ("--> didOpen(%s@%d as '%s')" , p .TextDocument .URI , p .TextDocument .Version , p .TextDocument .LanguageID )
151
151
152
- res , err := handler .didOpen (ctx , p )
153
-
154
- if res == nil {
152
+ if res , e := handler .didOpen (p ); e != nil {
153
+ params = nil
154
+ err = e
155
+ } else if res == nil {
155
156
log .Println (" --X notification is not propagated to clangd" )
156
- return nil , err // do not propagate to clangd
157
+ return nil , nil // do not propagate to clangd
158
+ } else {
159
+ log .Printf (" --> didOpen(%s@%d as '%s')" , res .TextDocument .URI , res .TextDocument .Version , p .TextDocument .LanguageID )
160
+ params = res
157
161
}
158
162
159
- log .Printf (" --> didOpen(%s@%d as '%s')" , res .TextDocument .URI , res .TextDocument .Version , p .TextDocument .LanguageID )
160
- params = res
163
+ case * lsp.DidCloseTextDocumentParams :
164
+ // Method: "textDocument/didClose"
165
+ inoURI = p .TextDocument .URI
166
+ log .Printf ("--> didClose(%s)" , p .TextDocument .URI )
167
+
168
+ if res , e := handler .didClose (p ); e != nil {
169
+ } else if res == nil {
170
+ log .Println (" --X notification is not propagated to clangd" )
171
+ return nil , nil // do not propagate to clangd
172
+ } else {
173
+ log .Printf (" --> didClose(%s)" , res .TextDocument .URI )
174
+ params = res
175
+ }
161
176
162
177
case * lsp.DidChangeTextDocumentParams :
163
178
// notification "textDocument/didChange"
@@ -243,6 +258,18 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
243
258
cppURI = p .TextDocument .URI
244
259
log .Printf (" --> formatting(%s)" , p .TextDocument .URI )
245
260
261
+ case * lsp.DocumentRangeFormattingParams :
262
+ // Method: "textDocument/rangeFormatting"
263
+ log .Printf ("--> %s(%s:%s)" , req .Method , p .TextDocument .URI , p .Range )
264
+ inoURI = p .TextDocument .URI
265
+ if cppParams , e := handler .ino2cppDocumentRangeFormattingParams (p ); e == nil {
266
+ params = cppParams
267
+ cppURI = cppParams .TextDocument .URI
268
+ log .Printf (" --> %s(%s:%s)" , req .Method , cppParams .TextDocument .URI , cppParams .Range )
269
+ } else {
270
+ err = e
271
+ }
272
+
246
273
case * lsp.TextDocumentPositionParams :
247
274
// Method: "textDocument/signatureHelp"
248
275
// Method: "textDocument/definition"
@@ -259,27 +286,23 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
259
286
err = e
260
287
}
261
288
262
- case * lsp.DidSaveTextDocumentParams : // "textDocument/didSave":
263
- log . Printf ( "--X " + req . Method )
264
- return nil , nil
289
+ case * lsp.DidSaveTextDocumentParams :
290
+ // Method: "textDocument/didSave"
291
+ log . Printf ( "--> %s(%s)" , req . Method , p . TextDocument . URI )
265
292
inoURI = p .TextDocument .URI
266
293
p .TextDocument , err = handler .ino2cppTextDocumentIdentifier (p .TextDocument )
267
- case * lsp.DidCloseTextDocumentParams : // "textDocument/didClose":
268
- log .Printf ("--X " + req .Method )
269
- return nil , nil
270
- // uri = p.TextDocument.URI
271
- // err = handler.sketchToBuildPathTextDocumentIdentifier(&p.TextDocument)
272
- // handler.deleteFileData(uri)
294
+ cppURI = p .TextDocument .URI
295
+ if cppURI .AsPath ().EquivalentTo (handler .buildSketchCpp ) {
296
+ log .Printf (" --| didSave not forwarded to clangd" )
297
+ return nil , nil
298
+ }
299
+ log .Printf (" --> %s(%s)" , req .Method , p .TextDocument .URI )
300
+
273
301
case * lsp.ReferenceParams : // "textDocument/references":
274
302
log .Printf ("--X " + req .Method )
275
303
return nil , nil
276
304
inoURI = p .TextDocument .URI
277
305
_ , err = handler .ino2cppTextDocumentPositionParams (& p .TextDocumentPositionParams )
278
- case * lsp.DocumentRangeFormattingParams : // "textDocument/rangeFormatting":
279
- log .Printf ("--X " + req .Method )
280
- return nil , nil
281
- inoURI = p .TextDocument .URI
282
- err = handler .ino2cppDocumentRangeFormattingParams (p )
283
306
case * lsp.DocumentOnTypeFormattingParams : // "textDocument/onTypeFormatting":
284
307
log .Printf ("--X " + req .Method )
285
308
return nil , nil
@@ -516,7 +539,7 @@ func startClangd(compileCommandsDir, sketchCpp *paths.Path) (io.WriteCloser, io.
516
539
}
517
540
}
518
541
519
- func (handler * InoHandler ) didOpen (ctx context. Context , inoDidOpen * lsp.DidOpenTextDocumentParams ) (* lsp.DidOpenTextDocumentParams , error ) {
542
+ func (handler * InoHandler ) didOpen (inoDidOpen * lsp.DidOpenTextDocumentParams ) (* lsp.DidOpenTextDocumentParams , error ) {
520
543
// Add the TextDocumentItem in the tracked files list
521
544
inoItem := inoDidOpen .TextDocument
522
545
handler .docs [inoItem .URI ] = & inoItem
@@ -541,6 +564,32 @@ func (handler *InoHandler) didOpen(ctx context.Context, inoDidOpen *lsp.DidOpenT
541
564
}, err
542
565
}
543
566
567
+ func (handler * InoHandler ) didClose (inoDidClose * lsp.DidCloseTextDocumentParams ) (* lsp.DidCloseTextDocumentParams , error ) {
568
+ inoIdentifier := inoDidClose .TextDocument
569
+ if _ , exist := handler .docs [inoIdentifier .URI ]; exist {
570
+ delete (handler .docs , inoIdentifier .URI )
571
+ } else {
572
+ log .Printf (" didClose of untracked document: %s" , inoIdentifier .URI )
573
+ return nil , unknownURI (inoIdentifier .URI )
574
+ }
575
+
576
+ // If we are tracking a .ino...
577
+ if inoIdentifier .URI .Ext () == ".ino" {
578
+ handler .sketchTrackedFilesCount --
579
+ log .Printf (" decreasing .ino tracked files count: %d" , handler .sketchTrackedFilesCount )
580
+
581
+ // notify clang that sketchCpp has been close only once all .ino are closed
582
+ if handler .sketchTrackedFilesCount != 0 {
583
+ return nil , nil
584
+ }
585
+ }
586
+
587
+ cppIdentifier , err := handler .ino2cppTextDocumentIdentifier (inoIdentifier )
588
+ return & lsp.DidCloseTextDocumentParams {
589
+ TextDocument : cppIdentifier ,
590
+ }, err
591
+ }
592
+
544
593
func (handler * InoHandler ) ino2cppTextDocumentItem (inoItem lsp.TextDocumentItem ) (cppItem lsp.TextDocumentItem , err error ) {
545
594
cppURI , err := handler .ino2cppDocumentURI (inoItem .URI )
546
595
if err != nil {
@@ -771,14 +820,30 @@ func (handler *InoHandler) ino2cppTextDocumentPositionParams(inoParams *lsp.Text
771
820
}, nil
772
821
}
773
822
774
- func (handler * InoHandler ) ino2cppDocumentRangeFormattingParams (params * lsp.DocumentRangeFormattingParams ) error {
775
- panic ("not implemented" )
776
- // handler.sketchToBuildPathTextDocumentIdentifier(¶ms.TextDocument)
777
- // if data, ok := handler.data[params.TextDocument.URI]; ok {
778
- // params.Range = data.sourceMap.InoToCppLSPRange(data.sourceURI, params.Range)
779
- // return nil
780
- // }
781
- return unknownURI (params .TextDocument .URI )
823
+ func (handler * InoHandler ) ino2cppRange (inoURI lsp.DocumentURI , inoRange lsp.Range ) (lsp.DocumentURI , lsp.Range , error ) {
824
+ cppURI , err := handler .ino2cppDocumentURI (inoURI )
825
+ if err != nil {
826
+ return "" , lsp.Range {}, err
827
+ }
828
+ if cppURI .AsPath ().EquivalentTo (handler .buildSketchCpp ) {
829
+ cppRange := handler .sketchMapper .InoToCppLSPRange (inoURI , inoRange )
830
+ return cppURI , cppRange , nil
831
+ }
832
+ return cppURI , inoRange , nil
833
+ }
834
+
835
+ func (handler * InoHandler ) ino2cppDocumentRangeFormattingParams (inoParams * lsp.DocumentRangeFormattingParams ) (* lsp.DocumentRangeFormattingParams , error ) {
836
+ cppTextDocument , err := handler .ino2cppTextDocumentIdentifier (inoParams .TextDocument )
837
+ if err != nil {
838
+ return nil , err
839
+ }
840
+
841
+ _ , cppRange , err := handler .ino2cppRange (inoParams .TextDocument .URI , inoParams .Range )
842
+ return & lsp.DocumentRangeFormattingParams {
843
+ TextDocument : cppTextDocument ,
844
+ Range : cppRange ,
845
+ Options : inoParams .Options ,
846
+ }, err
782
847
}
783
848
784
849
func (handler * InoHandler ) ino2cppDocumentOnTypeFormattingParams (params * lsp.DocumentOnTypeFormattingParams ) error {
0 commit comments