Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion setup/Swix/Microsoft.FSharp.Compiler/Files.swr
Original file line number Diff line number Diff line change
Expand Up @@ -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"
115 changes: 57 additions & 58 deletions vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Microsoft.VisualStudio.FSharp.ProjectSystem.IFSharpCoreVersionLookupService>, service, promote = true)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<Compile Include="MSBuildUtilities.fs" />
<Compile Include="AppConfigHelper.fs" />
<Compile Include="Project.fs" />
<None Include="..\SupportedRuntimes\SupportedRuntimes.xml" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<ItemGroup>
Expand Down