@@ -7,6 +7,7 @@ import Preferences
77
88protocol CodeiumLSP {
99 func sendRequest< E: CodeiumRequestType > ( _ endpoint: E ) async throws -> E . Response
10+ func terminate( )
1011}
1112
1213final class CodeiumLanguageServer {
@@ -57,44 +58,42 @@ final class CodeiumLanguageServer {
5758
5859 func start( ) {
5960 guard !process. isRunning else { return }
60- port = nil
6161 do {
6262 try process. run ( )
6363
64- Task {
64+ Task { @ MainActor in
6565 func findPort( ) -> String ? {
6666 // find a file in managerDirectoryURL whose name looks like a port, return the
6767 // name if found
6868 let fileManager = FileManager . default
69- let enumerator = fileManager. enumerator (
70- at: managerDirectoryURL,
71- includingPropertiesForKeys: nil
72- )
73- while let fileURL = enumerator? . nextObject ( ) as? URL {
74- if fileURL. lastPathComponent. range (
69+ guard let filePaths = try ? fileManager
70+ . contentsOfDirectory ( atPath: managerDirectoryURL. path) else { return nil }
71+ for path in filePaths {
72+ let filename = URL ( fileURLWithPath: path) . lastPathComponent
73+ if filename. range (
7574 of: #"^\d+$"# ,
7675 options: . regularExpression
7776 ) != nil {
78- return fileURL . lastPathComponent
77+ return filename
7978 }
8079 }
8180 return nil
8281 }
8382
8483 try await Task . sleep ( nanoseconds: 2_000_000 )
85- port = findPort ( )
8684 var waited = 0
8785
8886 while true {
89- try await Task . sleep ( nanoseconds: 1_000_000_000 )
9087 waited += 1
9188 if let port = findPort ( ) {
9289 finishStarting ( port: port)
9390 return
9491 }
9592 if waited >= 60 {
9693 process. terminate ( )
94+ return
9795 }
96+ try await Task . sleep ( nanoseconds: 1_000_000_000 )
9897 }
9998 }
10099 } catch {
@@ -121,6 +120,14 @@ final class CodeiumLanguageServer {
121120 self . port = port
122121 launchHandler ? ( )
123122 }
123+
124+ func terminate( ) {
125+ process. terminationHandler = nil
126+ if process. isRunning {
127+ process. terminate ( )
128+ }
129+ transport. close ( )
130+ }
124131}
125132
126133extension CodeiumLanguageServer : CodeiumLSP {
@@ -205,27 +212,27 @@ final class IOTransport {
205212 }
206213
207214 private func setupFileHandleHandlers( ) {
208- stdoutPipe. fileHandleForReading. readabilityHandler = { [ unowned self] handle in
215+ stdoutPipe. fileHandleForReading. readabilityHandler = { [ weak self] handle in
209216 let data = handle. availableData
210217
211218 guard !data. isEmpty else {
212219 return
213220 }
214221
215222 if UserDefaults . shared. value ( for: \. codeiumVerboseLog) {
216- self . forwardDataToHandler ( data)
223+ self ? . forwardDataToHandler ( data)
217224 }
218225 }
219226
220- stderrPipe. fileHandleForReading. readabilityHandler = { [ unowned self] handle in
227+ stderrPipe. fileHandleForReading. readabilityHandler = { [ weak self] handle in
221228 let data = handle. availableData
222229
223230 guard !data. isEmpty else {
224231 return
225232 }
226233
227234 if UserDefaults . shared. value ( for: \. codeiumVerboseLog) {
228- self . forwardErrorDataToHandler ( data)
235+ self ? . forwardErrorDataToHandler ( data)
229236 }
230237 }
231238 }
0 commit comments