From 4f803124a1784f48d6549384e7ef939db7458fd9 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 30 Sep 2017 18:24:29 +0300 Subject: [PATCH 1/7] ProjectCracker returns *.fsi files in FSharpProjectOptions.SourceFiles array (in addition to *.fs files, in right order) --- .../ProjectCracker.fs | 8 ++- tests/service/ProjectOptionsTests.fs | 13 ++++ tests/service/data/FsAndFsiFiles.fsproj | 63 +++++++++++++++++++ 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 tests/service/data/FsAndFsiFiles.fsproj diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs index 462c749f2d..a96eacdded 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs @@ -16,11 +16,15 @@ type ProjectCracker = let enableLogging = defaultArg enableLogging true let logMap = ref Map.empty - let rec convert (opts: Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCrackerTool.ProjectOptions) : FSharpProjectOptions = + let rec convert (opts: ProjectCrackerTool.ProjectOptions) : FSharpProjectOptions = let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions let sourceFiles, otherOptions = - opts.Options |> Array.partition (fun x -> x.IndexOfAny(Path.GetInvalidPathChars()) = -1 && Path.GetExtension(x).ToLower() = ".fs") + opts.Options + |> Array.partition (fun x -> + let extension = Path.GetExtension(x).ToLower() + x.IndexOfAny(Path.GetInvalidPathChars()) = -1 + && (extension = ".fs" || extension = ".fsi")) let sepChar = Path.DirectorySeparatorChar diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 7595d0b08b..9c3e0f2c8f 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -217,6 +217,19 @@ let ``Project file parsing -- Logging``() = else Assert.That(log, Is.StringContaining("""Using "ResolveAssemblyReference" task from assembly "Microsoft.Build.Tasks.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".""")) +[] +let ``Project file parsing -- FSharpProjectOptions.SourceFiles contains both fs and fsi files``() = + let projectFileName = normalizePath (__SOURCE_DIRECTORY__ + @"/data/FsAndFsiFiles.fsproj") + let options, log = ProjectCracker.GetProjectOptionsFromProjectFileLogged(projectFileName, enableLogging=true) + printfn "%A" log + let expectedSourceFiles = + [| "Test1File2.fsi" + "Test1File2.fs" + "Test1File1.fs" + "Test1File0.fsi" + "Test1File0.fs" |] + Assert.That(options.SourceFiles |> Array.map Path.GetFileName, Is.EqualTo expectedSourceFiles, "source files") + [] let ``Project file parsing -- Full path``() = let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/ToolsVersion12.fsproj") diff --git a/tests/service/data/FsAndFsiFiles.fsproj b/tests/service/data/FsAndFsiFiles.fsproj new file mode 100644 index 0000000000..676918f28f --- /dev/null +++ b/tests/service/data/FsAndFsiFiles.fsproj @@ -0,0 +1,63 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {116cc2f9-f987-4b3d-915a-34cac04a73da} + Library + Test1 + Test1 + bin\$(Configuration)\ + False + 11 + + + True + full + False + False + DEBUG;TRACE + 3 + x86 + bin\Debug\Test1.xml + + + pdbonly + True + True + TRACE + 3 + x86 + bin\Release\Test1.xml + False + + + + ..\..\..\packages\Microsoft.Portable.FSharp.Core.4.1.20\lib\profiles\net40\FSharp.Core.dll + + + + + + + + + + + + + + + + + + ..\..\..\packages\NUnit\lib\nunit.framework.dll + True + True + + + + + \ No newline at end of file From f5d7a5dec2fcb418bc38687e2c4475cde8d56ef1 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 30 Sep 2017 18:52:16 +0300 Subject: [PATCH 2/7] ProjectCracker raises exception if ProjectCrackerTool returns non null ProjectCrackerOptions.Error (new field) --- .../ProjectCracker.fs | 6 ++++-- .../ProjectCrackerOptions.fs | 1 + .../ProjectCrackerTool.fs | 9 ++++++--- tests/service/ProjectOptionsTests.fs | 7 +++++-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs index a96eacdded..45fab18685 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs @@ -17,6 +17,8 @@ type ProjectCracker = let logMap = ref Map.empty let rec convert (opts: ProjectCrackerTool.ProjectOptions) : FSharpProjectOptions = + if not (isNull opts.Error) then failwith opts.Error + let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions let sourceFiles, otherOptions = @@ -77,8 +79,8 @@ type ProjectCracker = p.StartInfo.RedirectStandardOutput <- true ignore <| p.Start() - let ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof) - let opts = ser.ReadObject(p.StandardOutput.BaseStream) :?> Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCrackerTool.ProjectOptions + let ser = new DataContractJsonSerializer(typeof) + let opts = ser.ReadObject(p.StandardOutput.BaseStream) :?> ProjectCrackerTool.ProjectOptions #endif convert opts, !logMap diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerOptions.fs b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerOptions.fs index 34f3aa16e7..71cb966fb1 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerOptions.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerOptions.fs @@ -7,4 +7,5 @@ type ProjectOptions = Options: string[] ReferencedProjectOptions: (string * ProjectOptions)[] LogOutput: string + Error: string } diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs index 639d4d0c2b..9be9c37537 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/ProjectCrackerTool.fs @@ -420,7 +420,8 @@ module internal ProjectCrackerTool = let options = { ProjectFile = file Options = Array.ofSeq (parsedProject.Options @ referencedProjectOutputs) ReferencedProjectOptions = referencedProjectOptions - LogOutput = parsedProject.LogOutput } + LogOutput = parsedProject.LogOutput + Error = null } parsedProject.OutputFile, options @@ -465,9 +466,11 @@ module internal ProjectCrackerTool = 2, { ProjectFile = projectFile; Options = [||]; ReferencedProjectOptions = [||]; - LogOutput = e.ToString() } + LogOutput = e.ToString() + Error = e.Message } else 1, { ProjectFile = ""; Options = [||]; ReferencedProjectOptions = [||]; - LogOutput = "At least two arguments required." } + LogOutput = "At least two arguments required." + Error = null } diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 9c3e0f2c8f..bf91417268 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -137,8 +137,11 @@ let ``Project file parsing -- compile files 2``() = [] let ``Project file parsing -- bad project file``() = let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/Malformed.fsproj") - let log = snd (ProjectCracker.GetProjectOptionsFromProjectFileLogged(f)) - log.[f] |> should contain "Microsoft.Build.Exceptions.InvalidProjectFileException" + try + ProjectCracker.GetProjectOptionsFromProjectFileLogged(f) |> ignore + failwith "Expected exception" + with + | e -> Assert.That(e.Message, Contains.Substring "The project file could not be loaded.") [] let ``Project file parsing -- non-existent project file``() = From bcb860addb446b8f493d3895bd14699421e98b37 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 30 Sep 2017 20:59:38 +0300 Subject: [PATCH 3/7] fix build on linux --- fcs/build.fsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fcs/build.fsx b/fcs/build.fsx index 7e2e12f1be..08717a7ab0 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -99,9 +99,9 @@ Target "Test.NetFx" (fun _ -> // -------------------------------------------------------------------------------------- // Build a NuGet package Target "NuGet.NetFx" (fun _ -> - runCmdIn __SOURCE_DIRECTORY__ @"..\.nuget\NuGet.exe" @"pack nuget\FSharp.Compiler.Service.nuspec -OutputDirectory %s" releaseDir - runCmdIn __SOURCE_DIRECTORY__ @"..\.nuget\NuGet.exe" @"pack nuget\FSharp.Compiler.Service.MSBuild.v12.nuspec -OutputDirectory %s" releaseDir - runCmdIn __SOURCE_DIRECTORY__ @"..\.nuget\NuGet.exe" @"pack nuget\FSharp.Compiler.Service.ProjectCracker.nuspec -OutputDirectory %s" releaseDir + runCmdIn __SOURCE_DIRECTORY__ "../.nuget/NuGet.exe" @"pack nuget/FSharp.Compiler.Service.nuspec -OutputDirectory %s" releaseDir + runCmdIn __SOURCE_DIRECTORY__ "../.nuget/NuGet.exe" @"pack nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec -OutputDirectory %s" releaseDir + runCmdIn __SOURCE_DIRECTORY__ "../.nuget/NuGet.exe" @"pack nuget/FSharp.Compiler.Service.ProjectCracker.nuspec -OutputDirectory %s" releaseDir ) From 90690399ad5ea92533164b634dba3be57bed0530 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 30 Sep 2017 21:18:00 +0300 Subject: [PATCH 4/7] fix a test --- tests/service/ProjectOptionsTests.fs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index bf91417268..36ff633690 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -140,14 +140,16 @@ let ``Project file parsing -- bad project file``() = try ProjectCracker.GetProjectOptionsFromProjectFileLogged(f) |> ignore failwith "Expected exception" - with - | e -> Assert.That(e.Message, Contains.Substring "The project file could not be loaded.") + with e -> + Assert.That(e.Message, Contains.Substring "The project file could not be loaded.") [] let ``Project file parsing -- non-existent project file``() = let f = normalizePath (__SOURCE_DIRECTORY__ + @"/data/DoesNotExist.fsproj") - let log = snd (ProjectCracker.GetProjectOptionsFromProjectFileLogged(f, enableLogging=true)) - log.[f] |> should contain "System.IO.FileNotFoundException" + try + ProjectCracker.GetProjectOptionsFromProjectFileLogged(f, enableLogging=true) |> ignore + with e -> + Assert.That(e.Message, Contains.Substring "Could not find file") [] let ``Project file parsing -- output file``() = From 1117d23d371d617b1f1b8bfcc44b96cc4eda7107 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 30 Sep 2017 22:50:10 +0300 Subject: [PATCH 5/7] slashes --- fcs/FSharp.Compiler.Service.sln | 4 +++- .../FSharp.Compiler.Service.MSBuild.v12.nuspec | 2 +- .../FSharp.Compiler.Service.ProjectCracker.nuspec | 14 +++++++------- fcs/nuget/FSharp.Compiler.Service.nuspec | 6 +++--- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/fcs/FSharp.Compiler.Service.sln b/fcs/FSharp.Compiler.Service.sln index e1be709379..2fe403a3e3 100644 --- a/fcs/FSharp.Compiler.Service.sln +++ b/fcs/FSharp.Compiler.Service.sln @@ -1,13 +1,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.8 +VisualStudioVersion = 15.0.26730.16 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" ProjectSection(SolutionItems) = preProject build.cmd = build.cmd build.fsx = build.fsx build.sh = build.sh + nuget\FSharp.Compiler.Service.MSBuild.v12.nuspec = nuget\FSharp.Compiler.Service.MSBuild.v12.nuspec nuget\FSharp.Compiler.Service.nuspec = nuget\FSharp.Compiler.Service.nuspec + nuget\FSharp.Compiler.Service.ProjectCracker.nuspec = nuget\FSharp.Compiler.Service.ProjectCracker.nuspec paket.dependencies = paket.dependencies README.md = README.md RELEASE_NOTES.md = RELEASE_NOTES.md diff --git a/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec b/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec index e2fc6d2fd7..9b8cb5a545 100644 --- a/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec @@ -17,6 +17,6 @@ F# compiler services for creating IDE tools, language extensions and for F# embedding. - + diff --git a/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec b/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec index f9275ce232..3974e509c7 100644 --- a/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec @@ -19,13 +19,13 @@ F# compiler services for creating IDE tools, language extensions and for F# embedding. - - - - - - - + + + + + + + diff --git a/fcs/nuget/FSharp.Compiler.Service.nuspec b/fcs/nuget/FSharp.Compiler.Service.nuspec index 5b05dba395..4e3c82b44c 100644 --- a/fcs/nuget/FSharp.Compiler.Service.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.nuspec @@ -25,8 +25,8 @@ - - - + + + From e52ee437748a054bada67f4af652a3d49a82d42c Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 1 Oct 2017 09:54:57 +0300 Subject: [PATCH 6/7] revert slashes --- .../FSharp.Compiler.Service.MSBuild.v12.nuspec | 2 +- .../FSharp.Compiler.Service.ProjectCracker.nuspec | 14 +++++++------- fcs/nuget/FSharp.Compiler.Service.nuspec | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec b/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec index 9b8cb5a545..e2fc6d2fd7 100644 --- a/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec @@ -17,6 +17,6 @@ F# compiler services for creating IDE tools, language extensions and for F# embedding. - + diff --git a/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec b/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec index 3974e509c7..f0f6da96d7 100644 --- a/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec @@ -19,13 +19,13 @@ F# compiler services for creating IDE tools, language extensions and for F# embedding. - - - - - - - + + + + + + + diff --git a/fcs/nuget/FSharp.Compiler.Service.nuspec b/fcs/nuget/FSharp.Compiler.Service.nuspec index 4e3c82b44c..5b05dba395 100644 --- a/fcs/nuget/FSharp.Compiler.Service.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.nuspec @@ -25,8 +25,8 @@ - - - + + + From 03765d0a07a5c780c34b429606330bcba8737a91 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 3 Oct 2017 23:22:49 +0100 Subject: [PATCH 7/7] Update FSharp.Compiler.Service.ProjectCracker.nuspec --- fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec b/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec index f0f6da96d7..f9275ce232 100644 --- a/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec +++ b/fcs/nuget/FSharp.Compiler.Service.ProjectCracker.nuspec @@ -24,7 +24,7 @@ - +