Skip to content

Commit 61872ab

Browse files
committed
Recover opened files
1 parent 65be0ed commit 61872ab

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Foundation
2+
import Preferences
3+
4+
@ServiceActor
5+
final class OpenedFileRecoverableStorage {
6+
let projectRootURL: URL
7+
let userDefault = UserDefaults.shared
8+
let key = "OpenedFileRecoverableStorage"
9+
10+
init(projectRootURL: URL) {
11+
self.projectRootURL = projectRootURL
12+
}
13+
14+
func openFile(fileURL: URL) {
15+
var dict = userDefault.dictionary(forKey: key) ?? [:]
16+
var openedFiles = Set(dict[projectRootURL.path] as? [String] ?? [])
17+
openedFiles.insert(fileURL.path)
18+
dict[projectRootURL.path] = Array(openedFiles)
19+
userDefault.set(dict, forKey: key)
20+
}
21+
22+
func closeFile(fileURL: URL) {
23+
var dict = userDefault.dictionary(forKey: key) ?? [:]
24+
var openedFiles = dict[projectRootURL.path] as? [String] ?? []
25+
openedFiles.removeAll(where: { $0 == fileURL.path })
26+
dict[projectRootURL.path] = openedFiles
27+
userDefault.set(dict, forKey: key)
28+
}
29+
30+
var openedFiles: [URL] {
31+
let dict = userDefault.dictionary(forKey: key) ?? [:]
32+
let openedFiles = dict[projectRootURL.path] as? [String] ?? []
33+
return openedFiles.map { URL(fileURLWithPath: $0) }
34+
}
35+
}
36+

Core/Sources/Service/Workspace.swift

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ final class Workspace {
8080
}
8181

8282
let projectRootURL: URL
83+
let openedFileRecoverableStorage: OpenedFileRecoverableStorage
8384
var lastSuggestionUpdateTime = Environment.now()
8485
var isExpired: Bool {
8586
Environment.now().timeIntervalSince(lastSuggestionUpdateTime) > 60 * 60 * 8
@@ -98,17 +99,7 @@ final class Workspace {
9899
], context: nil
99100
)
100101

101-
private var _suggestionService: SuggestionServiceType? {
102-
didSet {
103-
guard _suggestionService != nil else { return }
104-
Task {
105-
try await Task.sleep(nanoseconds: 1_000_000_000)
106-
for (_, filespace) in filespaces {
107-
notifyOpenFile(filespace: filespace)
108-
}
109-
}
110-
}
111-
}
102+
private var _suggestionService: SuggestionServiceType?
112103

113104
private var suggestionService: SuggestionServiceType? {
114105
// Check if the workspace is disabled.
@@ -149,11 +140,17 @@ final class Workspace {
149140

150141
private init(projectRootURL: URL) {
151142
self.projectRootURL = projectRootURL
143+
openedFileRecoverableStorage = .init(projectRootURL: projectRootURL)
152144

153145
userDefaultsObserver.onChange = { [weak self] in
154146
guard let self else { return }
155147
_ = self.suggestionService
156148
}
149+
150+
let openedFiles = openedFileRecoverableStorage.openedFiles
151+
for fileURL in openedFiles {
152+
_ = createFilespaceIfNeeded(fileURL: fileURL)
153+
}
157154
}
158155

159156
func refreshUpdateTime() {
@@ -364,6 +361,7 @@ extension Workspace {
364361

365362
func notifyOpenFile(filespace: Filespace) {
366363
refreshUpdateTime()
364+
openedFileRecoverableStorage.openFile(fileURL: filespace.fileURL)
367365
Task {
368366
try await suggestionService?.notifyOpenTextDocument(
369367
fileURL: filespace.fileURL,
@@ -401,6 +399,7 @@ extension Workspace {
401399
Task {
402400
try await suggestionService?.notifyCloseTextDocument(fileURL: fileURL)
403401
}
402+
openedFileRecoverableStorage.closeFile(fileURL: fileURL)
404403
filespaces[fileURL] = nil
405404
}
406405
}

0 commit comments

Comments
 (0)