@@ -1030,71 +1030,62 @@ func (ls *INOLanguageServer) TextDocumentDidChangeNotifFromIDE(logger jsonrpc.Fu
10301030 logger .Logf ("Tracked SKETCH file:----------+\n " + updatedDoc .Text + "\n ----------------------" )
10311031 }
10321032
1033- // If the file is not part of a .ino flie forward the change as-is to clangd
1033+ clangChanges := []lsp.TextDocumentContentChangeEvent {}
1034+ var clangURI * lsp.DocumentURI
10341035 var clangParams * lsp.DidChangeTextDocumentParams
1036+ for _ , ideChange := range ideParams .ContentChanges {
1037+ if ideChange .Range == nil {
1038+ panic ("full-text change not implemented" )
1039+ }
10351040
1036- if ideTextDocIdentifier .URI .Ext () != ".ino" {
1037-
1038- clangTextDocIdentifier , err := ls .ide2ClangVersionedTextDocumentIdentifier (logger , ideTextDocIdentifier )
1041+ clangRangeURI , clangRange , err := ls .ide2ClangRange (logger , ideTextDocIdentifier .URI , * ideChange .Range )
10391042 if err != nil {
10401043 logger .Logf ("Error: %s" , err )
10411044 return
10421045 }
1043- clangParams = & lsp.DidChangeTextDocumentParams {
1044- TextDocument : clangTextDocIdentifier ,
1045- ContentChanges : ideParams .ContentChanges ,
1046+
1047+ // all changes should refer to the same URI
1048+ if clangURI == nil {
1049+ clangURI = & clangRangeURI
1050+ } else if * clangURI != clangRangeURI {
1051+ logger .Logf ("Error: change maps to %s URI, but %s was expected" , clangRangeURI , * clangURI )
1052+ return
10461053 }
10471054
1048- } else {
1055+ // If we are applying changes to a .ino, update the sketchmapper
1056+ if ideTextDocIdentifier .URI .Ext () == ".ino" {
1057+ _ = ls .sketchMapper .ApplyTextChange (ideTextDocIdentifier .URI , ideChange )
1058+ }
10491059
1060+ clangChanges = append (clangChanges , lsp.TextDocumentContentChangeEvent {
1061+ Range : & clangRange ,
1062+ RangeLength : ideChange .RangeLength ,
1063+ Text : ideChange .Text ,
1064+ })
1065+ }
1066+
1067+ clangVersion := ideTextDocIdentifier .Version
1068+ if ideTextDocIdentifier .URI .Ext () == ".ino" {
10501069 // If changes are applied to a .ino file we increment the global .ino.cpp versioning
10511070 // for each increment of the single .ino file.
1071+ clangVersion = ls .sketchMapper .CppText .Version
1072+ ls .sketchMapper .DebugLogAll ()
1073+ }
10521074
1053- clangChanges := []lsp.TextDocumentContentChangeEvent {}
1054- for _ , ideChange := range ideParams .ContentChanges {
1055- var clangChangeRange * lsp.Range
1056- if ideChange .Range != nil {
1057- clangURI , clangRange , err := ls .ide2ClangRange (logger , ideTextDocIdentifier .URI , * ideChange .Range )
1058- if err != nil {
1059- logger .Logf ("Error: %s" , err )
1060- return
1061- }
1062- if ! ls .clangURIRefersToIno (clangURI ) {
1063- logger .Logf ("Error: change to .ino does not maps to a change in sketch.ino.cpp" )
1064- return
1065- }
1066- clangChangeRange = & clangRange
1067-
1068- _ = ls .sketchMapper .ApplyTextChange (ideTextDocIdentifier .URI , ideChange )
1069- ls .sketchMapper .DebugLogAll ()
1070- } else {
1071- panic ("full-text change in .ino not implemented" )
1072- }
1073- clangChanges = append (clangChanges , lsp.TextDocumentContentChangeEvent {
1074- Range : clangChangeRange ,
1075- RangeLength : ideChange .RangeLength ,
1076- Text : ideChange .Text ,
1077- })
1078- }
1079-
1080- // build a cpp equivalent didChange request
1081- clangParams = & lsp.DidChangeTextDocumentParams {
1082- ContentChanges : clangChanges ,
1083- TextDocument : lsp.VersionedTextDocumentIdentifier {
1084- TextDocumentIdentifier : lsp.TextDocumentIdentifier {
1085- URI : lsp .NewDocumentURIFromPath (ls .buildSketchCpp ),
1086- },
1087- Version : ls .sketchMapper .CppText .Version ,
1088- },
1089- }
1075+ // build a cpp equivalent didChange request
1076+ clangParams = & lsp.DidChangeTextDocumentParams {
1077+ TextDocument : lsp.VersionedTextDocumentIdentifier {
1078+ TextDocumentIdentifier : lsp.TextDocumentIdentifier {URI : * clangURI },
1079+ Version : clangVersion ,
1080+ },
1081+ ContentChanges : clangChanges ,
10901082 }
10911083
1092- logger .Logf ("to Clang: didChange(%s@%d )" , clangParams .TextDocument )
1084+ logger .Logf ("to Clang: didChange(%s)" , clangParams .TextDocument )
10931085 for _ , change := range clangParams .ContentChanges {
10941086 logger .Logf (" > %s" , change )
10951087 }
10961088 if err := ls .Clangd .conn .TextDocumentDidChange (clangParams ); err != nil {
1097- // Exit the process and trigger a restart by the client in case of a severe error
10981089 logger .Logf ("Connection error with clangd server: %v" , err )
10991090 logger .Logf ("Please restart the language server." )
11001091 ls .Close ()
0 commit comments