Skip to content

Commit 5446598

Browse files
committed
Completed refactoring of didChange message handler
1 parent a684850 commit 5446598

File tree

1 file changed

+38
-47
lines changed

1 file changed

+38
-47
lines changed

Diff for: ls/ls.go

+38-47
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)