@@ -59,8 +59,12 @@ type ProjectController(toolsPath: ToolsPath, workspaceLoaderFactory: ToolsPath -
5959 let loadProjects ( projs : list < string * bool >) =
6060 let gbs , nonGbs = projs |> List.partition ( snd) |> fun ( a , b ) -> ( a |> List.map fst, b |> List.map fst)
6161 projs |> List.iter ( fun ( fileName , _ ) -> fileName |> ProjectResponse.ProjectChanged |> notify.Trigger)
62- x.LoadWorkspace( gbs, true )
63- x.LoadWorkspace( nonGbs, false )
62+
63+ if gbs |> Seq.isEmpty |> not then
64+ x.LoadWorkspace( gbs, true )
65+
66+ if nonGbs |> Seq.isEmpty |> not then
67+ x.LoadWorkspace( nonGbs, false )
6468
6569 projectsChanged |> deduplicateBy fst |> Observable.subscribe ( loadProjects)
6670
@@ -87,112 +91,109 @@ type ProjectController(toolsPath: ToolsPath, workspaceLoaderFactory: ToolsPath -
8791
8892 member private x.loadProjects ( files : string list ) ( generateBinlog : bool ) =
8993 async {
90- if files |> Seq.isEmpty then
91- return false
92- else
93- let onChange fn =
94- projectsChanged.OnNext( fn, generateBinlog)
95-
96- let onLoaded p =
97- match p with
98- | ProjectSystemState.Loading projectFileName -> ProjectResponse.ProjectLoading projectFileName |> notify.Trigger
99- | ProjectSystemState.Failed ( projectFileName, error) -> ProjectResponse.ProjectError( projectFileName, error) |> notify.Trigger
100- | ProjectSystemState.Loaded ( opts, extraInfo, projectFiles, isFromCache) ->
101- let response = ProjectCrackerCache.create ( opts, extraInfo, projectFiles)
102- let projectFileName = response.ProjectFileName
103-
104- let project =
105- match projects.TryFind projectFileName with
106- | Some prj -> prj
107- | None ->
108- let proj = new Project( projectFileName, onChange)
109- projects.[ projectFileName] <- proj
110- proj
111-
112- project.Response <- Some response
113-
114- updateState response
115-
116- let responseFiles =
117- response.Items
118- |> List.choose
119- ( function
120- | ProjectViewerItem.Compile ( p, _) -> Some p)
121-
122- let projInfo : ProjectResult =
123- { ProjectFileName = projectFileName
124- ProjectFiles = responseFiles
125- OutFileOpt = response.OutFile
126- References = response.References
127- Extra = response.ExtraInfo
128- ProjectItems = projectFiles
129- Additionals = Map.empty }
130-
131- ProjectResponse.Project( projInfo, isFromCache) |> notify.Trigger
132- | ProjectSystemState.LoadedOther ( extraInfo, projectFiles, fromDpiCache) ->
133- let responseFiles =
134- projectFiles
135- |> List.choose
136- ( function
137- | ProjectViewerItem.Compile ( p, _) -> Some p)
138-
139- let projInfo : ProjectResult =
140- { ProjectFileName = extraInfo.ProjectFileName
141- ProjectFiles = responseFiles
142- OutFileOpt = Some( extraInfo.TargetPath)
143- References = FscArguments.references extraInfo.OtherOptions
144- Extra = extraInfo
145- ProjectItems = projectFiles
146- Additionals = Map.empty }
147-
148- ProjectResponse.Project( projInfo, fromDpiCache) |> notify.Trigger
149-
150-
151- //TODO check full path
152- let projectFileNames = files |> List.map Path.GetFullPath
153-
154- let prjs = projectFileNames |> List.map ( fun projectFileName -> projectFileName, new Project( projectFileName, onChange))
155-
156- for projectFileName, proj in prjs do
157- projects.[ projectFileName] <- proj
158-
159-
160- ProjectResponse.WorkspaceLoad false |> notify.Trigger
161- // this is to delay the project loading notification (of this thread)
162- // after the workspaceload started response returned below in outer async
163- // Make test output repeteable, and notification in correct order
164- match Environment.workspaceLoadDelay () with
165- | delay when delay > TimeSpan.Zero -> do ! Async.Sleep( Environment.workspaceLoadDelay() .TotalMilliseconds |> int)
166- | _ -> ()
167-
168- let loader = workspaceLoaderFactory toolsPath
169-
170- let bindNewOnloaded ( n : WorkspaceProjectState ) : ProjectSystemState option =
171- match n with
172- | WorkspaceProjectState.Loading ( path) -> Some( ProjectSystemState.Loading path)
173- | WorkspaceProjectState.Loaded ( opts, allKNownProjects, isFromCache) ->
174- let fcsOpts = FCS.mapToFSharpProjectOptions opts allKNownProjects
175-
176- match Workspace.extractOptionsDPW fcsOpts with
177- | Ok optsDPW ->
178- let view = ProjectViewer.render optsDPW
179- Some( ProjectSystemState.Loaded( fcsOpts, optsDPW, view.Items, isFromCache))
180- | Error e -> Some( ProjectSystemState.Failed( e.ProjFile, e))
181-
182- | WorkspaceProjectState.Failed ( path, e) ->
183- let error = e
184- Some( ProjectSystemState.Failed( path, error))
185-
186- // loader.Notifications.Add(fun arg -> arg |> bindNewOnloaded |> Option.iter onLoaded)
187-
188- Workspace.loadInBackground onLoaded loader ( prjs |> List.map snd) generateBinlog
189-
190- ProjectResponse.WorkspaceLoad true |> notify.Trigger
191-
192- isWorkspaceReady <- true
193- workspaceReady.Trigger()
194-
195- return true
94+ let onChange fn =
95+ projectsChanged.OnNext( fn, generateBinlog)
96+
97+ let onLoaded p =
98+ match p with
99+ | ProjectSystemState.Loading projectFileName -> ProjectResponse.ProjectLoading projectFileName |> notify.Trigger
100+ | ProjectSystemState.Failed ( projectFileName, error) -> ProjectResponse.ProjectError( projectFileName, error) |> notify.Trigger
101+ | ProjectSystemState.Loaded ( opts, extraInfo, projectFiles, isFromCache) ->
102+ let response = ProjectCrackerCache.create ( opts, extraInfo, projectFiles)
103+ let projectFileName = response.ProjectFileName
104+
105+ let project =
106+ match projects.TryFind projectFileName with
107+ | Some prj -> prj
108+ | None ->
109+ let proj = new Project( projectFileName, onChange)
110+ projects.[ projectFileName] <- proj
111+ proj
112+
113+ project.Response <- Some response
114+
115+ updateState response
116+
117+ let responseFiles =
118+ response.Items
119+ |> List.choose
120+ ( function
121+ | ProjectViewerItem.Compile ( p, _) -> Some p)
122+
123+ let projInfo : ProjectResult =
124+ { ProjectFileName = projectFileName
125+ ProjectFiles = responseFiles
126+ OutFileOpt = response.OutFile
127+ References = response.References
128+ Extra = response.ExtraInfo
129+ ProjectItems = projectFiles
130+ Additionals = Map.empty }
131+
132+ ProjectResponse.Project( projInfo, isFromCache) |> notify.Trigger
133+ | ProjectSystemState.LoadedOther ( extraInfo, projectFiles, fromDpiCache) ->
134+ let responseFiles =
135+ projectFiles
136+ |> List.choose
137+ ( function
138+ | ProjectViewerItem.Compile ( p, _) -> Some p)
139+
140+ let projInfo : ProjectResult =
141+ { ProjectFileName = extraInfo.ProjectFileName
142+ ProjectFiles = responseFiles
143+ OutFileOpt = Some( extraInfo.TargetPath)
144+ References = FscArguments.references extraInfo.OtherOptions
145+ Extra = extraInfo
146+ ProjectItems = projectFiles
147+ Additionals = Map.empty }
148+
149+ ProjectResponse.Project( projInfo, fromDpiCache) |> notify.Trigger
150+
151+
152+ //TODO check full path
153+ let projectFileNames = files |> List.map Path.GetFullPath
154+
155+ let prjs = projectFileNames |> List.map ( fun projectFileName -> projectFileName, new Project( projectFileName, onChange))
156+
157+ for projectFileName, proj in prjs do
158+ projects.[ projectFileName] <- proj
159+
160+
161+ ProjectResponse.WorkspaceLoad false |> notify.Trigger
162+ // this is to delay the project loading notification (of this thread)
163+ // after the workspaceload started response returned below in outer async
164+ // Make test output repeteable, and notification in correct order
165+ match Environment.workspaceLoadDelay () with
166+ | delay when delay > TimeSpan.Zero -> do ! Async.Sleep( Environment.workspaceLoadDelay() .TotalMilliseconds |> int)
167+ | _ -> ()
168+
169+ let loader = workspaceLoaderFactory toolsPath
170+
171+ let bindNewOnloaded ( n : WorkspaceProjectState ) : ProjectSystemState option =
172+ match n with
173+ | WorkspaceProjectState.Loading ( path) -> Some( ProjectSystemState.Loading path)
174+ | WorkspaceProjectState.Loaded ( opts, allKNownProjects, isFromCache) ->
175+ let fcsOpts = FCS.mapToFSharpProjectOptions opts allKNownProjects
176+
177+ match Workspace.extractOptionsDPW fcsOpts with
178+ | Ok optsDPW ->
179+ let view = ProjectViewer.render optsDPW
180+ Some( ProjectSystemState.Loaded( fcsOpts, optsDPW, view.Items, isFromCache))
181+ | Error e -> Some( ProjectSystemState.Failed( e.ProjFile, e))
182+
183+ | WorkspaceProjectState.Failed ( path, e) ->
184+ let error = e
185+ Some( ProjectSystemState.Failed( path, error))
186+
187+ // loader.Notifications.Add(fun arg -> arg |> bindNewOnloaded |> Option.iter onLoaded)
188+
189+ Workspace.loadInBackground onLoaded loader ( prjs |> List.map snd) generateBinlog
190+
191+ ProjectResponse.WorkspaceLoad true |> notify.Trigger
192+
193+ isWorkspaceReady <- true
194+ workspaceReady.Trigger()
195+
196+ return true
196197 }
197198
198199 member private x.LoaderLoop =
0 commit comments