Skip to content

Commit 8bfcdd6

Browse files
authored
Merge branch 'master' into fix-for-issue-8351
2 parents 24b4d28 + 3a067f4 commit 8bfcdd6

58 files changed

Lines changed: 737 additions & 643 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,7 @@
725725
<PackageReference Include="System.Reflection.Metadata" Version="1.6.0" />
726726
<PackageReference Include="System.Buffers" Version="4.5.0" />
727727
<PackageReference Include="System.Memory" Version="4.5.3" />
728-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
728+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
729729
</ItemGroup>
730730
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
731731
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />

src/fsharp/FSharp.Core/map.fs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,43 @@ module MapTree =
218218
mk l sk sv r'
219219
else rebalance l k2 v2 (remove comparer k r)
220220

221+
let rec change (comparer: IComparer<'Key>) k (u: 'Value option -> 'Value option) (m: MapTree<'Key, 'Value>) =
222+
match m with
223+
| MapEmpty ->
224+
match u None with
225+
| None -> m
226+
| Some v -> MapOne (k, v)
227+
| MapOne (k2, v2) ->
228+
let c = comparer.Compare(k, k2)
229+
if c < 0 then
230+
match u None with
231+
| None -> m
232+
| Some v -> MapNode (k, v, MapEmpty, m, 2)
233+
elif c = 0 then
234+
match u (Some v2) with
235+
| None -> MapEmpty
236+
| Some v -> MapOne (k, v)
237+
else
238+
match u None with
239+
| None -> m
240+
| Some v -> MapNode (k, v, m, MapEmpty, 2)
241+
| MapNode (k2, v2, l, r, h) ->
242+
let c = comparer.Compare(k, k2)
243+
if c < 0 then
244+
rebalance (change comparer k u l) k2 v2 r
245+
elif c = 0 then
246+
match u (Some v2) with
247+
| None ->
248+
match l, r with
249+
| MapEmpty, _ -> r
250+
| _, MapEmpty -> l
251+
| _ ->
252+
let sk, sv, r' = spliceOutSuccessor r
253+
mk l sk sv r'
254+
| Some v -> MapNode (k, v, l, r, h)
255+
else
256+
rebalance l k2 v2 (change comparer k u r)
257+
221258
let rec mem (comparer: IComparer<'Key>) k (m: MapTree<'Key, 'Value>) =
222259
match m with
223260
| MapEmpty -> false
@@ -512,6 +549,10 @@ type Map<[<EqualityConditionalOn>]'Key, [<EqualityConditionalOn; ComparisonCondi
512549
#endif
513550
new Map<'Key, 'Value>(comparer, MapTree.add comparer key value tree)
514551

552+
[<Experimental("Experimental library feature, requires '--langversion:preview'")>]
553+
member m.Change(key, f) : Map<'Key, 'Value> =
554+
new Map<'Key, 'Value>(comparer, MapTree.change comparer key f tree)
555+
515556
[<DebuggerBrowsable(DebuggerBrowsableState.Never)>]
516557
member m.IsEmpty = MapTree.isEmpty tree
517558

@@ -729,6 +770,11 @@ module Map =
729770
let add key value (table: Map<_, _>) =
730771
table.Add (key, value)
731772

773+
[<Experimental("Experimental library feature, requires '--langversion:preview'")>]
774+
[<CompiledName("Change")>]
775+
let change key f (table: Map<_, _>) =
776+
table.Change (key, f)
777+
732778
[<CompiledName("Find")>]
733779
let find key (table: Map<_, _>) =
734780
table.[key]

src/fsharp/FSharp.Core/map.fsi

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ namespace Microsoft.FSharp.Collections
2222
/// <returns>The resulting map.</returns>
2323
member Add: key:'Key * value:'Value -> Map<'Key,'Value>
2424

25+
/// <summary>Returns a new map with the value stored under key changed according to f.</summary>
26+
/// <param name="key">The input key.</param>
27+
/// <param name="f">The change function.</param>
28+
/// <returns>The resulting map.</returns>
29+
[<Experimental("Experimental library feature, requires '--langversion:preview'")>]
30+
member Change: key:'Key * f:('Value option -> 'Value option) -> Map<'Key,'Value>
31+
2532
/// <summary>Returns true if there are no bindings in the map.</summary>
2633
member IsEmpty: bool
2734

@@ -86,6 +93,15 @@ namespace Microsoft.FSharp.Collections
8693
[<CompiledName("Add")>]
8794
val add: key:'Key -> value:'T -> table:Map<'Key,'T> -> Map<'Key,'T>
8895

96+
/// <summary>Returns a new map with the value stored under key changed according to f.</summary>
97+
/// <param name="key">The input key.</param>
98+
/// <param name="f">The change function.</param>
99+
/// <param name="table">The input map.</param>
100+
/// <returns>The resulting map.</returns>
101+
[<Experimental("Experimental library feature, requires '--langversion:preview'")>]
102+
[<CompiledName("Change")>]
103+
val change: key:'Key -> f:('T option -> 'T option) -> table:Map<'Key,'T> -> Map<'Key,'T>
104+
89105
/// <summary>Returns a new map made from the given bindings.</summary>
90106
/// <param name="elements">The input list of key/value pairs.</param>
91107
/// <returns>The resulting map.</returns>
@@ -263,4 +279,4 @@ namespace Microsoft.FSharp.Collections
263279

264280
/// <summary>The number of bindings in the map.</summary>
265281
[<CompiledName("Count")>]
266-
val count: table:Map<'Key,'T> -> int
282+
val count: table:Map<'Key,'T> -> int

src/fsharp/LanguageFeatures.fs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ type LanguageVersion (specifiedVersionAsString) =
4646
static let latestMajorVersion = languageVersion47 // Language version when latestmajor specified
4747

4848
static let validOptions = [| "preview"; "default"; "latest"; "latestmajor" |]
49-
static let languageVersions = set [| languageVersion46; languageVersion47 (*; languageVersion50 *) |]
49+
static let languageVersions = set [| languageVersion46; languageVersion47 ; languageVersion50 |]
5050

5151
static let features =
5252
dict [
@@ -58,17 +58,17 @@ type LanguageVersion (specifiedVersionAsString) =
5858

5959
// F# 5.0
6060
LanguageFeature.FixedIndexSlice3d4d, languageVersion50
61-
LanguageFeature.FromEndSlicing, languageVersion50
6261
LanguageFeature.DotlessFloat32Literal, languageVersion50
62+
LanguageFeature.AndBang, languageVersion50
63+
LanguageFeature.NullableOptionalInterop, languageVersion50
64+
LanguageFeature.DefaultInterfaceMemberConsumption, languageVersion50
6365

6466
// F# preview
65-
LanguageFeature.NameOf, previewVersion
67+
LanguageFeature.FromEndSlicing, previewVersion
6668
LanguageFeature.OpenStaticClasses, previewVersion
6769
LanguageFeature.PackageManagement, previewVersion
68-
LanguageFeature.AndBang, previewVersion
69-
LanguageFeature.NullableOptionalInterop, previewVersion
70-
LanguageFeature.DefaultInterfaceMemberConsumption, previewVersion
7170
LanguageFeature.WitnessPassing, previewVersion
71+
LanguageFeature.NameOf, previewVersion
7272
]
7373

7474
let specified =
@@ -80,7 +80,7 @@ type LanguageVersion (specifiedVersionAsString) =
8080
| "latestmajor" -> latestMajorVersion
8181
| "4.6" -> languageVersion46
8282
| "4.7" -> languageVersion47
83-
(* | "5.0" -> languageVersion50 *)
83+
| "5.0" -> languageVersion50
8484
| _ -> 0m
8585

8686
let versionToString v =

tests/Directory.Build.targets

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.targets', '$(MSBuildThisFileDirectory)../'))" />
44

55
<ItemGroup Condition="'$(UnitTestType)' == 'nunit'">
6-
<!-- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkVersion)" /> -->
76
<PackageReference Include="NUnit" Version="$(NUnitVersion)" />
87
<PackageReference Include="NUnit3TestAdapter" Version="$(NUnit3TestAdapterVersion)" />
98
<PackageReference Include="NunitXml.TestLogger" Version="$(NunitXmlTestLoggerVersion)" />
109
</ItemGroup>
1110
<ItemGroup Condition="'$(UnitTestType)' == 'xunit'">
12-
<!-- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkVersion)" /> -->
1311
<PackageReference Include="xunit" Version="$(XUnitVersion)" />
1412
<PackageReference Include="xunit.runner.visualstudio" Version="$(XUnitVersion)" />
1513
<PackageReference Include="NunitXml.TestLogger" Version="$(NunitXmlTestLoggerVersion)" />
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
2+
3+
namespace FSharp.Compiler.ErrorMessages.ComponentTests
4+
5+
open Xunit
6+
open FSharp.Test.Utilities
7+
open FSharp.Compiler.SourceCodeServices
8+
9+
module ``Access Of Type Abbreviation`` =
10+
11+
[<Fact>]
12+
let ``Private type produces warning when trying to export``() =
13+
CompilerAssert.TypeCheckSingleError
14+
"""
15+
module Library =
16+
type private Hidden = Hidden of unit
17+
type Exported = Hidden
18+
"""
19+
FSharpErrorSeverity.Warning
20+
44
21+
(4, 8, 4, 16)
22+
("This construct is deprecated. The type 'Hidden' is less accessible than the value, member or type 'Exported' it is used in." + System.Environment.NewLine + "As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors.")
23+
24+
[<Fact>]
25+
let ``Internal type passes when abbrev is internal``() =
26+
CompilerAssert.Pass
27+
"""
28+
module Library =
29+
type internal Hidden = Hidden of unit
30+
type internal Exported = Hidden
31+
"""
32+
33+
[<Fact>]
34+
let ``Internal type produces warning when trying to export``() =
35+
CompilerAssert.TypeCheckSingleError
36+
"""
37+
module Library =
38+
type internal Hidden = Hidden of unit
39+
type Exported = Hidden
40+
"""
41+
FSharpErrorSeverity.Warning
42+
44
43+
(4, 8, 4, 16)
44+
("This construct is deprecated. The type 'Hidden' is less accessible than the value, member or type 'Exported' it is used in." + System.Environment.NewLine + "As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors.")
45+
46+
[<Fact>]
47+
let ``Private type produces warning when abbrev is internal``() =
48+
CompilerAssert.TypeCheckSingleError
49+
"""
50+
module Library =
51+
type private Hidden = Hidden of unit
52+
type internal Exported = Hidden
53+
"""
54+
FSharpErrorSeverity.Warning
55+
44
56+
(4, 17, 4, 25)
57+
("This construct is deprecated. The type 'Hidden' is less accessible than the value, member or type 'Exported' it is used in." + System.Environment.NewLine + "As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors.")
58+
59+
[<Fact>]
60+
let ``Private type passes when abbrev is private``() =
61+
CompilerAssert.Pass
62+
"""
63+
module Library =
64+
type private Hidden = Hidden of unit
65+
type private Exported = Hidden
66+
"""
67+
68+
[<Fact>]
69+
let ``Default access type passes when abbrev is default``() =
70+
CompilerAssert.Pass
71+
"""
72+
module Library =
73+
type Hidden = Hidden of unit
74+
type Exported = Hidden
75+
"""

