@@ -27,14 +27,14 @@ import (
27
27
28
28
type SketchRebuilder struct {
29
29
ls * INOLanguageServer
30
- trigger chan bool
30
+ trigger chan chan <- bool
31
31
cancel func ()
32
32
mutex sync.Mutex
33
33
}
34
34
35
35
func NewSketchBuilder (ls * INOLanguageServer ) * SketchRebuilder {
36
36
res := & SketchRebuilder {
37
- trigger : make (chan bool , 1 ),
37
+ trigger : make (chan chan <- bool , 1 ),
38
38
cancel : func () {},
39
39
ls : ls ,
40
40
}
@@ -45,25 +45,33 @@ func NewSketchBuilder(ls *INOLanguageServer) *SketchRebuilder {
45
45
return res
46
46
}
47
47
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
+
48
56
func (ls * INOLanguageServer ) triggerRebuild () {
49
- ls .sketchRebuilder .TriggerRebuild ()
57
+ ls .sketchRebuilder .TriggerRebuild (nil )
50
58
}
51
59
52
- func (r * SketchRebuilder ) TriggerRebuild () {
60
+ func (r * SketchRebuilder ) TriggerRebuild (completed chan <- bool ) {
53
61
r .mutex .Lock ()
54
62
defer r .mutex .Unlock ()
55
63
56
64
r .cancel () // Stop possibly already running builds
57
65
select {
58
- case r .trigger <- true :
66
+ case r .trigger <- completed :
59
67
default :
60
68
}
61
69
}
62
70
63
71
func (r * SketchRebuilder ) rebuilderLoop () {
64
72
logger := NewLSPFunctionLogger (color .HiMagentaString , "SKETCH REBUILD: " )
65
73
for {
66
- <- r .trigger
74
+ completed := <- r .trigger
67
75
68
76
for {
69
77
// Concede a 200ms delay to accumulate bursts of changes
@@ -90,6 +98,9 @@ func (r *SketchRebuilder) rebuilderLoop() {
90
98
91
99
cancel ()
92
100
r .ls .progressHandler .End ("arduinoLanguageServerRebuild" , & lsp.WorkDoneProgressEnd {Message : "done" })
101
+ if completed != nil {
102
+ close (completed )
103
+ }
93
104
}
94
105
}
95
106
0 commit comments