Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit2277eb2

Browse files
KevinRansombrettfo
authored andcommitted
Fixdotnet#4946 --- Update FSC and FSI to recognize upto .net framework 472 (dotnet#6005)
*Fixdotnet#4946 --- Update FSC and FSI to recognize upto .net framework 472* support really old frameworks* Update test to satisfy net472 as well as earlier versions of dotnet* comparer
1 parent970bf1e commit2277eb2

File tree

5 files changed

+169
-62
lines changed

5 files changed

+169
-62
lines changed

‎src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<NoWarn>$(NoWarn);45;55;62;75;1204</NoWarn>
1010
<AllowCrossTargeting>true</AllowCrossTargeting>
1111
<DefineConstants>$(DefineConstants);COMPILER</DefineConstants>
12+
<DefineConstants>$(DefineConstants);MSBUILD_AT_LEAST_15</DefineConstants>
1213
<OtherFlags>$(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1</OtherFlags>
1314
<UseFSharpProductVersion>true</UseFSharpProductVersion>
1415
<UseAssetTargetFallback>true</UseAssetTargetFallback>

‎src/fsharp/MSBuildReferenceResolver.fs‎

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -41,62 +41,52 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
4141
// ATTENTION!: the following code needs to be updated every time we are switching to the new MSBuild version because new .NET framework version was released
4242
// 1. List of frameworks
4343
// 2. DeriveTargetFrameworkDirectoriesFor45Plus
44-
// 3.HighestInstalledNetFrameworkVersion
44+
// 3.HighestInstalledRefAssembliesOrDotNETFramework
4545
// 4. GetPathToDotNetFrameworkImlpementationAssemblies
4646
[<Literal>]
47-
letprivateNet10="v1.0"
47+
letprivateNet45="v4.5"
4848

4949
[<Literal>]
50-
letprivateNet11="v1.1"
50+
letprivateNet451="v4.5.1"
5151

5252
[<Literal>]
53-
letprivateNet20="v2.0"
53+
letprivateNet452="v4.5.2"// not available in Dev15 MSBuild version
5454

5555
[<Literal>]
56-
letprivateNet30="v3.0"
56+
letprivateNet46="v4.6"
5757

5858
[<Literal>]
59-
letprivateNet35="v3.5"
59+
letprivateNet461="v4.6.1"
6060

6161
[<Literal>]
62-
letprivateNet40="v4.0"
62+
letprivateNet462="v4.6.2"
6363

6464
[<Literal>]
65-
letprivateNet45="v4.5"
65+
letprivateNet47="v4.7"
6666

6767
[<Literal>]
68-
letprivateNet451="v4.5.1"
69-
70-
/// The list of supported .NET Framework version numbers, using the monikers of the Reference Assemblies folder.
71-
letSupportedNetFrameworkVersions= set[ Net20; Net30; Net35; Net40; Net45; Net451;(*SL only*)"v5.0"]
72-
73-
//[<Literal>]
74-
//let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version
68+
letprivateNet471="v4.7.1"
7569

76-
#if MSBUILD_AT_LEAST_14
7770
[<Literal>]
78-
letprivateNet46="v4.6"
71+
letprivateNet472="v4.7.2"
7972

80-
[<Literal>]
81-
letprivateNet461="v4.6.1"
82-
#endif
73+
letSupportedDesktopFrameworkVersions=[ Net472; Net471; Net47; Net462; Net461; Net46; Net452; Net451; Net45]
8374

84-
/// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework.
75+
/// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework
8576
/// This is only used to specify the "last resort" path for assembly resolution.
8677
letGetPathToDotNetFrameworkImlpementationAssemblies(v)=
8778
letv=
8879
match vwith
89-
| Net11-> Some TargetDotNetFrameworkVersion.Version11
90-
| Net20-> Some TargetDotNetFrameworkVersion.Version20
91-
| Net30-> Some TargetDotNetFrameworkVersion.Version30
92-
| Net35-> Some TargetDotNetFrameworkVersion.Version35
93-
| Net40-> Some TargetDotNetFrameworkVersion.Version40
9480
| Net45-> Some TargetDotNetFrameworkVersion.Version45
9581
| Net451-> Some TargetDotNetFrameworkVersion.Version451
96-
#ifMSBUILD_AT_LEAST_14
97-
//| Net452 -> Some TargetDotNetFrameworkVersion.Version452 // not available in Dev15 MSBuild version
82+
#ifMSBUILD_AT_LEAST_15
83+
| Net452-> Some TargetDotNetFrameworkVersion.Version452
9884
| Net46-> Some TargetDotNetFrameworkVersion.Version46
9985
| Net461-> Some TargetDotNetFrameworkVersion.Version461
86+
| Net462-> Some TargetDotNetFrameworkVersion.Version462
87+
| Net47-> Some TargetDotNetFrameworkVersion.Version47
88+
| Net471-> Some TargetDotNetFrameworkVersion.Version471
89+
| Net472-> Some TargetDotNetFrameworkVersion.Version472
10090
#endif
10191
|_->assertfalse; None
10292
match vwith
@@ -106,7 +96,6 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
10696
| x->[x]
10797
|_->[]
10898

109-
11099
letGetPathToDotNetFrameworkReferenceAssemblies(version)=
111100
#if NETSTANDARD1_6|| NETSTANDARD2_0
112101
ignore version
@@ -118,41 +107,59 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
118107
| x->[x]
119108
#endif
120109

121-
/// Use MSBuild to determine the version of the highest installed framework.
122-
letHighestInstalledNetFrameworkVersion()=
123-
try
124-
#if MSBUILD_AT_LEAST_14
125-
if box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461))<>nullthen Net461
126-
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version46))<>nullthen Net46
127-
// 4.5.2 enumeration is not available in Dev15 MSBuild version
128-
//elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452)) <> null then Net452
129-
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451))<>nullthen Net451
110+
/// Use MSBuild to determine the version of the highest installed set of reference assemblies, failing that grab the highest installed framework version
111+
letHighestInstalledRefAssembliesOrDotNETFramework()=
112+
letgetHighestInstalledDotNETFramework()=
113+
try
114+
// The Mono build still uses an ancient version of msbuild from around Dev 14
115+
#if MSBUILD_AT_LEAST_15
116+
if box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version472))<>nullthen Net472
117+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version471))<>nullthen Net471
118+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version47))<>nullthen Net47
119+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version462))<>nullthen Net462
120+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461))<>nullthen Net461
121+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461))<>nullthen Net461
122+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version46))<>nullthen Net46
123+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452))<>nullthen Net452
124+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451))<>nullthen Net451
130125
#else
131-
if box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451))<>nullthen Net451
126+
if box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451))<>nullthen Net451
127+
#endif
128+
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version45))<>nullthen Net45
129+
else Net45// version is 4.5 assumed since this code is running.
130+
with_-> Net45
131+
132+
#if!FX_RESHAPED_REFLECTION
133+
// 1. First look to see if we can find the highest installed set of dotnet reference assemblies, if yes then select that framework
134+
// 2. Otherwise ask msbuild for the highestinstalled framework
135+
letcheckFrameworkForReferenceAssemblies(dotNetVersion:string)=
136+
ifnot(String.IsNullOrEmpty(dotNetVersion))then
137+
try
138+
letv=if dotNetVersion.StartsWith("v")then dotNetVersion.Substring(1)else dotNetVersion
139+
letframeworkName=new System.Runtime.Versioning.FrameworkName(".NETFramework",new Version(v))
140+
match ToolLocationHelper.GetPathToReferenceAssemblies(frameworkName)|> Seq.tryHeadwith
141+
| Some p->if Directory.Exists(p)thentrueelsefalse
142+
| None->false
143+
with_->false
144+
elsefalse
145+
match SupportedDesktopFrameworkVersions|> Seq.tryFind(fun v-> checkFrameworkForReferenceAssemblies v)with
146+
| Some v-> v
147+
| None-> getHighestInstalledDotNETFramework()
148+
#else
149+
getHighestInstalledDotNETFramework()
132150
#endif
133-
elif box(ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version45))<>nullthen Net45
134-
else Net45// version is 4.5 assumed since this code is running.
135-
with_-> Net45
136151

