@@ -1030,71 +1030,62 @@ func (ls *INOLanguageServer) TextDocumentDidChangeNotifFromIDE(logger jsonrpc.Fu
1030
1030
logger .Logf ("Tracked SKETCH file:----------+\n " + updatedDoc .Text + "\n ----------------------" )
1031
1031
}
1032
1032
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
1034
1035
var clangParams * lsp.DidChangeTextDocumentParams
1036
+ for _ , ideChange := range ideParams .ContentChanges {
1037
+ if ideChange .Range == nil {
1038
+ panic ("full-text change not implemented" )
1039
+ }
1035
1040
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 )
1039
1042
if err != nil {
1040
1043
logger .Logf ("Error: %s" , err )
1041
1044
return
1042
1045
}
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
1046
1053
}
1047
1054
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
+ }
1049
1059
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" {
1050
1069
// If changes are applied to a .ino file we increment the global .ino.cpp versioning
1051
1070
// for each increment of the single .ino file.
1071
+ clangVersion = ls .sketchMapper .CppText .Version
1072
+ ls .sketchMapper .DebugLogAll ()
1073
+ }
1052
1074
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 ,
1090
1082
}
1091
1083
1092
- logger .Logf ("to Clang: didChange(%s@%d )" , clangParams .TextDocument )
1084
+ logger .Logf ("to Clang: didChange(%s)" , clangParams .TextDocument )
1093
1085
for _ , change := range clangParams .ContentChanges {
1094
1086
logger .Logf (" > %s" , change )
1095
1087
}
1096
1088
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
1098
1089
logger .Logf ("Connection error with clangd server: %v" , err )
1099
1090
logger .Logf ("Please restart the language server." )
1100
1091
ls .Close ()
0 commit comments