tests/fsharp/Compiler/ErrorMessages/AssignmentErrorTests.fs renamed to tests/FSharp.Compiler.ComponentTests/ErrorMessages/AssignmentErrorTests.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
22

3-
namespace FSharp.Compiler.UnitTests
3+
namespace FSharp.Compiler.ErrorMessages.ComponentTests
44

5-
open NUnit.Framework
5+
open Xunit
66
open FSharp.Test.Utilities
77
open FSharp.Compiler.SourceCodeServices
88

9-
[<TestFixture>]
9+
1010
module ``Errors assigning to mutable objects`` =
1111

12-
[<Test>]
12+
[<Fact>]
1313
let ``Assign to immutable error``() =
1414
CompilerAssert.TypeCheckSingleError
1515
"""

tests/fsharp/Compiler/ErrorMessages/ClassesTests.fs renamed to tests/FSharp.Compiler.ComponentTests/ErrorMessages/ClassesTests.fs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
22

3-
namespace FSharp.Compiler.UnitTests
3+
namespace FSharp.Compiler.ErrorMessages.ComponentTests
44

5-
open NUnit.Framework
5+
open Xunit
66
open FSharp.Test.Utilities
77
open FSharp.Compiler.SourceCodeServices
88

9-
[<TestFixture>]
109
module ``Classes`` =
1110

12-
[<Test>]
11+
[<Fact>]
1312
let ``Tuple In Abstract Method``() =
1413
CompilerAssert.TypeCheckWithErrors
1514
"""
@@ -27,7 +26,7 @@ let x =
2726
FSharpErrorSeverity.Error, 783, (6, 9, 6, 19), "At least one override did not correctly implement its corresponding abstract member"
2827
|]
2928