137-
/// Derive the target framework directories.
152+
/// Derive the target framework directories.
138153
letDeriveTargetFrameworkDirectories(targetFrameworkVersion:string,logMessage)=
139154

140155
lettargetFrameworkVersion=
141156
ifnot(targetFrameworkVersion.StartsWith("v",StringComparison.Ordinal))then"v"+targetFrameworkVersion
142157
else targetFrameworkVersion
143158

144-
letresult=
145-
if targetFrameworkVersion.StartsWith(Net10, StringComparison.Ordinal)then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v1.0.3705"])
146-
elif targetFrameworkVersion.StartsWith(Net11, StringComparison.Ordinal)then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v1.1.4322"])
147-
elif targetFrameworkVersion.StartsWith(Net20, StringComparison.Ordinal)then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v2.0.50727"])
148-
elif targetFrameworkVersion.StartsWith(Net30, StringComparison.Ordinal)then ReplaceVariablesForLegacyFxOnWindows([@"{ReferenceAssemblies}\v3.0";@"{WindowsFramework}\v3.0";@"{WindowsFramework}\v2.0.50727"])
149-
elif targetFrameworkVersion.StartsWith(Net35, StringComparison.Ordinal)then ReplaceVariablesForLegacyFxOnWindows([@"{ReferenceAssemblies}\v3.5";@"{WindowsFramework}\v3.5";@"{ReferenceAssemblies}\v3.0";@"{WindowsFramework}\v3.0";@"{WindowsFramework}\v2.0.50727"])
150-
else GetPathToDotNetFrameworkReferenceAssemblies(targetFrameworkVersion)
151-
152-
letresult= result|> Array.ofList
153-
logMessage(sprintf"Derived target framework directories for version%s are:%s" targetFrameworkVersion(String.Join(",", result)))
159+
letresult= GetPathToDotNetFrameworkReferenceAssemblies(targetFrameworkVersion)|> Array.ofList
160+
logMessage(sprintf"Derived target framework directories for version%s are:%s" targetFrameworkVersion(String.Join(",", result)))
154161
result
155-
162+
156163
/// Describes the location where the reference was found, used only for debug and tooltip output
157164
typeResolvedFrom=
158165
| AssemblyFolders
@@ -364,7 +371,7 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
364371

