6
6
"fmt"
7
7
"io"
8
8
"log"
9
+ "os"
9
10
"strconv"
10
11
"strings"
11
12
"sync"
@@ -82,8 +83,18 @@ var yellow = color.New(color.FgHiYellow)
82
83
func (ls * INOLanguageServer ) writeLock (logger jsonrpc.FunctionLogger , requireClangd bool ) {
83
84
ls .dataMux .Lock ()
84
85
logger .Logf (yellow .Sprintf ("write-locked" ))
85
- if requireClangd {
86
- ls .waitClangdStart (logger )
86
+ if requireClangd && ls .Clangd == nil {
87
+ // if clangd is not started...
88
+ logger .Logf ("(throttled: waiting for clangd)" )
89
+ logger .Logf (yellow .Sprintf ("unlocked (waiting clangd)" ))
90
+ ls .clangdStarted .Wait ()
91
+ logger .Logf (yellow .Sprintf ("locked (waiting clangd)" ))
92
+
93
+ if ls .Clangd == nil {
94
+ logger .Logf ("clangd startup failed: quitting Language server" )
95
+ ls .Close ()
96
+ os .Exit (2 )
97
+ }
87
98
}
88
99
}
89
100
@@ -117,23 +128,6 @@ func (ls *INOLanguageServer) readUnlock(logger jsonrpc.FunctionLogger) {
117
128
ls .dataMux .RUnlock ()
118
129
}
119
130
120
- func (ls * INOLanguageServer ) waitClangdStart (logger jsonrpc.FunctionLogger ) error {
121
- if ls .Clangd != nil {
122
- return nil
123
- }
124
-
125
- logger .Logf ("(throttled: waiting for clangd)" )
126
- logger .Logf (yellow .Sprintf ("unlocked (waiting clangd)" ))
127
- ls .clangdStarted .Wait ()
128
- logger .Logf (yellow .Sprintf ("locked (waiting clangd)" ))
129
-
130
- if ls .Clangd == nil {
131
- logger .Logf ("clangd startup failed: aborting call" )
132
- return errors .New ("could not start clangd, aborted" )
133
- }
134
- return nil
135
- }
136
-
137
131
// NewINOLanguageServer creates and configures an Arduino Language Server.
138
132
func NewINOLanguageServer (stdin io.Reader , stdout io.Writer , board Board ) * INOLanguageServer {
139
133
logger := NewLSPFunctionLogger (color .HiWhiteString , "LS: " )
@@ -185,6 +179,8 @@ func NewINOLanguageServer(stdin io.Reader, stdout io.Writer, board Board) *INOLa
185
179
func (ls * INOLanguageServer ) InitializeReqFromIDE (ctx context.Context , logger jsonrpc.FunctionLogger , inoParams * lsp.InitializeParams ) (* lsp.InitializeResult , * jsonrpc.ResponseError ) {
186
180
go func () {
187
181
defer streams .CatchAndLogPanic ()
182
+ // Unlock goroutines waiting for clangd
183
+ defer ls .clangdStarted .Broadcast ()
188
184
189
185
logger := NewLSPFunctionLogger (color .HiCyanString , "INIT --- " )
190
186
logger .Logf ("initializing workbench: %s" , inoParams .RootURI )
@@ -198,6 +194,7 @@ func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger js
198
194
return
199
195
} else if ! success {
200
196
logger .Logf ("bootstrap build failed!" )
197
+ return
201
198
}
202
199
203
200
if err := ls .buildPath .Join ("compile_commands.json" ).CopyTo (ls .compileCommandsDir .Join ("compile_commands.json" )); err != nil {
@@ -249,9 +246,6 @@ func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger js
249
246
return
250
247
}
251
248
252
- // signal that clangd is running now...
253
- ls .clangdStarted .Broadcast ()
254
-
255
249
logger .Logf ("Done initializing workbench" )
256
250
}()
257
251
0 commit comments