Skip to content

Commit d3def8a

Browse files
authored
Merge pull request #95 from arduino/force_rebuild_on_new_files
Enforce rebuild when files are added to the sketch
2 parents 277add1 + 073039a commit d3def8a

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

Diff for: ls/builder.go

+17-6
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ import (
2727

2828
type SketchRebuilder struct {
2929
ls *INOLanguageServer
30-
trigger chan bool
30+
trigger chan chan<- bool
3131
cancel func()
3232
mutex sync.Mutex
3333
}
3434

3535
func NewSketchBuilder(ls *INOLanguageServer) *SketchRebuilder {
3636
res := &SketchRebuilder{
37-
trigger: make(chan bool, 1),
37+
trigger: make(chan chan<- bool, 1),
3838
cancel: func() {},
3939
ls: ls,
4040
}
@@ -45,25 +45,33 @@ func NewSketchBuilder(ls *INOLanguageServer) *SketchRebuilder {
4545
return res
4646
}
4747

48+
func (ls *INOLanguageServer) triggerRebuildAndWait(logger jsonrpc.FunctionLogger) {
49+
completed := make(chan bool)
50+
ls.sketchRebuilder.TriggerRebuild(completed)
51+
ls.writeUnlock(logger)
52+
<-completed
53+
ls.writeLock(logger, true)
54+
}
55+
4856
func (ls *INOLanguageServer) triggerRebuild() {
49-
ls.sketchRebuilder.TriggerRebuild()
57+
ls.sketchRebuilder.TriggerRebuild(nil)
5058
}
5159

52-
func (r *SketchRebuilder) TriggerRebuild() {
60+
func (r *SketchRebuilder) TriggerRebuild(completed chan<- bool) {
5361
r.mutex.Lock()
5462
defer r.mutex.Unlock()
5563

5664
r.cancel() // Stop possibly already running builds
5765
select {
58-
case r.trigger <- true:
66+
case r.trigger <- completed:
5967
default:
6068
}
6169
}
6270

6371
func (r *SketchRebuilder) rebuilderLoop() {
6472
logger := NewLSPFunctionLogger(color.HiMagentaString, "SKETCH REBUILD: ")
6573
for {
66-
<-r.trigger
74+
completed := <-r.trigger
6775

6876
for {
6977
// Concede a 200ms delay to accumulate bursts of changes
@@ -90,6 +98,9 @@ func (r *SketchRebuilder) rebuilderLoop() {
9098

9199
cancel()
92100
r.ls.progressHandler.End("arduinoLanguageServerRebuild", &lsp.WorkDoneProgressEnd{Message: "done"})
101+
if completed != nil {
102+
close(completed)
103+
}
93104
}
94105
}
95106

Diff for: ls/ls.go

+36-7
Original file line numberDiff line numberDiff line change
@@ -961,10 +961,20 @@ func (ls *INOLanguageServer) TextDocumentDidOpenNotifFromIDE(logger jsonrpc.Func
961961
ls.writeLock(logger, true)
962962
defer ls.writeUnlock(logger)
963963

964-
ls.triggerRebuild()
964+
ideTextDocItem := ideParam.TextDocument
965+
clangURI, _, err := ls.ide2ClangDocumentURI(logger, ideTextDocItem.URI)
966+
if err != nil {
967+
logger.Logf("Error: %s", err)
968+
return
969+
}
970+
971+
if ls.ideURIIsPartOfTheSketch(ideTextDocItem.URI) {
972+
if !clangURI.AsPath().Exist() {
973+
ls.triggerRebuildAndWait(logger)
974+
}
975+
}
965976

966977
// Add the TextDocumentItem in the tracked files list
967-
ideTextDocItem := ideParam.TextDocument
968978
ls.trackedIdeDocs[ideTextDocItem.URI.AsPath().String()] = ideTextDocItem
969979

970980
// If we are tracking a .ino...
@@ -979,11 +989,6 @@ func (ls *INOLanguageServer) TextDocumentDidOpenNotifFromIDE(logger jsonrpc.Func
979989
}
980990
}
981991

982-
clangURI, _, err := ls.ide2ClangDocumentURI(logger, ideTextDocItem.URI)
983-
if err != nil {
984-
logger.Logf("Error: %s", err)
985-
return
986-
}
987992
clangTextDocItem := lsp.TextDocumentItem{
988993
URI: clangURI,
989994
}
@@ -1198,6 +1203,30 @@ func (ls *INOLanguageServer) PublishDiagnosticsNotifFromClangd(logger jsonrpc.Fu
11981203
}
11991204
}
12001205

1206+
// Try to filter as much bogus errors as possible (due to wrong clang "driver" or missing
1207+
// support for specific embedded CPU architecture).
1208+
for _, ideParams := range allIdeParams {
1209+
n := 0
1210+
for _, ideDiag := range ideParams.Diagnostics {
1211+
var code string
1212+
_ = json.Unmarshal(ideDiag.Code, &code)
1213+
switch code {
1214+
case "":
1215+
// Filter unkown non-string codes
1216+
case "drv_unknown_argument_with_suggestion":
1217+
// Skip errors like: "Unknown argument '-mlongcalls'; did you mean '-mlong-calls'?"
1218+
case "drv_unknown_argument":
1219+
// Skip errors like: "Unknown argument: '-mtext-section-literals'"
1220+
default:
1221+
ideParams.Diagnostics[n] = ideDiag
1222+
n++
1223+
continue
1224+
}
1225+
logger.Logf("filtered out diagnostic with error-code: %s", ideDiag.Code)
1226+
}
1227+
ideParams.Diagnostics = ideParams.Diagnostics[:n]
1228+
}
1229+
12011230
// Push back to IDE the converted diagnostics
12021231
logger.Logf("diagnostics to IDE:")
12031232
for _, ideParams := range allIdeParams {

0 commit comments

Comments
 (0)