365372
letResolver=
366373
{new ReferenceResolver.Resolverwith
367-
member__.HighestInstalledNetFrameworkVersion()=HighestInstalledNetFrameworkVersion()
374+
member__.HighestInstalledNetFrameworkVersion()=HighestInstalledRefAssembliesOrDotNETFramework()
368375
member__.DotNetFrameworkReferenceAssembliesRootDirectory= DotNetFrameworkReferenceAssembliesRootDirectory
369376

370377
/// Perform the resolution on rooted and unrooted paths, and then combine the results.

‎src/utils/reshapedmsbuild.fs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ module internal MsBuildAdapters =
8585
| Version46=7
8686
| Version461=8
8787
| Version452=9
88+
| Version462=10
89+
| Version47=11
90+
| Version471=12
91+
| Version472=13
8892
| VersionLatest=8//TargetDotNetFrameworkVersion.Version461
8993

9094
/// <summary>
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
2+
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
3+
// Copyright (c) Microsoft Corporation. All rights reserved.
4+
5+
6+
7+
// Metadata version: v4.0.30319
8+
.assembly extern mscorlib
9+
{
10+
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
11+
.ver 4:0:0:0
12+
}
13+
.assembly extern FSharp.Core
14+
{
15+
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
16+
.ver 4:5:0:0
17+
}
18+
.assembly ValueTupleAliasConstructor
19+
{
20+
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32,
21+
int32,
22+
int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 )
23+
24+
// --- The following custom attribute is added automatically, do not uncomment -------
25+
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 00 00 00 00 00 )
26+
27+
.hash algorithm 0x00008004
28+
.ver 0:0:0:0
29+
}
30+
.mresource public FSharpSignatureData.ValueTupleAliasConstructor
31+
{
32+
// Offset: 0x00000000 Length: 0x000001EA
33+
}
34+
.mresource public FSharpOptimizationData.ValueTupleAliasConstructor
35+
{
36+
// Offset: 0x000001F0 Length: 0x00000061
37+
}
38+
.module ValueTupleAliasConstructor.exe
39+
// MVID: {5C136441-E59F-7FAD-A745-03834164135C}
40+
.imagebase 0x00400000
41+
.file alignment 0x00000200
42+
.stackreserve 0x00100000
43+
.subsystem 0x0003 // WINDOWS_CUI
44+
.corflags 0x00000001 // ILONLY
45+
// Image base: 0x01150000
46+
47+
48+
// =============== CLASS MEMBERS DECLARATION ===================
49+
50+
.class public abstract auto ansi sealed ValueTupleAliasConstructor
51+
extends [mscorlib]System.Object
52+
{
53+
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
54+
} // end of class ValueTupleAliasConstructor
55+
56+
.class private abstract auto ansi sealed '<StartupCode$ValueTupleAliasConstructor>'.$ValueTupleAliasConstructor
57+
extends [mscorlib]System.Object
58+
{
59+
.field static assembly int32 init@
60+
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )
61+
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
62+
.custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
63+
.method public static void main@() cil managed
64+
{
65+
.entrypoint
66+
// Code size 9 (0x9)
67+
.maxstack 8
68+
.language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}'
69+
.line 3,3 : 9,22 'c:\\kevinransom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\Tuples\\ValueTupleAliasConstructor.fs'
70+
IL_0000: ldc.i4.2
71+
IL_0001: ldc.i4.2
72+
IL_0002: newobj instance void valuetype [mscorlib]System.ValueTuple`2<int32,int32>::.ctor(!0,
73+
!1)
74+
IL_0007: pop
75+
IL_0008: ret
76+
} // end of method $ValueTupleAliasConstructor::main@
77+
78+
} // end of class '<StartupCode$ValueTupleAliasConstructor>'.$ValueTupleAliasConstructor
79+
80+
81+
// =============================================================
82+
83+
// *********** DISASSEMBLY COMPLETE ***********************

‎tests/fsharpqa/testenv/src/ILComparer/Program.fs‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ open System.IO
33

44
[<EntryPoint>]
55
letmain(argv:string array)=
6-
letfn1= argv.[0]
7-
letfn2= argv.[1]
8-
96
// Read file into an array
107
letFile2List(filename:string)=
118
use s=new StreamReader(filename)
@@ -16,9 +13,6 @@ let main (argv : string array) =
1613
ifnot isblank_or_commentthen l<- List.append l( line::[])
1714
l
1815

19-
letf1= File2List fn1
20-
letf2= File2List fn2
21-
2216
let reccompareAux(f1:string list)(f2:string list)i=
2317
match f1, f2with
2418
| a:: resta, b:: restb->
@@ -73,4 +67,22 @@ let main (argv : string array) =
7367
printfn"%s"(e.ToString())
7468
false
7569

76-
exit(if compare f1 f2then0else1)
70+
letfn1= argv.[0]
71+
letfn2= argv.[1]
72+
letfn3= argv.[0]+".net47"
73+
74+
letf2= File2List fn2
75+
76+
// Check to see if fn1+".net47" exists, if so check this baseline first if not equal then check fn1 baseline
77+
// the fn1 + ".net47" baseline exists in the rare case where il produced has changed for example valuetuple moved form system.valuetuple.dll to mscorlib.dll, making baselines tricky
78+
letresult=
79+
if File.Exists(fn3)then
80+
letf3= File2List fn3
81+
if compare f3 f2then0else1
82+
else
83+
1
84+
if result=0then
85+
exit0
86+
else
87+
letf1= File2List fn1
88+
exit(if compare f1 f2then0else1)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp