@@ -27,14 +27,14 @@ import (
2727
2828type SketchRebuilder struct {
2929 ls * INOLanguageServer
30- trigger chan bool
30+ trigger chan chan <- bool
3131 cancel func ()
3232 mutex sync.Mutex
3333}
3434
3535func 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+
4856func (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
6371func (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
0 commit comments