From 3b7271afba1eaaaf2e56a545cc914e5a9a37381f Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 27 Dec 2021 11:37:20 +0100 Subject: [PATCH 1/2] When new files are added to the sketch do a complete build to synchronize all files --- ls/builder.go | 23 +++++++++++++++++------ ls/ls.go | 19 ++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/ls/builder.go b/ls/builder.go index f4c2a47..d89470d 100644 --- a/ls/builder.go +++ b/ls/builder.go @@ -27,14 +27,14 @@ import ( type SketchRebuilder struct { ls *INOLanguageServer - trigger chan bool + trigger chan chan<- bool cancel func() mutex sync.Mutex } func NewSketchBuilder(ls *INOLanguageServer) *SketchRebuilder { res := &SketchRebuilder{ - trigger: make(chan bool, 1), + trigger: make(chan chan<- bool, 1), cancel: func() {}, ls: ls, } @@ -45,17 +45,25 @@ func NewSketchBuilder(ls *INOLanguageServer) *SketchRebuilder { return res } +func (ls *INOLanguageServer) triggerRebuildAndWait(logger jsonrpc.FunctionLogger) { + completed := make(chan bool) + ls.sketchRebuilder.TriggerRebuild(completed) + ls.writeUnlock(logger) + <-completed + ls.writeLock(logger, true) +} + func (ls *INOLanguageServer) triggerRebuild() { - ls.sketchRebuilder.TriggerRebuild() + ls.sketchRebuilder.TriggerRebuild(nil) } -func (r *SketchRebuilder) TriggerRebuild() { +func (r *SketchRebuilder) TriggerRebuild(completed chan<- bool) { r.mutex.Lock() defer r.mutex.Unlock() r.cancel() // Stop possibly already running builds select { - case r.trigger <- true: + case r.trigger <- completed: default: } } @@ -63,7 +71,7 @@ func (r *SketchRebuilder) TriggerRebuild() { func (r *SketchRebuilder) rebuilderLoop() { logger := NewLSPFunctionLogger(color.HiMagentaString, "SKETCH REBUILD: ") for { - <-r.trigger + completed := <-r.trigger for { // Concede a 200ms delay to accumulate bursts of changes @@ -90,6 +98,9 @@ func (r *SketchRebuilder) rebuilderLoop() { cancel() r.ls.progressHandler.End("arduinoLanguageServerRebuild", &lsp.WorkDoneProgressEnd{Message: "done"}) + if completed != nil { + close(completed) + } } } diff --git a/ls/ls.go b/ls/ls.go index 45ddd8b..d0c7c67 100644 --- a/ls/ls.go +++ b/ls/ls.go @@ -961,10 +961,20 @@ func (ls *INOLanguageServer) TextDocumentDidOpenNotifFromIDE(logger jsonrpc.Func ls.writeLock(logger, true) defer ls.writeUnlock(logger) - ls.triggerRebuild() + ideTextDocItem := ideParam.TextDocument + clangURI, _, err := ls.ide2ClangDocumentURI(logger, ideTextDocItem.URI) + if err != nil { + logger.Logf("Error: %s", err) + return + } + + if ls.ideURIIsPartOfTheSketch(ideTextDocItem.URI) { + if !clangURI.AsPath().Exist() { + ls.triggerRebuildAndWait(logger) + } + } // Add the TextDocumentItem in the tracked files list - ideTextDocItem := ideParam.TextDocument ls.trackedIdeDocs[ideTextDocItem.URI.AsPath().String()] = ideTextDocItem // If we are tracking a .ino... @@ -979,11 +989,6 @@ func (ls *INOLanguageServer) TextDocumentDidOpenNotifFromIDE(logger jsonrpc.Func } } - clangURI, _, err := ls.ide2ClangDocumentURI(logger, ideTextDocItem.URI) - if err != nil { - logger.Logf("Error: %s", err) - return - } clangTextDocItem := lsp.TextDocumentItem{ URI: clangURI, } From 073039a50a9f9648fe995de6494ea10faf5b9165 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 3 Jan 2022 17:23:46 +0100 Subject: [PATCH 2/2] Try to filter as much bogus errors as possible Those errors are mostly due to mismatching clang "driver" or missing support for specific embedded CPU architecture. --- ls/ls.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ls/ls.go b/ls/ls.go index d0c7c67..1bd273f 100644 --- a/ls/ls.go +++ b/ls/ls.go @@ -1203,6 +1203,30 @@ func (ls *INOLanguageServer) PublishDiagnosticsNotifFromClangd(logger jsonrpc.Fu } } + // Try to filter as much bogus errors as possible (due to wrong clang "driver" or missing + // support for specific embedded CPU architecture). + for _, ideParams := range allIdeParams { + n := 0 + for _, ideDiag := range ideParams.Diagnostics { + var code string + _ = json.Unmarshal(ideDiag.Code, &code) + switch code { + case "": + // Filter unkown non-string codes + case "drv_unknown_argument_with_suggestion": + // Skip errors like: "Unknown argument '-mlongcalls'; did you mean '-mlong-calls'?" + case "drv_unknown_argument": + // Skip errors like: "Unknown argument: '-mtext-section-literals'" + default: + ideParams.Diagnostics[n] = ideDiag + n++ + continue + } + logger.Logf("filtered out diagnostic with error-code: %s", ideDiag.Code) + } + ideParams.Diagnostics = ideParams.Diagnostics[:n] + } + // Push back to IDE the converted diagnostics logger.Logf("diagnostics to IDE:") for _, ideParams := range allIdeParams {