Skip to content

Commit 83683e1

Browse files
authored
Merge branch 'main' into patch-2
2 parents fca5208 + 15e6c34 commit 83683e1

File tree

12 files changed

+184
-8
lines changed

12 files changed

+184
-8
lines changed

UseLocalCompiler.Directory.Build.props

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<Project>
22
<PropertyGroup>
3+
<LoadLocalFSharpBuild Condition="'$(LoadLocalFSharpBuild)' == ''">False</LoadLocalFSharpBuild>
4+
35
<LocalFSharpCompilerConfiguration Condition="'$(LocalFSharpCompilerConfiguration)' == ''">Release</LocalFSharpCompilerConfiguration>
46

57
<LocalFSharpCompilerPath Condition=" '$(LocalFSharpCompilerPath)' == '' ">$(MSBuildThisFileDirectory)</LocalFSharpCompilerPath>
@@ -12,7 +14,9 @@
1214

1315
<FSharpPreferNetFrameworkTools>False</FSharpPreferNetFrameworkTools>
1416
<FSharpPrefer64BitTools>True</FSharpPrefer64BitTools>
17+
</PropertyGroup>
1518

19+
<PropertyGroup Condition="'$(LoadLocalFSharpBuild)' == 'True'">
1620
<LocalFSharpBuildBinPath>$(LocalFSharpCompilerPath)/artifacts/bin/fsc/$(LocalFSharpCompilerConfiguration)/net9.0</LocalFSharpBuildBinPath>
1721
<FSharpBuildAssemblyFile>$(LocalFSharpBuildBinPath)/FSharp.Build.dll</FSharpBuildAssemblyFile>
1822
<FSharpTargetsPath>$(LocalFSharpBuildBinPath)/Microsoft.FSharp.Targets</FSharpTargetsPath>
@@ -21,8 +25,8 @@
2125
<FSharpOverridesTargetsShim>$(LocalFSharpBuildBinPath)/Microsoft.FSharp.Overrides.NetSdk.targets</FSharpOverridesTargetsShim>
2226
</PropertyGroup>
2327

24-
<UsingTask TaskName="FSharpEmbedResourceText" AssemblyFile="$(FSharpBuildAssemblyFile)" Override="true" />
25-
<UsingTask TaskName="FSharpEmbedResXSource" AssemblyFile="$(FSharpBuildAssemblyFile)" Override="true" />
28+
<UsingTask Condition="'$(LoadLocalFSharpBuild)' == 'True'" TaskName="FSharpEmbedResourceText" AssemblyFile="$(FSharpBuildAssemblyFile)" Override="true" />
29+
<UsingTask Condition="'$(LoadLocalFSharpBuild)' == 'True'" TaskName="FSharpEmbedResXSource" AssemblyFile="$(FSharpBuildAssemblyFile)" Override="true" />
2630

2731
<ItemGroup>
2832
<Reference Include="$(LocalFSharpCompilerPath)/artifacts/bin/FSharp.Core/$(LocalFSharpCompilerConfiguration)/netstandard2.0/FSharp.Core.dll" />

docs/release-notes/.FSharp.Compiler.Service/9.0.100.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
### Fixed
22

