Skip to content

Commit f5d7a5d

Browse files
ProjectCracker raises exception if ProjectCrackerTool returns non null ProjectCrackerOptions.Error (new field)
1 parent 4f80312 commit f5d7a5d

4 files changed

Lines changed: 16 additions & 7 deletions

File tree

fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ type ProjectCracker =
1717
let logMap = ref Map.empty
1818

1919
let rec convert (opts: ProjectCrackerTool.ProjectOptions) : FSharpProjectOptions =
20+
if not (isNull opts.Error) then failwith opts.Error
21+
2022
let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions
2123

2224
let sourceFiles, otherOptions =
@@ -77,8 +79,8 @@ type ProjectCracker =
7779
p.StartInfo.RedirectStandardOutput <- true
7880
ignore <| p.Start()
7981

80-
let ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof<Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCrackerTool.ProjectOptions>)
81-
let opts = ser.ReadObject(p.StandardOutput.BaseStream) :?> Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCrackerTool.ProjectOptions
82+
let ser = new DataContractJsonSerializer(typeof<ProjectCrackerTool.ProjectOptions>)
83+
let opts = ser.ReadObject(p.StandardOutput.BaseStream) :?> ProjectCrackerTool.ProjectOptions
8284
#endif
8385

8486
convert opts, !logMap

fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerOptions.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ type ProjectOptions =
77
Options: string[]
88
ReferencedProjectOptions: (string * ProjectOptions)[]
99
LogOutput: string
10+
Error: string
1011
}

fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,8 @@ module internal ProjectCrackerTool =
420420
let options = { ProjectFile = file
421421
Options = Array.ofSeq (parsedProject.Options @ referencedProjectOutputs)
422422
ReferencedProjectOptions = referencedProjectOptions
423-
LogOutput = parsedProject.LogOutput }
423+
LogOutput = parsedProject.LogOutput
424+
Error = null }
424425

425426
parsedProject.OutputFile, options
426427

@@ -465,9 +466,11 @@ module internal ProjectCrackerTool =
465466
2, { ProjectFile = projectFile;
466467
Options = [||];
467468
ReferencedProjectOptions = [||];
468-
LogOutput = e.ToString() }
469+
LogOutput = e.ToString()
470+
Error = e.Message }
469471
else
470472
1, { ProjectFile = "";
471473
Options = [||];
472474
ReferencedProjectOptions = [||];
473-
LogOutput = "At least two arguments required." }
475+
LogOutput = "At least two arguments required."
476+
Error = null }

tests/service/ProjectOptionsTests.fs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,11 @@ let ``Project file parsing -- compile files 2``() =
137137
[<Test>]
138138
let ``Project file parsing -- bad project file``() =
139139
let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Malformed.fsproj")
140-
let log = snd (ProjectCracker.GetProjectOptionsFromProjectFileLogged(f))
141-
log.[f] |> should contain "Microsoft.Build.Exceptions.InvalidProjectFileException"
140+
try
141+
ProjectCracker.GetProjectOptionsFromProjectFileLogged(f) |> ignore
142+
failwith "Expected exception"
143+
with
144+
| e -> Assert.That(e.Message, Contains.Substring "The project file could not be loaded.")
142145

143146
[<Test>]
144147
let ``Project file parsing -- non-existent project file``() =

0 commit comments

Comments
 (0)