diff --git a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr index ce460b72dec..daa7eae6d65 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr @@ -28,7 +28,6 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp" file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.targets" file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.Targets" file source="$(BinariesFolder)\net40\bin\Microsoft.Portable.FSharp.Targets" - file source="$(FSharpTreeRoot)\vsintegration\src\SupportedRuntimes\SupportedRuntimes.xml" file source="$(BinariesFolder)\net40\bin\System.Collections.Immutable.dll" file source="$(BinariesFolder)\net40\bin\System.Reflection.Metadata.dll" file source="$(BinariesFolder)\net40\bin\System.ValueTuple.dll" diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index 469c9172ded..33bb1245c6e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -211,64 +211,63 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem member this.ListAvailableFSharpCoreVersions(_) = Array.empty } let service = - match Internal.Utilities.FSharpEnvironment.BinFolderOfDefaultFSharpCompiler(None) with - | None -> nullService - | Some path -> - try - let supportedRuntimesXml = System.Xml.Linq.XDocument.Load(Path.Combine(path, "SupportedRuntimes.xml")) - let tryGetAttr (el : System.Xml.Linq.XElement) attr = - match el.Attribute(System.Xml.Linq.XName.Get attr) with - | null -> None - | x -> Some x.Value - let flatList = - supportedRuntimesXml.Root.Elements(System.Xml.Linq.XName.Get "TargetFramework") - |> Seq.choose (fun tf -> - match tryGetAttr tf "Identifier", tryGetAttr tf "Version", tryGetAttr tf "Profile" with - | Some key1, Some key2, _ - | Some key1, _, Some key2 -> - Some( - key1, // identifier - key2, // version or profile - [| - for asm in tf.Elements(System.Xml.Linq.XName.Get "Assembly") do - let version = asm.Attribute(System.Xml.Linq.XName.Get "Version") - let description = asm.Attribute(System.Xml.Linq.XName.Get "Description") - match version, description with - | null, _ | _, null -> () - | version, description -> - yield Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpCoreVersion(version.Value, description.Value) - |] - ) - | _ -> None - ) - - |> Seq.toList - let (_, _, v2) = flatList |> List.find(fun (k1, k2, _) -> k1 = FSharpSDKHelper.NETFramework && k2 = FSharpSDKHelper.v20) - let (_, _, v4) = flatList |> List.find(fun (k1, k2, _) -> k1 = FSharpSDKHelper.NETFramework && k2 = FSharpSDKHelper.v40) - let (_, _, v45) = flatList |> List.find(fun (k1, k2, _) -> k1 = FSharpSDKHelper.NETFramework && k2 = FSharpSDKHelper.v45) - { - new Microsoft.VisualStudio.FSharp.ProjectSystem.IFSharpCoreVersionLookupService with - member this.ListAvailableFSharpCoreVersions(targetFramework) = - if targetFramework.Identifier = FSharpSDKHelper.NETFramework - then - // for .NETFramework we distinguish between 2.0, 4.0 and 4.5 - if targetFramework.Version.Major < 4 then v2 - elif targetFramework.Version.Major = 4 && targetFramework.Version.Minor < 5 then v4 - else v45 - else - // for other target frameworks we assume that they are distinguished by the profile - let result = - flatList - |> List.tryPick(fun (k1, k2, list) -> - if k1 = targetFramework.Identifier && k2 = targetFramework.Profile then Some list else None - ) - match result with - | Some list -> list - | None -> - Debug.Assert(false, sprintf "Unexpected target framework identifier '%O'" targetFramework) - [||] - } - with _ -> nullService + try + // SupportedRuntimes is deployed alongside the ProjectSystem dll + let path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + let supportedRuntimesXml = System.Xml.Linq.XDocument.Load(Path.Combine(path, "SupportedRuntimes.xml")) + let tryGetAttr (el : System.Xml.Linq.XElement) attr = + match el.Attribute(System.Xml.Linq.XName.Get attr) with + | null -> None + | x -> Some x.Value + let flatList = + supportedRuntimesXml.Root.Elements(System.Xml.Linq.XName.Get "TargetFramework") + |> Seq.choose (fun tf -> + match tryGetAttr tf "Identifier", tryGetAttr tf "Version", tryGetAttr tf "Profile" with + | Some key1, Some key2, _ + | Some key1, _, Some key2 -> + Some( + key1, // identifier + key2, // version or profile + [| + for asm in tf.Elements(System.Xml.Linq.XName.Get "Assembly") do + let version = asm.Attribute(System.Xml.Linq.XName.Get "Version") + let description = asm.Attribute(System.Xml.Linq.XName.Get "Description") + match version, description with + | null, _ | _, null -> () + | version, description -> + yield Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpCoreVersion(version.Value, description.Value) + |] + ) + | _ -> None + ) + + |> Seq.toList + let (_, _, v2) = flatList |> List.find(fun (k1, k2, _) -> k1 = FSharpSDKHelper.NETFramework && k2 = FSharpSDKHelper.v20) + let (_, _, v4) = flatList |> List.find(fun (k1, k2, _) -> k1 = FSharpSDKHelper.NETFramework && k2 = FSharpSDKHelper.v40) + let (_, _, v45) = flatList |> List.find(fun (k1, k2, _) -> k1 = FSharpSDKHelper.NETFramework && k2 = FSharpSDKHelper.v45) + { + new Microsoft.VisualStudio.FSharp.ProjectSystem.IFSharpCoreVersionLookupService with + member this.ListAvailableFSharpCoreVersions(targetFramework) = + if targetFramework.Identifier = FSharpSDKHelper.NETFramework + then + // for .NETFramework we distinguish between 2.0, 4.0 and 4.5 + if targetFramework.Version.Major < 4 then v2 + elif targetFramework.Version.Major = 4 && targetFramework.Version.Minor < 5 then v4 + else v45 + else + // for other target frameworks we assume that they are distinguished by the profile + let result = + flatList + |> List.tryPick(fun (k1, k2, list) -> + if k1 = targetFramework.Identifier && k2 = targetFramework.Profile then Some list else None + ) + match result with + | Some list -> list + | None -> + Debug.Assert(false, sprintf "Unexpected target framework identifier '%O'" targetFramework) + [||] + } + with _ -> nullService (this :> IServiceContainer).AddService(typeof, service, promote = true) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index d13771315c9..786ea003f64 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -37,6 +37,7 @@ +