Skip to content

Commit 7cac223

Browse files
authored
Fixing fsac stalls (#104)
1 parent de72cf2 commit 7cac223

File tree

2 files changed

+110
-111
lines changed

2 files changed

+110
-111
lines changed

src/Ionide.ProjInfo.ProjectSystem/ProjectSystem.fs

Lines changed: 109 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -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 =

src/Ionide.ProjInfo/Library.fs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,6 @@ type WorkspaceLoaderViaProjectGraph private (toolsPath: ToolsPath) =
434434
let loggers = ProjectLoader.createLoggers allKnownNames generateBinlog sw
435435
bm.BeginBuild(new BuildParameters(Loggers = loggers))
436436
let result = bm.BuildRequest gbr
437-
let foo = bm.PendBuildRequest(gbr)
438437

439438
bm.EndBuild()
440439

@@ -453,9 +452,8 @@ type WorkspaceLoaderViaProjectGraph private (toolsPath: ToolsPath) =
453452
resultsByNode
454453
|> Seq.map
455454
(fun p ->
456-
let foo = ProjectLoader.LoadedProject p.ProjectInstance
457455

458-
p.ProjectInstance.FullPath, ProjectLoader.getLoadedProjectInfo p.ProjectInstance.FullPath customProperties foo)
456+
p.ProjectInstance.FullPath, ProjectLoader.getLoadedProjectInfo p.ProjectInstance.FullPath customProperties (ProjectLoader.LoadedProject p.ProjectInstance))
459457

460458
|> Seq.choose
461459
(fun (projectPath, projectOptionResult) ->

0 commit comments

Comments
 (0)