30-
[<Test>]
29+
[<Fact>]
3130
let ``Wrong Arity``() =
3231
CompilerAssert.TypeCheckSingleError
3332
"""
@@ -43,7 +42,7 @@ MyType.MyMember("", 0, 0)
4342
(7, 1, 7, 26)
4443
"A member or object constructor 'MyMember' taking 3 arguments is not accessible from this code location. All accessible versions of method 'MyMember' take 2 arguments."
4544

46-
[<Test>]
45+
[<Fact>]
4746
let ``Method Is Not Static``() =
4847
CompilerAssert.TypeCheckSingleError
4948
"""
@@ -57,7 +56,7 @@ let x = Class1.X()
5756
(5, 9, 5, 17)
5857
"Method or object constructor 'X' is not static"
5958

60-
[<Test>]
59+
[<Fact>]
6160
let ``Matching Method With Same Name Is Not Abstract``() =
6261
CompilerAssert.TypeCheckWithErrors
6362
"""
@@ -75,7 +74,7 @@ let foo =
7574
FSharpErrorSeverity.Error, 783, (6, 11, 6, 14), "At least one override did not correctly implement its corresponding abstract member"
7675
|]
7776

78-
[<Test>]
77+
[<Fact>]
7978
let ``No Matching Abstract Method With Same Name``() =
8079
CompilerAssert.TypeCheckWithErrors
8180
"""
@@ -89,13 +88,13 @@ let x =
8988
}
9089
"""
9190
[|
92-
FSharpErrorSeverity.Error, 767, (8, 14, 8, 34), "The member 'Function' does not correspond to any abstract or virtual method available to override or implement. Maybe you want one of the following:\r\n MyFunction"
91+
FSharpErrorSeverity.Error, 767, (8, 14, 8, 34), "The member 'Function' does not correspond to any abstract or virtual method available to override or implement. Maybe you want one of the following:" + System.Environment.NewLine + " MyFunction"
9392
FSharpErrorSeverity.Error, 17, (8, 19, 8, 27), "The member 'Function : 'a * 'b -> unit' does not have the correct type to override any given virtual method"
94-
FSharpErrorSeverity.Error, 366, (7, 3, 9, 4), "No implementation was given for those members: \r\n\t'abstract member IInterface.MyFunction : int32 * int32 -> unit'\r\n\t'abstract member IInterface.SomeOtherFunction : int32 * int32 -> unit'\r\nNote that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'."
93+
FSharpErrorSeverity.Error, 366, (7, 3, 9, 4), "No implementation was given for those members: " + System.Environment.NewLine + "\t'abstract member IInterface.MyFunction : int32 * int32 -> unit'" + System.Environment.NewLine + "\t'abstract member IInterface.SomeOtherFunction : int32 * int32 -> unit'" + System.Environment.NewLine + "Note that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'."
9594
FSharpErrorSeverity.Error, 783, (7, 9, 7, 19), "At least one override did not correctly implement its corresponding abstract member"
9695
|]
9796

98-
[<Test>]
97+
[<Fact>]
9998
let ``Member Has Multiple Possible Dispatch Slots``() =
10099
CompilerAssert.TypeCheckWithErrors
101100
"""
@@ -108,11 +107,11 @@ type Overload =
108107
override __.Bar _ = 1
109108
"""
110109
[|
111-
FSharpErrorSeverity.Error, 366, (7, 15, 7, 24), "No implementation was given for those members: \r\n\t'abstract member IOverload.Bar : double -> int'\r\n\t'abstract member IOverload.Bar : int -> int'\r\nNote that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'."
112-
FSharpErrorSeverity.Error, 3213, (8, 21, 8, 24), "The member 'Bar<'a0> : 'a0 -> int' matches multiple overloads of the same method.\nPlease restrict it to one of the following:\r\n Bar : double -> int\r\n Bar : int -> int."
110+
FSharpErrorSeverity.Error, 366, (7, 15, 7, 24), "No implementation was given for those members: " + System.Environment.NewLine + "\t'abstract member IOverload.Bar : double -> int'" + System.Environment.NewLine + "\t'abstract member IOverload.Bar : int -> int'" + System.Environment.NewLine + "Note that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'."
111+
FSharpErrorSeverity.Error, 3213, (8, 21, 8, 24), "The member 'Bar<'a0> : 'a0 -> int' matches multiple overloads of the same method.\nPlease restrict it to one of the following:" + System.Environment.NewLine + " Bar : double -> int" + System.Environment.NewLine + " Bar : int -> int."
113112
|]
114113

115-
[<Test>]
114+
[<Fact>]
116115
let ``Do Cannot Have Visibility Declarations``() =
117116
CompilerAssert.ParseWithErrors
118117
"""

0 commit comments

Comments
 (0)