@@ -30,6 +30,7 @@ public class WorkspacePropertyValues {
3030open class WorkspacePlugin {
3131 public private( set) weak var workspace : Workspace ?
3232 public var projectRootURL : URL { workspace? . projectRootURL ?? URL ( fileURLWithPath: " / " ) }
33+ public var workspaceURL : URL { workspace? . workspaceURL ?? projectRootURL }
3334 public var filespaces : [ URL : Filespace ] { workspace? . filespaces ?? [ : ] }
3435
3536 public init ( workspace: Workspace ) {
@@ -57,6 +58,7 @@ public final class Workspace {
5758
5859 var additionalProperties = WorkspacePropertyValues ( )
5960 public internal( set) var plugins = [ ObjectIdentifier: WorkspacePlugin] ( )
61+ public let workspaceURL : URL
6062 public let projectRootURL : URL
6163 public let openedFileRecoverableStorage : OpenedFileRecoverableStorage
6264 public private( set) var lastSuggestionUpdateTime = Environment . now ( )
@@ -84,8 +86,18 @@ public final class Workspace {
8486 plugins [ ObjectIdentifier ( type) ] as? P
8587 }
8688
87- init ( projectRootURL: URL ) {
88- self . projectRootURL = projectRootURL
89+ init ( workspaceURL: URL ) {
90+ self . workspaceURL = workspaceURL
91+ self . projectRootURL = {
92+ var url = workspaceURL
93+ while !FileManager. default. fileIsDirectory ( atPath: url. path) ||
94+ !url. pathExtension. isEmpty
95+ {
96+ url = url. deletingLastPathComponent ( )
97+ }
98+ return url
99+
100+ } ( )
89101 openedFileRecoverableStorage = . init( projectRootURL: projectRootURL)
90102 let openedFiles = openedFileRecoverableStorage. openedFiles
91103 Task { @WorkspaceActor in
@@ -134,7 +146,7 @@ public final class Workspace {
134146 public func closeFilespace( fileURL: URL ) {
135147 filespaces [ fileURL] = nil
136148 }
137-
149+
138150 @WorkspaceActor
139151 public func didUpdateFilespace( fileURL: URL , content: String ) {
140152 guard let filespace = filespaces [ fileURL] else { return }
0 commit comments