33
* Compiler hangs when compiling inline recursive invocation ([Issue #17376](https://github.com/dotnet/fsharp/issues/17376), [PR #17394](https://github.com/dotnet/fsharp/pull/17394))
4+
* Fix reporting IsFromComputationExpression only for CE builder type constructors and let bindings. ([PR #17375](https://github.com/dotnet/fsharp/pull/17375))
45

56
### Added
67

docs/release-notes/.FSharp.Core/9.0.100.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### Added
44

55
* Enable C# collection expression support for F# lists & sets. ([Language suggestion #1355](https://github.com/fsharp/fslang-suggestions/issues/1355), [RFC FS-1145 (PR#776)](https://github.com/fsharp/fslang-design/pull/776), [PR #17359](https://github.com/dotnet/fsharp/pull/17359))
6+
* Add module functions for converting between `'T option` and `'T voption`. ([PR #17436](https://github.com/dotnet/fsharp/pull/17436))
67

78
### Changed
89
* Change compiler default setting realsig+ when building assemblies ([Issue #17384](https://github.com/dotnet/fsharp/issues/17384), [PR #17378](https://github.com/dotnet/fsharp/pull/17385))
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### Fixed
2+
3+
### Added
4+
5+
### Changed
6+
7+
### Breaking Changes

src/Compiler/Checking/CheckComputationExpressions.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ let TcComputationExpression (cenv: cenv) env (overallTy: OverallTy) tpenv (mWhol
252252
// An unparameterized custom builder, e.g., `query`, `async`.
253253
| Expr.Val(vref, _, m)
254254
// A parameterized custom builder, e.g., `builder<…>`, `builder ()`.
255-
| Expr.App(funcExpr = Expr.Val(vref, _, m)) ->
255+
| Expr.App(funcExpr = Expr.Val(vref, _, m)) when not vref.IsMember || vref.IsConstructor ->
256256
let item = Item.CustomBuilder(vref.DisplayName, vref)
257257
CallNameResolutionSink cenv.tcSink (m, env.NameEnv, item, emptyTyparInst, ItemOccurence.Use, env.eAccessRights)
258258
valRefEq cenv.g vref cenv.g.query_value_vref

src/FSharp.Core/option.fs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,18 @@ module Option =
178178
| Some x -> x
179179
#endif
180180

181+
[<CompiledName("OfValueOption")>]
182+
let inline ofValueOption (voption: 'T voption) =
183+
match voption with
184+
| ValueNone -> None
185+
| ValueSome x -> Some x
186+
187+
[<CompiledName("ToValueOption")>]
188+
let inline toValueOption (option: 'T option) =
189+
match option with
190+
| None -> ValueNone
191+
| Some x -> ValueSome x
192+
181193
module ValueOption =
182194

183195
[<CompiledName("GetValue")>]
@@ -355,3 +367,15 @@ module ValueOption =
355367
| ValueNone -> null
356368
| ValueSome x -> x
357369
#endif
370+
371+
[<CompiledName("OfOption")>]
372+
let inline ofOption (option: 'T option) =
373+
match option with
374+
| None -> ValueNone
375+
| Some x -> ValueSome x
376+
377+
[<CompiledName("ToOption")>]
378+
let inline toOption (voption: 'T voption) =
379+
match voption with
380+
| ValueNone -> None
381+
| ValueSome x -> Some x

src/FSharp.Core/option.fsi

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,36 @@ module Option =
468468
val inline toObj: value: 'T option -> 'T | null when 'T : not struct (* and 'T : not null *)
469469
#endif
470470

471+
/// <summary>Convert a value option to an option.</summary>
472+
///
473+
/// <param name="voption">The input value option.</param>
474+
///
475+
/// <returns>The resulting option.</returns>
476+
///
477+
/// <example id="ofValueOption-1">
478+
/// <code lang="fsharp">
479+
/// ValueSome 42 |> Option.ofValueOption // evaluates to Some 42
480+
/// (ValueNone: int voption) |> Option.ofValueOption // evaluates to None
481+
/// </code>
482+
/// </example>
483+
[<CompiledName("OfValueOption")>]
484+
val inline ofValueOption: voption: 'T voption -> 'T option
485+
486+
/// <summary>Convert an option to a value option.</summary>
487+
///
488+
/// <param name="option">The input option.</param>
489+
///
490+
/// <returns>The resulting value option.</returns>
491+
///
492+
/// <example id="toValueOption-1">
493+
/// <code lang="fsharp">
494+
/// Some 42 |> Option.toValueOption // evaluates to ValueSome 42
495+
/// (None: int option) |> Option.toValueOption // evaluates to ValueNone
496+
/// </code>
497+
/// </example>
498+
[<CompiledName("ToValueOption")>]
499+
val inline toValueOption: option: 'T option -> 'T voption
500+
471501
/// <summary>Contains operations for working with value options.</summary>
472502
///
473503
/// <category>Options</category>
@@ -926,3 +956,33 @@ module ValueOption =
926956
// TODO NULLNESS: assess this change - is it a breaking change?
927957
val inline toObj: value: 'T voption -> 'T | null when 'T : not struct (* and 'T : not null *)
928958
#endif
959+
960+
/// <summary>Convert an option to a value option.</summary>
961+
///
962+
/// <param name="option">The input option.</param>
963+
///
964+
/// <returns>The resulting value option.</returns>
965+
///
966+
/// <example id="ofOption-1">
967+
/// <code lang="fsharp">
968+
/// Some 42 |> ValueOption.ofOption // evaluates to ValueSome 42
969+
/// (None: int option) |> ValueOption.ofOption // evaluates to ValueNone
970+
/// </code>
971+
/// </example>
972+
[<CompiledName("OfOption")>]
973+
val inline ofOption: option: 'T option -> 'T voption
974+
975+
/// <summary>Convert a value option to an option.</summary>
976+
///
977+
/// <param name="voption">The input value option.</param>
978+
///
979+
/// <returns>The resulting option.</returns>
980+
///
981+
/// <example id="toOption-1">
982+
/// <code lang="fsharp">
983+
/// ValueSome 42 |> ValueOption.toOption // evaluates to Some 42
984+
/// (ValueNone: int voption) |> ValueOption.toOption // evaluates to None
985+
/// </code>
986+
/// </example>
987+
[<CompiledName("ToOption")>]
988+
val inline toOption: voption: 'T voption -> 'T option

tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,20 @@ let _pythags = seqbuilder {{
135135
|> FSharp
136136
|> typecheck
137137
|> shouldSucceed
138+
139+
[<Fact>]
140+
let ``A CE returned from type member succeeds``() =
141+
FSharp """
142+
module ComputationExpressionTests
143+
type Builder () =
144+
member _.Bind(x, f) = f x
145+
member _.Return(x) = x
146+
147+
type A =
148+
static member Prop = Builder ()
149+
150+
let x = A.Prop { return 0 }
151+
"""
152+
|> compile
153+
|> shouldSucceed
154+
|> ignore

tests/FSharp.Compiler.Service.Tests/Symbols.fs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module FSharp.Compiler.Service.Tests.Symbols
22

3-
open System
43
open FSharp.Compiler.CodeAnalysis
54
open FSharp.Compiler.Service.Tests.Common
65
open FSharp.Compiler.Symbols
@@ -1090,19 +1089,32 @@ let builder = Builder ()
10901089
let x = builder { return 3 }
10911090
let y = builder
10921091
let z = Builder () { return 3 }
1092+
1093+
type A () =
1094+
let builder = Builder ()
1095+
let _ = builder { return 3 }
1096+
1097+
static member Builder = Builder ()
1098+
1099+
type System.Object with
1100+
static member Builder = Builder ()
1101+
1102+
let c = A.Builder { return 3 }
1103+
let d = System.Object.Builder { return 3 }
10931104
"""
1105+
shouldEqual checkResults.Diagnostics [||]
10941106

10951107
shouldEqual
10961108
[
10971109
// type Builder () =
10981110
(2, 5), false
10991111

1100-
// … = Builder ()
1101-
(6, 14), false
1102-
11031112
// let builder = …
11041113
(6, 4), false
11051114

1115+
// … = Builder ()
1116+
(6, 14), false
1117+
11061118
// let x = builder { return 3 }
11071119
(8, 8), false // Item.Value _
11081120
(8, 8), true // Item.CustomBuilder _
@@ -1112,9 +1124,37 @@ let z = Builder () { return 3 }
11121124

11131125
// let z = Builder () { return 3 }
11141126
(10, 8), false
1127+
1128+
// let builder = …
1129+
(13, 8), false
1130+
1131+
// … = Builder ()
1132+
(13, 18), false
1133+
1134+
// let x = builder { return 3 }
1135+
(14, 12), false // Item.Value _
1136+
(14, 12), true // Item.CustomBuilder _
1137+
1138+
// static member Builder = …
1139+
(16, 18), false
1140+
1141+
// … = Builder ()
1142+
(16, 28), false
1143+
1144+
// static member Builder = …
1145+
(19, 18), false
1146+
1147+
// … = Builder ()
1148+
(19, 28), false
1149+
1150+
// A.Builder { return 3 }
1151+
(21, 8), false
1152+
1153+
// System.Object.Builder { return 3 }
1154+
(22, 8), false
11151155
]
11161156
[
1117-
for symbolUse in checkResults.GetAllUsesOfAllSymbolsInFile() do
1157+
for symbolUse in checkResults.GetAllUsesOfAllSymbolsInFile() |> Seq.sortBy (fun x -> x.Range.StartLine, x.Range.StartColumn) do
11181158
match symbolUse.Symbol.DisplayName with
11191159
| "Builder" | "builder" -> (symbolUse.Range.StartLine, symbolUse.Range.StartColumn), symbolUse.IsFromComputationExpression
11201160
| _ -> ()

tests/FSharp.Core.UnitTests/FSharp.Core.SurfaceArea.netstandard20.release.bsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,8 +2016,10 @@ Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] Filt
20162016
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[T]])
20172017
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfNullable[T](System.Nullable`1[T])
20182018
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfObj[T](T)
2019+
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfValueOption[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
20192020
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpOption`1[T]], Microsoft.FSharp.Core.FSharpOption`1[T])
20202021
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpOption`1[T], Microsoft.FSharp.Core.FSharpOption`1[T])
2022+
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpValueOption`1[T] ToValueOption[T](Microsoft.FSharp.Core.FSharpOption`1[T])
20212023
Microsoft.FSharp.Core.OptionModule: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpOption`1[T])
20222024
Microsoft.FSharp.Core.OptionModule: T DefaultValue[T](T, Microsoft.FSharp.Core.FSharpOption`1[T])
20232025
Microsoft.FSharp.Core.OptionModule: T DefaultWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,T], Microsoft.FSharp.Core.FSharpOption`1[T])
@@ -2124,6 +2126,7 @@ Microsoft.FSharp.Core.ValueOption: Boolean IsNone[T](Microsoft.FSharp.Core.FShar
21242126
Microsoft.FSharp.Core.ValueOption: Boolean IsSome[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21252127
Microsoft.FSharp.Core.ValueOption: Int32 Count[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21262128
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Collections.FSharpList`1[T] ToList[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
2129+
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpOption`1[T] ToOption[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21272130
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Bind[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpValueOption`1[TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21282131
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map2[T1,T2,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2])
21292132
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map3[T1,T2,T3,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2], Microsoft.FSharp.Core.FSharpValueOption`1[T3])
@@ -2132,6 +2135,7 @@ Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T]
21322135
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpValueOption`1[Microsoft.FSharp.Core.FSharpValueOption`1[T]])
21332136
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfNullable[T](System.Nullable`1[T])
21342137
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfObj[T](T)
2138+
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfOption[T](Microsoft.FSharp.Core.FSharpOption`1[T])
21352139
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpValueOption`1[T]], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21362140
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpValueOption`1[T], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21372141
Microsoft.FSharp.Core.ValueOption: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])

0 commit comments

Comments
 (0)